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

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

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

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

Я уже начал процесс фильтрации менее полезной информации. В прошлой статье я адаптировал скрипт так, чтобы данные о температуре отображались только в том случае, если температура диска выше 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

               

$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

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

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

Строка выше проверяет, не превышает ли температура диска 35 градусов. Если температура выше 35 градусов, то отображается температура. Мы можем сделать то же самое для ошибок чтения и записи. Строки кода, используемые для этого, будут выглядеть примерно так:

$LДиск | Get-StorageReliabilityCounter | Где-Объект {$_.ReadErrorsTotal -GT 0} | Select-Object ReadErrorsTotal | Флорида

$LДиск | Get-StorageReliabilityCounter | Где-Объект {$_.WriteErrorsTotal -GT 0} | Select-Object WriteErrorsTotal | Флорида

Эти две строки кода идентичны друг другу, за исключением того, что одна проверяет наличие ошибок чтения, а другая ищет ошибки записи. Эти строки кода можно добавить в наш скрипт чуть ниже строки, которая проверяет температуру хранения. В результате скрипт будет выглядеть так:

Функция 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 | Где-Объект {$_.Температура -GT 35} | Температура выбора объекта | Флорида

$LДиск | Get-StorageReliabilityCounter | Где-Объект {$_.ReadErrorsTotal -GT 0} | Select-Object ReadErrorsTotal | Флорида

$LДиск | Get-StorageReliabilityCounter | Где-Объект {$_.WriteErrorsTotal -GT 0} | Select-Object WriteErrorsTotal | Флорида

               

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

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

Изображение 4660
Рисунок A:
Это вывод скрипта в его текущей форме.

Глядя на снимок экрана выше, вы, вероятно, заметите две вещи. Во-первых, никакие метрические данные не отображаются. Это связано с тем, что все мои диски в настоящее время исправны, и я ничего не могу сделать, чтобы перевести их в неработоспособное состояние. Еще одна вещь, которую вы заметите, это то, что я устранил много беспорядка, но все еще остается много беспорядка.

Чтобы еще больше уменьшить беспорядок, я переписал большую часть функции Get-Health. Вот новая функция:

Функция Get-Health

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

{

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

               

{

               

$CurrentDisk = $LDisk | Get-StorageReliabilityCounter

               

Если ($CurrentDisk.Temperature -GT 35 -ИЛИ $CurrentDisk.ReadErrorsTotal -GT 0 -ИЛИ $_.CurrentDisk -GT 0){

                               

$LDisk.FriendlyName

                               

$LDisk.HealthStatus

                               

$LДиск | Get-StorageReliabilityCounter | Температура Select-Object, ReadErrorsTotal, WriteErrorsTotal | Флорида

                               

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

               

}

}

Эта функция по-прежнему работает в основном так же, как и раньше, пока не достигнет строки, начинающейся с $CurrentDisk. Я использую $CurrentDisk в качестве переменной для хранения данных счетчика надежности для диска, который в настоящее время проверяется.

Следующая строка кода содержит оператор if, состоящий из нескольких частей. Эта строка кода проверяет три условия. Он проверяет, не превышает ли температура диска 35. Он также проверяет, превышает ли количество ошибок чтения 0, и проверяет, превышает ли количество ошибок записи 0. Если какое-либо из этих условий выполняется true, то обрабатывается блок кода, который вызывает отображение имени диска, состояния его работоспособности, температуры и количества ошибок чтения и записи.

Как упоминалось ранее, все мои диски исправны, поэтому никакие показатели не отображаются, кроме информации SMART, которая обрабатывается отдельно. Тем не менее, рисунок B показывает, насколько сократился выпуск продукции.

Изображение 4661
Рисунок B:
Модификации скрипта значительно уменьшили объем вывода.

Так что, если мы хотим протестировать код? Что ж, один из способов сделать это — изменить пороговое значение температуры с 35 до 0. Это приведет к отображению метрик для каждого диска. Вы можете увидеть, как это выглядит на рисунке C.

Изображение 4662
Рисунок C:
Это нефильтрованный вывод скрипта.

Мы действительно избавились от раздутого вывода скрипта. А как же данные SMART? Ну, это тоже достаточно легко обрезать. Вот как я изменил функцию Get-Smart:

Функция Get-Smart

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

{

$Smart = Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input

Если ($Smart.PredictFailure -EQ $True) {$Smart | Select-Object PSComputerName, InstanceName, PredictFailure, Reason | Флорида}

}

Если вы посмотрите на приведенный выше код, вы увидите, что я создал переменную с именем $Smart и присваиваю этой переменной информацию SMART для анализируемого в данный момент диска. Следующая строка смотрит на значение PredictFailure для текущего диска. Если PredictFailure равен $True, это означает, что SMART предсказывает отказ диска. В этом случае данные SMART будут отображаться для диска. В противном случае ничего не будет отображаться.

Итак, с учетом сказанного, мы отфильтровали вывод, чтобы избавиться от всего ненужного. Может быть, даже слишком. Если вы посмотрите на рисунок D, то увидите, что когда все целевые серверы исправны, нет никаких признаков того, что сценарий вообще что-то сделал.

Изображение 4663
Рисунок D:
Сценарий не показывает данных о исправной системе.

Итак, что мы можем сделать по этому поводу? Есть две вещи. Во-первых, я рекомендую на мгновение изменить $True на $False в приведенном выше блоке кода. Это позволит вам убедиться, что функция работает, как показано на рисунке E.

Рисунок E: Изменив $True на $False, мы можем протестировать код.

Когда вы измените $False обратно на $True, я рекомендую добавить строку в основной текст скрипта в цикле ForEach, которая просто говорит $Server. Это отобразит имя сервера, который в данный момент анализируется. Это обеспечит визуальную индикацию того, что скрипт что-то делает. Если обнаружена проблема, эта строка кода позволит легко определить, на каком сервере возникла проблема. Итак, с учетом сказанного, вот как теперь выглядит сценарий:

Функция Get-Smart

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

{

$Smart = Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input

Если ($Smart.PredictFailure -EQ $True) {$Smart | Select-Object PSComputerName, InstanceName, PredictFailure, Reason | Флорида}

}

 

Функция Get-Health

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

{

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

               

{

               

$CurrentDisk = $LDisk | Get-StorageReliabilityCounter

               

Если ($CurrentDisk.Temperature -GT 35 -ИЛИ $CurrentDisk.ReadErrorsTotal -GT 0 -ИЛИ $_.CurrentDisk -GT 0){

                               

$LDisk.FriendlyName

                               

$LDisk.HealthStatus

                               

$LДиск | Get-StorageReliabilityCounter | Температура Select-Object, ReadErrorsTotal, WriteErrorsTotal | Флорида

                               

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

               

}

На рис. F показано, как это выглядит, когда сценарий выполняется на ряде работоспособных серверов.

Изображение 4664
Рисунок F.
Все эти серверы исправны.

Вывод

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

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