PowerShell для управления хранилищем и файловой системой (часть 8)

Опубликовано: 18 Марта, 2023

  • PowerShell для управления хранилищем и файловой системой (часть 2)
  • PowerShell для управления хранилищем и файловой системой (часть 3)
  • PowerShell для управления хранилищем и файловой системой (часть 4)
  • PowerShell для управления хранилищем и файловой системой (часть 5)
  • PowerShell для управления хранилищем и файловой системой (часть 6)
  • PowerShell для управления хранилищем и файловой системой (часть 7)
  • PowerShell для управления хранилищем и файловой системой (часть 11)

До сих пор в этой серии статей я показывал вам, как создать сценарий, который может анализировать состояние различных физических дисков на ваших серверах. Скрипт предоставляет много действительно полезной информации. Он проверяет информацию SMART (если доступна) для каждого диска, а также предоставляет информацию об ошибках чтения, ошибках записи и температуре. У этого скрипта есть только одна маленькая проблема. В нынешнем виде у скрипта есть огромный потенциал для выброса большого количества данных.

Позвольте мне показать вам, что я имею в виду. Вот мой скрипт, как он существует прямо сейчас:

Функция Get-Smart

# Функция для получения информации SMART о диске

{

(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)

}

 

Функция Get-Health

# Функция для получения информации о состоянии диска

{

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

{

$LDisk.FriendlyName

$LDisk.HealthStatus

$LДиск | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature | Флорида

Write-Host ==================

}

}

 

#Тело сценария

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-3", "Hyper-V-4", "Prod1", "Prod2")

Для каждого
($Сервер в $Серверах) {

$ сервер | Поумнеть

Enter-PSSession -имя_компьютера $Server

Получить здоровье

Exit-PSSession

}

В этом скрипте я действительно хотел указать на эту строку:

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-3", "Hyper-V-4", "Prod1", "Prod2")

Это строка кода, которая определяет, какие серверы будут анализироваться. Как видите, я собираюсь проверить работоспособность хранилища на шести серверах. Имейте в виду, что многие организации имеют гораздо больше серверов, чем это. На самом деле в крупных организациях могут быть сотни или даже тысячи серверов. Имея это в виду, взгляните на вывод моего скрипта. Как вы можете видеть на рисунке A, я даже не смог разместить всю статистику с первого сервера на одном экране, не говоря уже о статистике с других моих серверов.

Рисунок A: Этот скрипт выдает много информации.

Итак, что мы можем сделать по этому поводу? Что ж, лучшим вариантом, вероятно, будет применение некоторых фильтров, чтобы отображалась только проблематичная информация. Мы можем скрыть все остальное, чтобы внимание администратора было приковано к действительно важным элементам.

Мы можем сделать это с помощью командлета PowerShell Where-Object. Однако прежде чем мы это сделаем, нам нужно установить некоторые пороговые значения. Начнем с температуры диска. Какую температуру вы считаете проблемной? К сожалению (или к счастью, как посмотреть) у меня нет сильно перегревающихся дисков. Быстрое сканирование температуры моего диска показывает, что средняя температура диска составляет около 35. Имея это в виду, я хочу адаптировать этот скрипт для отображения данных о температуре только для дисков, температура которых выше 35. Имейте в виду, что вы, вероятно, захотите используйте другое значение в своем собственном скрипте. Я просто делаю это в демонстрационных целях.

Итак, имея в виду эту цель, вот модифицированная версия скрипта:

Функция Get-Smart

# Функция для получения информации SMART о диске

{

(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)

}

 

Функция Get-Health

# Функция для получения информации о состоянии диска

{

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

{

$LDisk.FriendlyName

$LDisk.HealthStatus

# $LDisk | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature | Флорида

$LДиск | Get-StorageReliabilityCounter | Где-Объект {$_.Температура -GT 35} | Температура выбора объекта | Флорида

Write-Host ==================

}

}

 

#Тело сценария

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-3", "Hyper-V-4", "Prod1", "Prod2")

ForEach ($Server в $Servers) {

$ сервер | Поумнеть

Enter-PSSession -имя_компьютера $Server

Получить здоровье

Exit-PSSession

}

Вы можете увидеть результат работы этого модифицированного скрипта на рисунке B.

Изображение 4677
Рисунок B: Этот сценарий сообщает данные о температуре только для дисков с температурой выше 35 градусов.

Итак, теперь, когда я показал вам код и вывод скрипта, давайте посмотрим, что я сделал. Как вы, наверное, заметили, я сделал две модификации, как вы можете видеть здесь:

# $LDisk | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature | Флорида

$LДиск | Get-StorageReliabilityCounter | Где-Объект {$_.Температура -GT 35} | Температура выбора объекта | Флорида

Верхняя строка кода почти полностью не изменилась. Я просто добавил знак решетки в начало строки, чтобы закомментировать строку. Другими словами, PowerShell теперь воспринимает эту строку как комментарий, а не как код, который необходимо выполнить. Причина, по которой я это сделал, заключалась в том, что я хотел сохранить исходный код для справочных целей, но не хотел, чтобы код мешал тому, что я пытался сделать.

Во второй строке кода все становится интереснее. Первая часть этой строки кода идентична строке, которую я закомментировал. $LDisk — это переменная, представляющая анализируемый в данный момент диск. Я передаю имя диска командлету Get-StorageReliabilityCounter, чтобы иметь возможность просматривать данные о работоспособности и надежности диска.

Первоначально я выводил общее количество ошибок чтения, общее количество ошибок записи и температуру диска. Однако, как вы видели на рисунке А, вывод получился длинным и утомительным. Вместо командлета Select-Object я использую командлет Where-Object. Поступая таким образом, я могу запретить строке кода делать что-либо еще, пока не будет выполнено определенное условие. В этом случае строка кода не отображает никаких данных, если только температура диска (представленная $_.Temperature) не превышает (-GT) 35 градусов.

Если температура диска превышает 35 градусов, я хочу знать об этом, и именно здесь вступает в действие последняя часть этой команды. Вы заметите, что команда заканчивается на Select-Object Temperature | Флорида Эта часть команды выполняется только в том случае, если температура диска выше 35 градусов, и она будет отображать только данные о температуре, ничего больше. Отображаемые данные отформатированы в виде списка.

Это вызывает пару вопросов. Во-первых, почему я говорю PowerShell для выбора температуры объекта? Ну, если я явно не укажу, что хочу выбрать объект Temperature, PowerShell будет отображать ряд различных статистических данных о работоспособности для каждого перегревающегося диска. В данном конкретном случае меня не интересуют другие статистические данные. Мне нужно знать только температуру диска, поэтому я использую командлет Select-Object Temperature, чтобы отфильтровать всю остальную статистику.

Другой вопрос, который возникает в связи с этим сценарием, заключается в том, что произойдет, если на диске возникнут ошибки чтения или записи? Поскольку скрипт в настоящее время существует, эти ошибки полностью игнорируются. Причина этого в том, что я хотел сосредоточить свое внимание на одном конкретном типе данных, а не усложнять сценарий, одновременно исследуя несколько свойств. Однако в конце концов я доберусь до этого.

Вывод

В этой статье я начал показывать вам, как фильтровать скрипт на основе данных о температуре. Прежде чем закончить эту статью, я хочу сделать несколько вещей. Во-первых, я хочу закончить проверку скрипта, чтобы отфильтровать другие проблемные состояния. Еще я хочу показать вам, как построить двухступенчатый фильтр. Например, если температура диска превышает 35 градусов, вы можете захотеть включить это в отчет, но если температура диска составляет 45 градусов, вы, вероятно, захотите узнать об этом сейчас. Я планирую показать вам, как генерировать предупреждение или предпринимать корректирующие действия для действительно высоких значений.

  • PowerShell для управления хранилищем и файловой системой (часть 2)
  • PowerShell для управления хранилищем и файловой системой (часть 3)
  • PowerShell для управления хранилищем и файловой системой (часть 4)
  • PowerShell для управления хранилищем и файловой системой (часть 5)
  • PowerShell для управления хранилищем и файловой системой (часть 6)
  • PowerShell для управления хранилищем и файловой системой (часть 11)