В этой статье мы рассмотрим, как использовать 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 FilesZabbix Agent 2ScriptGetActiveRDPSessionCount.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 FilesZabbix Agent 2ScriptGetActiveRDPSessionCount.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._x000D_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.