В этой статье мы рассмотрим, как использовать 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"
Перезапустите службу 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 сессии пользователей.
PowerShell скрипты (даже самые просты) обычно выполняются довольно медленно. Поэтому нужно увеличить в конфигурации агента таймаут со стандартных 3 секунд до 20 (параметре Timeout=20), иначе при получении данных из PowerShell, Zabbix будет возвращать ошибку:
ZBX_NOTSUPPORTED: Timeout while executing a shell script.
При запуске команды может появится еще одна ошибка:
zabbix_get [4292]: Get value error: ZBX_TCP_READ() failed: [0x00002746] An existing connection was forcibly closed by the remote host. zabbix_get [4292]: Check access restrictions in Zabbix agent configuration
В этом случае нужно в конфигурации агента zabbix_agent2.conf разрешить принимать локальные подключения. Добавьте адрес 127.0.0.1.
Server=192.168.20.15,127.0.0.1
Теперь можно добавить в ваш шаблон новый параметр. Перейдите на вкладку Items и добавьте:
- Имя: Количество RDS сессии
- Type: Zabbix Agent (active)
- Key:
ActiveRDSSessions
- Type of information: Numeric (unsigned)
- Update Interval: 1m
- History: 90d
- Trenfd: 365d
Перейдите в Monitoring -> Latest data и проверьте, что Zabbix теперь получает значение из PowerShell скрипта.
Теперь разрешим запуск PowerShell скриптов через system.run. Этот способ является менее безопасным, т.к. позволяет выполнить на агенте любую команду через Zabbix, но более удобным (позволяет настраивать PowerShell скрипты прямо из веб-интерфейса Zabbix).
Включите в конфигурационном файле агента параметр:
AllowKey=system.run[*]
Теперь создайте новый 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
В этой статье мы рассмотрели, как получить данные в Zabbix из скриптов PowerShell в Windows.