Мониторинг raid массивов в Windows Core

в 14:24, , рубрики: intel raid, powershell, windows core, мониторинг raid, хранилища данных

image

Всем привет!

За последние годы мы привыкли что можно и нужно все мониторить, множество инструментов начиная от простых логов, заканчивая Zabbix и все можно связать. Microsoft в свою очередь тоже дала нам отличный инструмент WinRM, с помощью которого мы можем отслеживать состояние операционных систем и не только. Но как всегда есть ложка дегтя, собственно об «обходе» этой ложки дегтя и пойдет речь.

Как выше было сказано, мы имеем все необходимые инструменты для мониторинга IT структуры, но так сложилось что мы не имеем «автоматизированный» инструмент для мониторинга состояния Intel raid массивов в Windows core. Обращаю Ваше внимание на то, что речь идет об обычном «желтом железе».

Все мы знаем что есть софт от Intel, rapid и matrix storage, но к сожалению на стандартном Windows core он не работает, также есть утилита raidcfg32, она работает в режиме командной строки, умеет обслуживать в ручном режиме и показывать статус, тоже в ручном режиме. Думаю Америку не для кого не открыл.

Постоянно в ручном режиме проверять состояние raid или ждать выхода из строя сервера виртуализации не самый лучший выбор.

Для реализации коварного плана по автоматизации мониторинга Intel raid мы используем
основные инструменты:

  • Powershell
  • EventLog
  • Raidcfg32.exe
  • Вспомогательные:
  • WinRM
  • Rsyslog
  • LogAnalyzer

Первым делом нужно установить драйвер для raid контроллера:
cmd.exe pnputil.exe -i -a [путь до *.inf]

Копируем raidcfg32.exe в c:raidcfg32

Проверяем корректно ли установлен драйвер:
cmd.exe C:raidcfg32raidcfg32.exe /stv

Если получаем состояние raid и дисков, то все ок.

Создаем источник в журнале application:

*Дальше все выполняется в powershell

New-EventLog -Source "RAID" -LogName "Application"

Выполняем запрос состояния raid, удаляем кавычки для упрощения парсинга, подключаем содержимое файла.

c:RAIDCFG32RAIDCFG32.exe /stv > c:RAIDCFG32raidcfgStatus.txt
Get-Content "c:RAIDCFG32raidcfgStatus.txt" | ForEach-Object {$_ -replace ('"'),' '} > c:RAIDCFG32raidstatus.txt
$1 = Get-Content c:RAIDCFG32raidstatus.txt
$2 = "$1"

Ищем ключевые слова, если одно из слов ниже будет найдено, то в файле errorRAID.txt появится значение true, это будет говорить о наличии ошибки, если совпадений не найдено, то будет записано значение false.

$2 -match "failed" > c:RAIDCFG32errorRAID.txt
$2 -match "disabled" >> c:RAIDCFG32errorRAID.txt
$2 -match "degraded" >> c:RAIDCFG32errorRAID.txt
$2 -match "rebuild" >> c:RAIDCFG32errorRAID.txt
$2 -match "updating" >> c:RAIDCFG32errorRAID.txt
$2 -match "critical" >> c:RAIDCFG32errorRAID.txt

Подключаем файл с записаными true и false, ищем в файле true, если true найдено то заменяем его на Error, заменяем false на Information.

Записывам результат в EntryType.txt

$3 = Get-Content c:RAIDCFG32errorRAID.txt
$4 = "$3"
$5 = $4 -match "true"
$6 = "$5"
$7 = $6 -replace "true", "Error" > c:RAIDCFG32EntryType.txt
$8 = $6 -replace "false", "Information" >> c:RAIDCFG32EntryType.txt

Подключаем содержимое файла EntryType.txt и удаляем в нем False, тем самым выводим корректный -EntryType что в свою очередь и является «Уровнем» сообщения.

Записываем в EventLog сообщение, где в случае если будут найдены ключевые слова, уровень сообщения будет Error, если не будут найдены, то Information.

$9 = Get-Content c:RAIDCFG32EntryType.txt
$10 = "$9"
$11 = $10 -replace "False"
Write-EventLog -LogName Application -Source "RAID" -EventID 9999 -EntryType "$11" -Message "$1"
exit

Сохраняем код в *.ps1

Создаем в планировщике задание на запуск скрипта, я запускаю задание 1 раз в сутки и при каждой загрузке.

Если будет производится сбор логов другой Windows ОС в Eventlog, то на коллекторе логов необходимо создать источник «RAID», пример есть выше.

Мы транспортируем логи в rsyslog через Adison rsyslog для Windows.

На выходе получается вот такая картинка:

image

Скрипт без комментариев

c:RAIDCFG32RAIDCFG32.exe /stv > c:RAIDCFG32raidcfgStatus.txt
Get-Content "c:RAIDCFG32raidcfgStatus.txt" | ForEach-Object {$_ -replace ('"'),' '} > c:RAIDCFG32raidstatus.txt
$1 = Get-Content c:RAIDCFG32raidstatus.txt
$2 = "$1"
$2 -match "failed" > c:RAIDCFG32errorRAID.txt
$2 -match "disabled" >> c:RAIDCFG32errorRAID.txt
$2 -match "degraded" >> c:RAIDCFG32errorRAID.txt
$2 -match "rebuild" >> c:RAIDCFG32errorRAID.txt
$2 -match "updating" >> c:RAIDCFG32errorRAID.txt
$2 -match "critical" >> c:RAIDCFG32errorRAID.txt
$3 = Get-Content c:RAIDCFG32errorRAID.txt
$4 = "$3"
$5 = $4 -match "true"
$6 = "$5"
$7 = $6 -replace "true", "Error" > c:RAIDCFG32EntryType.txt
$8 = $6 -replace "false", "Information" >> c:RAIDCFG32EntryType.txt
$9 = Get-Content c:RAIDCFG32EntryType.txt
$10 = "$9"
$11 = $10 -replace "False"
Write-EventLog -LogName Application -Source "RAID" -EventID 9999 -EntryType "$11" -Message "$1"

Автор: den_scs

Источник

Поделиться

* - обязательные к заполнению поля