Zabbix агент: получить данные из PowerShell скрипта

В этой статье мы рассмотрим, как использовать PowerShell скрипты для получения данных мониторинга с агента Zabbix. Рассмотрим два простых PowerShell скрипта, данные из которых нам нужно получить в Zabbix: как получить количество активных RDP сессий пользователей на RDS сервере Windows и как получить количество дней с даты последней установки обновлений Windows на сервере.

Для получения данных в Zabbix из внешнего PowerShell скрипта на агенте чаще всего используются два инструмента:

  • Опция UserParameter в конфигурационном файле агента позволяет запустить на хосте определенный скрипт PowerShell. При использовании этой опции нужно настроить UserParameter и поместить файл скрипта PS1 непосредственно на хосте Windows
  • Можно запускать скрипты PowerShell через system.run. В этом случае вы настраиваете скрипт непосредственно в веб интерфейсе Zabbix и можете запускать произвольные команды.

Сначала рассмотрим пример запуска скрипта PowerShell через UserParameter. Предполагаем, что вы уже установили и настроили Zabbix агент на сервере.

Создайте простой скрипт, который возвращает количество активных RDP сессий и сохраните его в файл «C:\Program Files\Zabbix Agent 2\Script\GetActiveRDPSessionCount.ps1»

$RDSsessions= qwinsta |ForEach-Object {$_ -replace "\s{2,18}",","} | ConvertFrom-Csv
$RDSActiveSessions=@($RDSsessions| where State -eq 'Active').count
Write-Host $RDSActiveSessions

Теперь отредактируйте конфигурационный файл агента Zabbix (zabbix_agent2.conf) и настройте параметр:

UserParameter=ActiveRDSSessions,powershell -NoProfile -ExecutionPolicy bypass -File "C:\Program Files\Zabbix Agent 2\Script\GetActiveRDPSessionCount.ps1"

Разрешит запуск PowerShell скрипта через UserParameter в агенте zabbix

Параметр -ExecutionPolicy bypass позволяет запустить PowerShell скрипт, не изменяя настройки политики запуска PowerShell скриптов в Windows.

Перезапустите службу Zabbix-агента:

Get-Service ‘Zabbix Agent 2’| Restart-Service -force

Проверьте, что агент zabbix может получить данные из нового параметра. Для тестирования агента используется встроенная утилита zabbix-get:

zabbix_get -s 127.0.0.1 -p 10050 -k ActiveRDSSessions

В данном примере Zabbix выполнил скрипт PowerShell и вернул, что на хосте активны 2 RDP сессии пользователей.

zabbix_get - проверить доступность параметра powershell в данных агента

 

PowerShell скрипты (даже самые просты) обычно выполняются довольно медленно. Поэтому нужно увеличить в конфигурации агента таймаут со стандартных 3 секунд до 20 (параметре Timeout=20), иначе при получении данных из PowerShell, Zabbix будет возвращать ошибку:

При запуске команды может появится еще одна ошибка:

В этом случае нужно в конфигурации агента zabbix_agent2.conf разрешить принимать локальные подключения. Добавьте адрес 127.0.0.1.

Теперь можно добавить в ваш шаблон новый параметр. Перейдите на вкладку Items и добавьте:

  • Имя: Количество RDS сессии
  • Type: Zabbix Agent (active)
  • Key: ActiveRDSSessions
  • Type of information: Numeric (unsigned)
  • Update Interval: 1m
  • History: 90d
  • Trenfd: 365d

Добавить элемент мониторига в Zabbix для PowerShell скрипта

Перейдите в Monitoring -> Latest data и проверьте, что Zabbix теперь получает значение из PowerShell скрипта.

Теперь разрешим запуск PowerShell скриптов через system.run. Этот способ является менее безопасным, т.к. позволяет выполнить на агенте любую команду через Zabbix, но более удобным (позволяет настраивать PowerShell скрипты прямо из веб-интерфейса Zabbix).

Включите в конфигурационном файле агента параметр:

Теперь создайте новый Item:

  • Имя: Дней с последней установки Windows
  • Type: Zabbix Agent
  • Key: system.run[powershell.exe -command "(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).days"]
  • Type of information: Numeric (unsigned)
  • Update Interval: 1d
  • History: 180d
  • Trenfd: 365d
Данная команда возвращает количество дней, прошедших с последней даты установки обновления безопасности в Windows.