PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- 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")
ForEach ($Server в $Servers) {
$ сервер | Поумнеть
Enter-PSSession -имя_компьютера $Server
Получить здоровье
Exit-PSSession
}
Когда вы посмотрите на сценарий, показанный выше, вы заметите, что он содержит три основных раздела. Есть функция Get-Smart, еще одна функция Get-Health, а также основная часть скрипта.
Функции PowerShell не выполняются до тех пор, пока они не будут вызваны. Таким образом, при запуске скрипта PowerShell изначально игнорирует две функции и начинает фактическое выполнение кода в теле скрипта. Для справки, вот тело скрипта:
#Тело сценария
$Servers = @("Hyper-V-1", "Hyper-V-2")
ForEach ($Server в $Servers) {
$ сервер | Поумнеть
Enter-PSSession -имя_компьютера $Server
Получить здоровье
Exit-PSSession
}
Первая строка кода в приведенном выше блоке кода (#Script Body) — это просто комментарий, поэтому PowerShell игнорирует ее.
Во второй строке кода мы определяем имена серверов, которые хотим проанализировать. В данном случае эти серверы называются Hyper-V-1 и Hyper-V-2. Очевидно, вы замените эти имена серверов именами ваших собственных серверов. В моем сценарии я анализирую только два сервера, потому что хотел упростить задачу, но вы легко можете добавить больше серверов. Имена серверов необходимо заключать в кавычки и отделять друг от друга запятой. Между прочим, имена серверов хранятся в массиве с именем $Servers.
В следующей строке начинается настоящее действие. В этой строке используется команда ForEach для создания цикла. В этом случае мы выполняем набор задач для каждого $server в $servers. Вы заметите, что эта команда заканчивается фигурной скобкой и что в конце блока кода есть еще одна фигурная скобка. Код между двумя фигурными скобками выполняется один раз для каждого сервера в списке серверов. На самом деле строка ForEach говорит о том, что нам нужно выполнить набор шагов для каждого сервера в списке серверов.
Итак, что это за шаги? Ну, на самом деле инструкций всего четыре. Первый — это $Server | Поумнеть. Эта команда указывает PowerShell отправить имя сервера функции Get-Smart, которая, в свою очередь, получит информацию SMART для указанного сервера. Я пройдусь по этой функции через мгновение, но сначала я хочу закончить с основной частью.
Следующая строка кода — Enter-PSSession —ComputerName $Smart. Эта строка кода указывает PowerShell установить удаленный сеанс с указанным сервером. Таким образом, команды PowerShell могут выполняться удаленно на этом сервере.
Следующая строка — Get-Health. Как обсуждалось ранее, Get-Health — это не собственный командлет PowerShell, а название функции. Таким образом, эта строка вызывает функцию Get-Health.
Последняя строка кода перед закрывающей фигурной скобкой — Exit-PSSession. Другими словами, сценарий устанавливает сеанс с удаленным сервером, запускает функцию Get-Health для указанного сервера, а затем завершает сеанс.
Итак, теперь, когда я провел вас через основную часть скрипта, что насчет отдельных функций? Ну, есть две функции, и первая — это функция Get-Smart. Вот функция:
Функция Get-Smart
# Функция для получения информации SMART о диске
{
(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)
}
Когда основная часть скрипта вызывает функцию Get-Smart, она передает ей имя сервера. Функция содержит только одну строку исполняемого кода, и большая часть этого кода обсуждалась в предыдущей статье. Важно обратить внимание на параметр –ComputerName, за которым следует $Input. Переменная $Input относится к значению, которое передается функции. В данном случае это имя сервера.
Сценарий также содержит функцию Get-Health. Вот как выглядит эта функция:
Функция Get-Health
# Функция для получения информации о состоянии диска
{
$Pdisk= Get-PhysicalDisk
ForEach ($LDisk в $PDisk)
{
$LDisk.FriendlyName
$LDisk.HealthStatus
$LДиск | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature | Флорида
Write-Host ==================
}
}
Помните, нам не нужно передавать имя сервера в функцию, потому что функция выполняется на удаленном сервере благодаря сеансу, который мы устанавливаем.
Хотя функция кажется немного запутанной, она относительно проста. Мы начинаем с создания переменной с именем $Pdisk, которая содержит список всех физических дисков на сервере. Затем мы используем команду ForEach для создания цикла. В этом случае цикл позволяет нам исследовать каждый из дисков сервера в отдельности. По сути, мы говорим PowerShell выполнить набор шагов для каждого диска в списке физических шагов.
И снова шаги цикла заключены в фигурные скобки. Я не буду утомлять вас обсуждением отдельных шагов цикла, потому что они были рассмотрены в предыдущей статье. Эти шаги просто отображают понятное имя диска и его состояние работоспособности. Блок кода продолжает извлекать и отображать общее количество ошибок чтения и записи, а также температуру диска из счетчика надежности.
Если вас интересует строка Write-Host ===========, эта строка просто указывает PowerShell отображать на экране несколько знаков равенства. Я использую это как разделитель, который упрощает различие между одним диском и другим. Статистика каждого диска отображается между строками со знаком равенства.
Вывод
Я искренне надеюсь, что вы нашли мое объяснение команд этого скрипта полезным, и что вы начинаете получать некоторые идеи о том, как такой скрипт может быть полезен в вашей организации. В следующей статье этой серии я начну рассмотрение возможности информационной перегрузки.
- PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 11)