PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 11)
В своей первой статье из этой серии я показал вам несколько простых команд, которые можно использовать для оценки работоспособности физического хранилища сервера. Эти команды великолепны, но они не совсем практичны для реального использования — по крайней мере, не в той форме, которую я показал вам в той первой статье. Подумайте об этом на мгновение. Вы действительно не хотите вручную выполнять кучу команд PowerShell каждый раз, когда хотите узнать, все ли ваши диски исправны. Что еще более важно, методы, которые я показал вам, использовались на одном сервере. Что, если бы у вас было много серверов для мониторинга? Вы, конечно, не хотели бы вручную запускать команды PowerShell на десятках отдельных серверов.
Хорошая новость заключается в том, что вам не нужно. Немного поработав, мы можем создать сценарий на основе вариантов команд, которые я вам уже показал, а затем использовать этот сценарий для мониторинга состояния хранилища всех серверов во всей нашей организации. Для этого нам нужно сделать несколько вещей. В частности, мы должны:
- Определить, какие метрики представляют условие, о котором нам нужно знать
- Создать скрипт
- Масштабируйте скрипт для работы на нескольких серверах
- Встроить механизм оповещения в скрипт
Хотя я, вероятно, немного забегаю вперед, я хочу начать с обсуждения того, что потребуется для запуска сценария на нескольких серверах.
Первое, что нам нужно выяснить, это то, какие серверы должен отслеживать скрипт. На первый взгляд это кажется довольно простым. Сценарий предназначен для мониторинга состояния физических дисков, поэтому его необходимо запускать на физических серверах. Достаточно легко, верно? Но есть проблема. Физические серверы не являются полностью статичными. Серверы, существующие в вашем центре обработки данных сегодня, могут отличаться от тех, которые будут в вашем центре обработки данных через шесть месяцев. Вы можете вывести из эксплуатации один или несколько серверов, заменить некоторые устаревшие серверы новыми серверами или приобрести несколько дополнительных серверов для масштабирования определенных рабочих нагрузок. Если вы планируете запускать сценарий на своем физическом оборудовании, вам нужно придумать простой способ убедиться, что сценарий всегда нацелен на правильные серверы. К счастью, есть несколько различных способов выполнить эту задачу.
Первый вариант — жестко закодировать имена серверов в вашем скрипте. Самый простой способ сделать это — присвоить имена серверов переменной. Например, в моей организации есть серверы с именами Hyper-V-1, Hyper-V-2, Hyper-V-3 и так далее. Если бы я хотел получить информацию о физическом диске для этих серверов, я мог бы сделать что-то вроде этого:
$Computer="Гипер-V-1", "Гипер-V-2"
Invoke-Command –ComputerName $Computer –ScriptBlock {Get-PhysicalDisk | Select-Object FriendlyName, HealthStatus}
Этот метод работает очень хорошо, но опять же, он не очень масштабируемый. Вы действительно не хотите изменять свой сценарий PowerShell каждый раз, когда вы добавляете или удаляете физический сервер в вашей сети.
Лучшая альтернатива — основывать запрос на именах серверов. Однако этот метод работает только в том случае, если вы используете строгие соглашения об именах для своих физических серверов. Например, я упомянул соглашение об именовании, которое использую для своих серверов Hyper-V. Поскольку все мои серверы Hyper-V начинаются с Hyper-V, я мог бы построить запрос на основе соглашения об именах. Позвольте мне показать вам, как это работает:
Команда, которую я буду использовать для получения имен компьютеров из Active Directory, называется Get-ADComputer. Чтобы использовать это, на сервере необходимо установить функцию инструментов AD DS и AD LDS. Вы можете установить эту функцию, работая с помощью мастера добавления ролей и компонентов диспетчера серверов, а затем установив средства удаленного администрирования сервера (которые включают средства администрирования ролей, а также инструменты AD DS и AD LDS). После установки необходимых компонентов вы можете использовать команду, подобную этой, для получения имен серверов из Active Directory:
Get-ADComputer –Filter 'Имя – например, «Hyper-V*»'
Как видно на рисунке A, эта команда извлекает список моих серверов Hyper-V.

Рисунок A. Я получил список своих серверов Hyper-V.
Это отличное начало, но оно не совсем сработает для нас. Вы могли заметить, что на рисунке было возвращено много информации, отличной от имен серверов. Нам нужен список имен серверов и ничего больше. Самый простой способ добиться этого — использовать параметр ForEach для фильтрации результатов. Команда выглядит так:
Get-ADComputer –Имя фильтра –Наподобие «Hyper-V*»’ –Имя свойств | ForEach {$_.Name}
Как вы можете видеть на рисунке B, эта команда возвращает имена серверов и ничего больше.

Рисунок B: Вот список моих серверов.
Теперь мы можем связать эту команду с переменной, а затем использовать ту же инструкцию Invoke-Command, которую мы использовали ранее для запуска команды Get-PhysicalDisk для всех наших серверов Hyper-V. Реальная командная строка будет выглядеть так:
$Computer= Get-ADComputer –Filter 'Имя –Like «Hyper-V*»' –Properties Name | ForEach {$_.Name}
Invoke-Command –ComputerName $Computer –ScriptBlock {Get-PhysicalDisk | Select-Object FriendlyName, HealthStatus}
Приведенный выше сценарий действительно является предпочтительным способом получения имен компьютеров (по крайней мере, на мой взгляд), потому что он полностью динамичен. Однако, как упоминалось ранее, это не будет работать, если вы не используете какое-либо соглашение об именовании с выступом или не имеете какого-либо другого свойства, которое вы можете использовать для идентификации вашего физического оборудования. Кроме того, для этого требуется, чтобы ваше физическое оборудование было присоединено к домену. Так что же делать, если этот метод не работает для вас?
Мой совет - использовать текстовый файл. Вы можете сохранить текстовый файл с именами ваших физических серверов, а затем написать сценарий для ссылки на текстовый файл. Предположим, например, что вы создали список своих физических серверов в файле с именем C:Servers.txt. Ваш сценарий может выглядеть примерно так:
$Computer = Get-Content – путь C:Servers.txt
Invoke-Command –ComputerName $Computer –ScriptBlock {Get-PhysicalDisk | Select-Object FriendlyName, HealthStatus}
Очевидно, что этот сценарий не является на 100% динамическим, но вам не придется вносить изменения в сценарий каждый раз, когда изменяется инвентаризация вашего физического сервера. Все, что вам нужно сделать, это обновить текстовый файл. Если у вас есть компьютеризированная система инвентаризации оборудования, вы даже можете написать запрос к базе данных, который получает имена серверов из базы данных вашего программного обеспечения для инвентаризации.
Вывод
Итак, теперь, когда я потратил некоторое время на то, чтобы показать вам, как запускать серию команд PowerShell для нескольких серверов, пришло время приступить к разработке нашего сценария мониторинга хранилища. Для этого нам нужно точно определить, что мы хотим, чтобы наш скрипт делал, а затем написать код, чтобы это произошло. Мы определим цели сценария в части 3.
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 11)