LLD в zabbix появился уже давно, но попытки в лоб использовать готовые примеры для “шаблонизации” мониторинга служб на windows заканчивались неуспехами.
Недавно нашлись время, новые windows-машины и желание таки разобраться почему LLD не заводился. Ответ уже написан в названии поста – локализованные винды, non-ascii символы в названиях и описаниях служб.
Итак проблема – на целевой windows-машине необходимо собрать JSON-объект вида {data: [{"#SERVICENAME": "Бугага", "#SERVICEDISPLAY": "Не служба, а дружба", ....}]}
подручными средствами.
Подручным средством был выбран powershell – с ним недавно пришлось познакомиться поближе, остались приятные впечатления.
Авторы традиционных (распространнёных в сети) решений данной задачи во-первых живут в идеальном en-US мире, но видимо вынуждены поддерживать весьма большой зоопарк версий этой системы. Поэтому json они собирают вручную, но с кодировкой проблем не имеют. Мне же музейные версии powershell поддерживать не нужно, поэтому решение получилось простым и лаконичным: установить правильную кодировку и воспользоваться встроенным json-конвертером.
Сохраняем servicediscovery.ps1:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $services = Get-WmiObject Win32_Service | where-object { $_.StartMode -eq 'Auto' } | Select-Object -Property @{Name="{#SERVICESTATE}"; Expression = {$_.State}},@{Name="{#SERVICEDISPLAY}"; Expression = {$_.DisplayName}},@{Name="{#SERVICENAME}"; Expression = {$_.Name} },@{Name = "{#SERVICEDESC}"; Expression = {$_.Description}},@{Name = "{#SERVICEDIR}"; Expression = {$_.PathName}} $zabbixLLD = @{data=$services} | ConvertTo-Json -Compress [Console]::WriteLine( $zabbixLLD )
Добавляем в конфигурацию агента пользовательский параметр:
UserParameter=service.discovery,powershell -File "c:\zabbix\servicediscovery.ps1"
Пробуем zabbix_get-ом получить результат:
zabbix_get -s windows.host -k service.discovery
В случае успеха получаем правильный json-объект, которым можно воспользоваться по прямому назначению – создать прототипы метрик и триггеров (в виде шаблона например, можно взять готовый).
Скрипт немного проверен на небольшом количестве русских версий windows от 7 до 2012, турецкой windows 2008r2 и ещё несколько европейских локализаций относительно свежих серверных версий этой системы, судя по документации в MSDN ConvertTo-Json появился в powershell 3.0 (что видимо и является единственным требованием для корректной работы).
Товарищ, спасибо тебе больше! Помогло.
Удивлён, что даже спустя пять лет zabbix не научился нужное из коробки…