А АSaturday, 2 April 2022

Варианты обмена данными c Zabbix.

Всем привет.  

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


Вот такие вот варианты на сегодня. Удачи.

Слава Украине!

1 comment:

Anonymous said...

Параметр AllowKey доступен с версии 5.0.2.
И тогда в Key для Item можно задавать такое: system.run[powershell.exe -command "$PSVersionTable.PSVersion.Major"]
или такое: system.run[powershell.exe -ExecutionPolicy Bypass -Noprofile -Windowstyle Hidden -File C:\Zabbix\test.ps1]

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное