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

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

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

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

Как вы помните, вот как сейчас выглядит наш скрипт:

Функция 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

}

Самый простой способ добавить в сценарий возможность уведомления по электронной почте — создать функцию электронной почты. Эта функция может содержать все, кроме тела сообщения. Мы можем отправить тело сообщения в функцию в виде переменной. Таким образом, сообщение электронной почты может немного рассказать получателю о проблеме.

Поскольку нашей функции потребуется имя, я назову ее Send-Notice. Если бы мы взяли код из предыдущей статьи и выгрузили бы его в функцию Send-Notice как есть, то функция могла бы выглядеть так:

Функция отправки уведомлений{

# Функция для отправки уведомления по электронной почте о проблеме

 

$EmailTo = «[электронная почта защищена]»

$EmailFrom = «[электронная почта защищена]»

$Тема = "Тест"

$Body = «Тестовое тело»

$SMTPServer = «E2K13.poseydemo.com»

 

$Username = "ПосейдемоАдминистратор"

$Password = Get-Content c:scriptscred.txt | ConvertTo-SecureString

$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

 

Send-MailMessage -To $EmailTo -From $EmailFrom -Subject $Subject -Body $Body -Credential $Cred -SMTPServer $smtpserver

}

Добавив эту функцию в скрипт, можно будет отправлять тестовые сообщения на [email protected], просто вызвав функцию. Конечно, мы хотим сделать больше, чем просто отправлять тестовые сообщения. Мы хотим отправлять содержательные уведомления о проблемах.

Если вы посмотрите на приведенную выше функцию, то заметите, что она содержит переменную с именем $Body. Эта переменная формирует тело сообщения электронной почты, которое должно быть отправлено. Таким образом, ключом к отправке осмысленных сообщений будет удаление строки $Body из функции Send-Notice и передача вместо нее тела сообщения. Таким образом, мы сможем отправлять почту по мере необходимости в ответ на условия, обнаруженные сценарием, и предоставлять получателю информацию о проблеме.

Спроектировать функцию Send-Notice для приема тела сообщения так же просто, как изменить имя функции, чтобы оно принимало переменную, например:

Функция отправки уведомлений($Body)

Конечно, мы также должны удалить строку $Body= из функции.

Следующая хитрость состоит в том, чтобы изменить другие функции, чтобы сформировать тело сообщения, а затем передать это тело сообщения функции Send-Notice. Даже этот процесс относительно прост.

В настоящее время функция Get-Smart содержит следующую строку кода:

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

Эта строка кода вызывает отображение имени компьютера, имени экземпляра, прогноза сбоя и кода причины всякий раз, когда SMART прогнозирует сбой хранилища. Мы можем легко адаптировать эту строку кода для создания тела сообщения электронной почты и отправки его функции Send-Notice. Результирующий код выглядит следующим образом:

Функция Get-Smart

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

{

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

Если ($Smart.PredictFailure -EQ $True) {

               

# $Смарт | Select-Object PSComputerName, InstanceName, PredictFailure, Reason

$Body='SMART предсказал сбой. '

$Body2 = $Smart.PSComputerName

$Body3 = $Smart.InstanceName

$Body4 = $Smart.PredictFailure

$Body5 = $Smart.Reason

$Body = $Body + $Body2 + $Body3 + $Body4 + $Body5

Отправить уведомление ($ Body)

 

}

}

Приведенный выше код проверяет прогнозируемый сбой хранилища, а затем создает переменную с именем $Body. Переменная $Body состоит из текста «SMART предсказал сбой», за которым следует имя компьютера, имя экземпляра, прогноз сбоя и код причины. Все это объединяется в одну переменную с именем $Body, которая отправляется в функцию Send-Notice.

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

Итак, с учетом сказанного, вот как выглядит сценарий в целом:

Функция отправки уведомлений($Body)

# Функция для отправки уведомления по электронной почте о проблеме

{

$EmailTo = «[электронная почта защищена]»

$EmailFrom = «[электронная почта защищена]»

$Тема = "Тест"

$SMTPServer = «E2K13.poseydemo.com»

 

$Username = "ПосейдемоАдминистратор"

$Password = Get-Content c:scriptscred.txt | ConvertTo-SecureString

$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

 

Send-MailMessage -To $EmailTo -From $EmailFrom -Subject $Subject -Body $Body -Credential $Cred -SMTPServer $smtpserver

}

 

 

Функция Get-Smart

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

{

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

Если ($Smart.PredictFailure -EQ $True) {

               

# $Смарт | Select-Object PSComputerName, InstanceName, PredictFailure, Reason

$Body='SMART предсказал сбой. '

$Body2 = $Smart.PSComputerName

$Body3 = $Smart.InstanceName

$Body4 = $Smart.PredictFailure

$Body5 = $Smart.Reason

$Body = $Body + $Body2 + $Body3 + $Body4 + $Body5

Отправить уведомление ($ Body)

 

}

}

 

 

Функция 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 ================== }

}

 

Хотя в настоящее время сценарий только отправляет уведомления по электронной почте о сбоях SMART, тот же метод можно легко применить к функции Get-Health. Помните, все, что нам нужно сделать, это сформировать переменную с именем $Body, а затем передать эту переменную функции Send-Notice. Например, мы могли бы сделать что-то вроде этого:

$Body1 = 'На диске обнаружена проблема с работоспособностью диска'

$Body2 = $LDisk.FriendlyName

$тело3 = '. Состояние здоровья: '

$Body4 = $LDisk.HealthStatus

$Body = $Body1 + $Body2 + $Body3 + $Body4

$Отправить-Уведомление($Body)

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

Вывод

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

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