Zabbix - это популярное средство мониторинга в компьютерных сетях. Основными принципами работы программы заключается во взаимодействии сервера и агентов устанавливающиеся на хосты. В Zabbix доступны и другие инструменты, которые позволяют запускать скрипты, в том числе и Powershell. Такой подход позволяет добавлять в Zabbix нужные для вас данные или вести дополнительную аналитику получая данные с сервера. Итак, помимо штатного мониторинга из коробки существуют следующие варианты получения и отправки данных в Zabbix.
Передача данных на Zabbix-сервер:
- zabbix_sender
- UserParameter
- передача дополнительных параметров
- Discovery Rules и Item Prototype
- любой скрипт с system.run
Получение данных от Zabbix-сервера:
- получаем данные через zabbix_get
- получение данных с API.
Инструменты с помощью которых мы обмениваемся данными в Zabbix можно разделить на серверные и клиентские.
Из них создающиеся или хранящиеся на сервере Zabbix:
- скрипты (Scripts) - это скрипты, которые можно использовать в веб-интерфейсе Zabbix. Визуально это пункты меню;
- External Scripts - папка обычно "/usr/lib/zabbix/externalscripts", в которую можно поместить скрипт и привязать его к какому-то хосту;
- API - HTTP интерфейс, к которому можно обращаться получая большую часть данных или создавать/редактировать существующие элементы.
И клиентские инструменты, которые чаще всего используются на клиентах:
- zabbix_sender - отдельная программа, которая отправляет данные на сервер Zabbix;
- zabbix_get - отдельная программа для получения данных с хостов, на которых установлен zabbix_agent. Обычно используется для тестирования;
- UserParameter - параметр в конфигурации агента на хосте. С помощью его так же можно отправить данные на сервер.
- system.run - параметр в конфигурации агента на хосте. В отличие от UserParameter позволяет выполнять любой скрипт на клиенте. Хотя и для UserParameter я особых ограничений не заметил, например так UserParameter=admin.local[*],powershell -File "GetAdmins.ps1"
Далее я повторил за автором статьи весь перечень его запросов на своем полигоне. Все скриншоты смотрите там. У меня под рукой домена не оказалось поэтому все запросы Powershell я строил по списку локальных админстраторов подручного хоста MARINA:
(Get-LocalGroupMember -Name Администраторы | where -Property PrincipalSource -eq Local).count
Версия Zabbix-агента и сервера 5.0.19.
В первом блоке рассмотрим передачу данных Zabbix Server-у от агента.
1) С помощью утилиты агента zabbix_sender:
Ключ admin.local должен быть предварительно быть привязан к хосту MARINA на сервере.
$admin_local = (Get-LocalGroupMember -Name Администраторы | where -Property PrincipalSource -eq Local).count
c:\zabbix\zabbix_sender.exe -z 192.168.1.202 -s "MARINA" -k admin.local -o $admin_local
Вариант с передачей массива данных на сервер требует формат JSON. И тут есть двойная неприятность:
- сам JSON надо дважды заворачивать в кавычки;
- отображение кириллицы это не спасает.
Например вы можете пробовать нижеследующий код:
-сохраняем предыдущую кодировку
prev = [Console]::OutputEncoding
Меняем кодировку на UTF8
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
-тут находится ваш скрипт
$somedata = @{
data=@(
@{'{#NAME}'='User1';};
@{'{#NAME}'='Admin';};
)
}
$json = $somedata | ConvertTo-Json -Compress
-еще раз заворачиваем JSON в кавычки
$json = $json -replace '"','"""'
c:\zabbix\zabbix_sender.exe -z 192.168.1.202 -s "MARINA" -k admin.list -o $json
-меняем кодировку на первоначальную
[Console]::OutputEncoding = $prev
Если вам такой кодинг на лету помог, то вы счастливчик.
2) С помощью самого агента zabbix_agentd:
# Указываем необходимые значения в конфиге zabbix агента:
- первый вариант:
# разрешение исполнения с применением специальных символов
UnsafeUserParameters=1
# пользовательский скрипт на примере Powershell
UserParameter=admin.local[*],powershell -Command "[int](Get-LocalUser -Name $1).Count"
# пользовательский скрипт на примере Powershell и JSON
UserParameter=admin.list,powershell -Command "@{data=@(@{'{#NAME}'='User1'};@{'{#NAME}'='Admin'})} | ConvertTo-Json"
- второй вариант:
# разрешение исполнения любых скриптов на агенте, где прежний параметр EnableRemoteCommands устарел.
AllowKey=system.run[*]
Теперь в ключ хоста можно указывать прямо
system.run[powershell -File C:\Script01.ps1,]
или выполняем одну или несколько команд
system.run[powershell.exe -c Get-Process,Get-Service,]
Есть два способа получения данных для обработки в Powershell - это API и zabbix_get. Лучшим вариантом будет считаться API т.к. он имеет много возможностей и не требует настроек со стороны агента. Но что касаетстя zabbix_get, то в нем проблематично однозначно разделить направление передачи данных сервер-агент. Ок, не будем на этом фокусироваться сейчас.
Поэтому полагаем что во втором блоке имеем получение данных от Zabbix Server-а клиенту.
3) С помощью утилиты агента zabbix_get:
Тут я повторяюсь ибо это рассматривал ранее:
c:\zabbix\zabbix_get -s 127.0.0.1 -p 10050 -k agent.ping --tls-connect=psk --tls-psk-identity="MARINA-PSK" --tls-psk-file="C:\Zabbix\psk.key"
$1 = "User1"
c:\zabbix\zabbix_get -s 127.0.0.1 -p 10050 -k admin.local["$1"] --tls-connect=psk --tls-psk-identity="MARINA-PSK" --tls-psk-file="C:\Zabbix\psk.key"
# или получаем данные в формате json
$discovery_rules = c:\zabbix\zabbix_get -s 127.0.0.1 -p 10050 -k net.if.discovery --tls-connect=psk --tls-psk-identity="MARINA-PSK" --tls-psk-file="C:\Zabbix\psk.key"
$object = $discovery_rules | ConvertFrom-Json
4) получение данных с помощью zabbix API:
$server = '192.168.1.202'
$url = 'http://'+$server+'/api_jsonrpc.php'
Вначале получаем Zabbix token для дальнейших запросов
$data = @{
"jsonrpc"="2.0";
"method"="user.login";
"params"=@{
"user"="Admin";
"password"="*******";
};
"id"=1
}
$token = (Invoke-RestMethod -Method 'Post' -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json")
$token.result
А теперь получимм список hosts которые имеем под мониторингом
$data = @{
"jsonrpc"="2.0";
"method"="host.get";
"params"=@{
};
"id"=2;
"auth"=$token.result;
}
Получаем тот же список hosts с фильтрацией вывода
$data = @{
"jsonrpc"="2.0";
"method"="host.get";
"params"=@{
"output"=@(
"hostid";
"host";
);
};
"id"=2;
"auth"=$token.result;
}
Получаем список триггеров для определенного хоста, его id=10323 был в предыдущем выводе
$data = @{
"jsonrpc"="2.0";
"method"="trigger.get";
"params"=@{
"hostids"=@(10323;);
};
"auth"=$token.result;
"id"=1;
}
$hosts = Invoke-RestMethod -Method 'Post' -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json"
$hosts.result | Select name | Sort name | fl
$hosts.result.host
Получим зарегестрированный script в Zabbix и его ID
$data = @{
"jsonrpc"= "2.0";
"method"= "script.get";
"params"= @{
"output" ="extend";
};
"auth"= $token.result;
"id"= 1;
}
$hosts = Invoke-RestMethod -Method 'Post' -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json"
$hosts.result | select name, scriptid, command
А теперь выполним скрипт id=1 для определенного хоста 10318
$data = @{
"jsonrpc"="2.0";
"method"="script.execute";
"params"=@{
"scriptid"=1;
"hostid"=10318;
};
"auth"=$token.result;
"id"=1;
}
$hosts = Invoke-RestMethod -Method 'Post' -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json"
$hosts.result
$hosts.result.value
Вот такие вот варианты на сегодня. Удачи.
Слава Украине!
Параметр AllowKey доступен с версии 5.0.2.
ReplyDeleteИ тогда в Key для Item можно задавать такое: system.run[powershell.exe -command "$PSVersionTable.PSVersion.Major"]
или такое: system.run[powershell.exe -ExecutionPolicy Bypass -Noprofile -Windowstyle Hidden -File C:\Zabbix\test.ps1]