Zabbix: Мониторинг Windows серверов с использованием powershell

Количество элементов, доступных для мониторинга в стандартном zabbix агенте windows довольно сильно ограничено. К счастью в последних версиях WINDOWS есть инструмент с безграничными возможностями - встроенный язык сценариев, а может даже и программирования "Windows PowerShell", с которым мне довелось познакомиться в следующей задаче.

Задача такая:

  • мониторить пинг до определенного хоста с windows машины
  • мониторить количество соединений tcp c определенным хостом
  • мониторить количество установленных tcp соединений с хостом (по которым передаются данные)

PowerShell это объектно ориентированный язык программирования. В отличие от оболочки cmd.exe, из консоли PowerShell можно не только выполнять команды-программы из папки system32 и других, объявленных в переменной окружения (ping ya.ru, например), но и выполнять встроенные команды (командлеты). Определение командлетов наиболее четко и правильно описано в википедии:

"Командлеты (англ. cmdlets) — это специализированные команды PowerShell, которые реализуют различную функциональность. Это встроенные в PowerShell команды. Командлеты именуются по правилу Глагол-Существительное, например Get-ChildItem, благодаря чему их предназначение понятно из названия. Командлеты выводят результаты в виде объектов или их коллекций. Дополнительно, командлеты могут получать входные данные в такой же форме и, соответственно, использоваться как получатели в конвейере. Хотя PowerShell позволяет передавать по конвейеру массивы и другие коллекции, командлеты всегда обрабатывают объекты поочередно. Для коллекции объектов обработчик командлета вызывается для каждого объекта в коллекции по очереди."

Как видно из определения powershell поддерживает конвееры, это делает его приближенным к такому мощнейшему средству Unix систем, как shell. Итак, имеем заббикс агент, установленный на windows (zabbix_agent.exe --install) и windows с PowerShell.

Мониторить можно все, что вам удастся представить в виде цифры и вытащить с помощью повершелл, в нашем случае, это вполне реальные значения. Честно говоря до постановки задачи я представлял себе это на много сложнее, чем оказалось на самом деле. Возможно из-за того, что я понятия не имел, что такое PowerShell. Если вы так же не имеете понятия, то послушайте (посмотрите) доклад. Мне хватило знаний, полученных из этого доклада, чтобы выполнить задачу http://www.techdays.ru/videos/1187.html Сначала я написал небольшой скрипт, который принимает параметры и выдает желаемые значения

#Oleg Yamshikov 2014
#set-executionpolicy remotesigned -- если не запускается,
#то выполнить для включения выполнения неподписанных скриптов powershell
 
param (
$action="", #get_ping, get_conn
$dsthost = "10.197.121.55",
$state=" "
)
 
#если задано $state, то вычисляется количество соединений с указанным состоянием
if ($action -eq "get_conn"){
$tcptohost=netstat -an | Select-String $dsthost | Select-String $state
$tcptohost.Length
exit}
 
if ($action -eq "get_ping"){
$pin=Test-Connection $dsthost -Count 1
$pin.ResponseTime
exit
}
 
"Action not correct, use -action get_ping, or -action get_conn"

После слова param объявляем список переменных, которые может принимать скрипт из командной строки при запуске. Там же указываем и значения по умолчанию, если они не были объявлены перед запуском. Далее проверяем наличие action, который может принимать 2 параметра. Если экшн объявлен и равняется get_ping или get_conn, то вычисляется и выводится соответствующее значение, иначе выводится строка Action not correct, use -action get_ping, or -action get_conn, которую я написал на eng, чтобы данную ошибку можно было наблюдать на unix системах. Скрипт положил в c:\zabbix\zus.ps1 (zabbix user script типа) ). Скрипт сначала просил подписать его цифровой подписью, но откуда у меня цифровая подпись? Объяснить PowerShell что вы не директор госконторы и цифровой подписи у вас нет можо комендой set-executionpolicy remotesigned в консоле. Далее были странные попытки установить скрипт в качестве UserParameter в конфиге zabbix агента, который в упор не хотел запускать его, ругаясь на то, что не знает как это сделать. Наконец нашелся рабочий способ

UserParameter=conn_all[*],powershell -File "c:\zabbix\zus.ps1" -action get_conn $1
UserParameter=conn_est[*],powershell -File "c:\zabbix\zus.ps1" -action get_conn $1 -state ESTAB
UserParameter=chk_ping[*],powershell -File "c:\zabbix\zus.ps1" -action get_ping -dsthost $1

Прежде чем создавать элементы данных на zabbix сервере, нужно протестировать значения утилитой zabbix_get.exe (лежит в архиве с zabbix агентом) на самой винде.

PS C:\Users\Oleg_W7\Desktop> .\zabbix_get.exe -s localhost -k "conn_est[10.197.121.55]"
14
PS C:\Users\Oleg_W7\Desktop> .\zabbix_get.exe -s localhost -k "conn_all[10.197.121.55]"
179
PS C:\Users\Oleg_W7\Desktop> .\zabbix_get.exe -s localhost -k "conn_est[10.197.121.55]"
17
PS C:\Users\Oleg_W7\Desktop> .\zabbix_get.exe -s localhost -k "chk_ping[unixadm.info]"
23

Эта маленькая утилита запущенная в Windows может, в отличие от такой же на linux, распознавать ошибки в кириллице, а ошибки будут, без них ни куда. Когда добьетесь, что zabbix агент выдает все что нужно, прописываете имя сервера в директиве Server= в конфиге агента и добавляете правило, открывающее 10050 порт на вашем любимом файрволе на интерфейсе, смотрящем в сторону zabbix сервера.

Ну и, наконец, создаете на серевере zabbix в шаблоне, или в самом хосте элементы данных с соответствующими ключами conn_est[заменить на нужный ip], conn_all[заменить на нужный ip], chk_ping[unixadm.info] Элементы данных добавляете в график и любуютесь красотой минут через 5.

Полезные команды PowerShell

Команда Описание
Get-Help Отображает сведения о командах и концепциях Windows PowerShell.
Get-Member Получает свойства и методы объектов.
Select-String Находит текст в строках и файлах (аналог grep в Unix)
Format-List Форматирует вывод как список свойств, в котором каждое свойство выводится на новой строке.
Test-Connection Отправляет пакеты эхо-запросов ICMP (запросы проверки связи) одному или нескольким компьютерам.

Аналог Ping, только возвращает значение в виде объекта (массив из 4х объектов по умолчанию)

Категории: