PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 11)
Добро пожаловать обратно. В моей предыдущей статье я потратил некоторое время на обсуждение структуры функции PowerShell и упомянул, что мы собираемся создать две функции. Одна из этих функций будет получать SMART-статус диска, а другая будет выполнять базовую проверку работоспособности диска. Используя обе функции вместе, мы должны получить довольно хорошее представление о том, что происходит с нашими дисками.
Итак, с учетом сказанного, я хочу начать с создания функции, которая проверяет состояние SMART каждого диска. Прежде чем я это сделаю, я просто хочу быстро упомянуть, что на данный момент моя цель — просто установить базовую функциональность. Другими словами, я хочу создать несколько рабочих функций. Эти функции, вероятно, будут развиваться позже в этой серии, тем более, что позже я включу их в основной сценарий.
Итак, как я сказал в предыдущей статье, у каждой функции должно быть имя. Я назову эту функцию Get-Smart. Если бы я хотел, чтобы все было очень просто, моя функция Get-Smart могла бы выглядеть примерно так:
Функция Get-Smart
{
(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus | Select-Object InstanceName, PredictFailure, Reason)
}
Такая функция определенно сработает, но с этой функцией есть одна главная проблема. Он работает только с локальным компьютером. Как я упоминал в предыдущей статье, наша цель — собрать данные о работоспособности хранилища для нескольких серверов. Итак, давайте посмотрим, как мы можем решить эту проблему.
Для демонстрации я создал скрипт Smart.ps1. Этот сценарий просто определяет функцию, которую я буду использовать для получения статуса SMART, а затем вызывает эту функцию. Причина, по которой я создал этот сценарий, заключается в том, чтобы сэкономить много времени на вводе текста, поскольку я собираюсь постоянно изменять код по мере продвижения. Итак, с учетом сказанного, вот как выглядит мой сценарий прямо сейчас:
Функция Get-Smart
{
(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName Prod1 | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)
}
Поумнеть
Когда вы посмотрите на скрипт выше, вы заметите, что моя функция немного изменилась. Есть два важных изменения, которые я сделал. Во-первых, я добавил параметр –ComputerName в свою команду Get-WMIObject. Таким образом, я могу запустить команду для удаленной системы. В этом случае я запускаю команду на сервере с именем Prod1.
Второе изменение заключается в том, что команда заканчивается командой Select-Object, аналогичной той, что я показывал вам ранее, но теперь она отображает имя системы, в которой находится диск. Например, если вы посмотрите на рисунок A, то увидите, что диски находятся на сервере Prod1.
Рисунок A: Теперь отображается имя удаленного сервера.
Как вы можете видеть на рисунке выше, эта функция работает очень хорошо. Прежде чем двигаться дальше и развивать то, что мы уже сделали, я должен упомянуть две важные детали.
Во-первых, блок кода, который я использую, работает только потому, что удаленное взаимодействие PowerShell включено на всех моих серверах. Если вам нужно включить удаленное взаимодействие PowerShell на своих серверах, вы можете сделать это с помощью командлета Enable-PSRemoting. Есть действительно хорошая статья на TechNet, которую я рекомендую прочитать, прежде чем включить удаленное взаимодействие PowerShell.
Еще одна вещь, о которой я хочу упомянуть, это то, что мне не нужно было предоставлять какие-либо учетные данные безопасности, потому что все мои серверы являются членами домена, а я вошел в систему как администратор домена. Если вам нужно предоставить отдельный набор учетных данных, вы можете добавить параметр –Credential к командлету Get-WMIObject. Вы можете найти синтаксис здесь.
До сих пор мы получали информацию SMART с удаленного сервера. Однако мы немного схитрили, жестко вписав имя удаленного сервера в наш блок сценария. Это было бы хорошо, если бы нам нужно было запросить только один удаленный сервер, но помните, что конечная цель — проверить множество серверов. В таком случае нам нужно немного изменить функцию, чтобы мы могли передать ей имя сервера. К счастью, сделать это не слишком сложно. Вот как меняется сценарий:
Функция Get-Smart
{
(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)
}
«Прод1» | Поумнеть
Как вы можете видеть в приведенном выше коде, я заменил жестко заданное имя компьютера на $Input. Мой вызов функции также изменился. Теперь я указываю имя моего целевого компьютера (в данном случае Prod1) непосредственно перед вызовом функции. На первый взгляд это может показаться не лучшим, потому что я все еще использую жестко закодированное имя сервера, но этот метод открывает двери для запросов к нескольким серверам.
Запрашивать несколько серверов относительно легко, но для этого я должен ввести немного нового кода. Вот скрипт, который выполняет эту работу:
Функция Get-Smart
{
(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)
}
$Servers = @("Prod1", "Prod2")
ForEach ($Server в $Servers) {
$ сервер | Поумнеть
}
В приведенном выше коде функция вообще не изменилась. Он существует точно в том же состоянии, что и раньше. Это вызов функции, который изменился.
Наш вызов функции теперь состоит из четырех строк кода вместо одной. Первая из этих строк:
$Servers = @("Prod1", "Prod2")
В этой строке я объявляю переменную с именем $Servers. Вы заметите, что после знака равенства есть знак @. Этот знак @ указывает, что эта переменная будет массивом. Поскольку переменная представляет собой массив, я могу заполнить ее несколькими значениями. В данном случае эти значения являются именами серверов. Каждое имя заключено в кавычки и отделено запятой.
Вторая строка:
ForEach ($Server в $Servers) {
Мы не можем просто выгрузить все содержимое нашего массива (несколько имен серверов) в функцию. Если мы это сделаем, функция рухнет. Вместо этого мы используем оператор ForEach для обработки элементов массива (имен серверов) по одному. Мы вводим новую переменную с именем $Server, которая будет временно хранить значение одного сервера, пока скрипт работает со списком серверов.
Третья и четвертая строки кода:
$ сервер | Поумнеть
}
Эти строки берут любое имя сервера, хранящееся в $Server в данный момент, и отправляют это имя в нашу функцию. Поскольку мы используем цикл ForEach, PowerShell будет повторять этот процесс для каждого имени сервера. Вы можете увидеть результат работы этой функции на рисунке B.
Рисунок B: Мы используем скрипт для отправки нескольких имен серверов в функцию Get-Smart.
Вывод
Теперь, когда я показал вам, как отправлять несколько имен серверов в нашу функцию Get-Smart, пришло время создать функцию, которая получает основную информацию о состоянии дисков с наших серверов. Мы поработаем над этим в следующей статье. Оттуда мы будем фильтровать вывод, чтобы отображалось меньше беспорядка, и мы будем работать над созданием основного сценария, который мы сможем запускать автоматически.
- PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 11)