Skip to content

Zabbix

Zabbix Agent Deploy

$url = "https://cdn.zabbix.com/zabbix/binaries/stable/6.4/6.4.5/zabbix_agent2-6.4.5-windows-amd64-static.zip"
$path = "$home\Downloads\zabbix-agent2-6.4.5.zip"
$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile($url, $path)` скачать файл
Expand-Archive $path -DestinationPath "C:\zabbix-agent2-6.4.5\"` разархивировать
Remove-Item $path` удалить архив
New-NetFirewallRule -DisplayName "Zabbix-Agent" -Profile Any -Direction Inbound -Action Allow -Protocol TCP -LocalPort 10050,10051` открыть порты в FW

$Zabbix_Server = "192.168.3.102"
$conf = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf"
$cat = cat $conf
$rep = $cat -replace "Server=.+","Server=$Zabbix_Server"
$rep | Select-String Server=
$rep > $conf

$exe = "C:\zabbix-agent2-6.4.5\bin\zabbix_agent2.exe"
.$exe --config $conf --install` установить службу
Get-Service *Zabbix*Agent* | Start-Service` запустить службу
#.$exe --config $conf --uninstall` удалить службу

zabbix_sender

Создать host - задать произвольное имя (powershell-host) и добавить в группу
Создать Items:
Name: Service Count
Type: Zabbix trapper
Key: service.count
Type of Information: Numeric

$path = "C:\zabbix-agent2-6.4.5\bin"
$scount = (Get-Service).Count
.$path\zabbix_sender.exe -z 192.168.3.102 -s "powershell-host" -k service.count -o $scount

zabbix_get

apt install zabbix-get
nano /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1,192.168.3.102,192.168.3.99 добавить сервера для получения данных zabbix_get с агента (как их запрашивает сервер)

.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.version проверить версию агента
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.ping 1 - ok
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.discovery список сетевых интерфейсов
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.in["ens33"]
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.out["ens33"]

UserParameter

UserParameter=process.count,powershell -Command "(Get-Process).Count"
UserParameter=process.vm[*],powershell -Command "(Get-Process $1).ws"

Test:
C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.count
C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[zabbix_agent2]
C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[powershell]

Создать новые Items:
key: process.count
key: process.vm[zabbix_agent2]

Include

  • Добавить параметр Include для включения конфигурационных файлов подключаемых плагинов
    'Include=.\zabbix_agent2.d\plugins.d\*.conf' >> C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf

  • Создать конфигурационный файл с пользовательскими параметрами в каталоге, путь к которому указан в zabbix_agentd.conf
    'UserParameter=Get-Query-Param[*],powershell.exe -noprofile -executionpolicy bypass -File C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions\Get-Query-Param.ps1 $1' > C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\plugins.d\User-Sessions.conf

  • Поместить скрипт Get-Query-Param.ps1 в каталог, путь к которому указан в User-Sessions.conf. Скрипт содержим пользовательские параметры, которые он принимает от Zabbix сервера для передачи их в функции скрипта.

Param([string]$select)
if ($select -eq "ACTIVEUSER") {
(Get-Query | where status -match "Active").User
}
if ($select -eq "INACTIVEUSER") {
(Get-Query | where status -match "Disconnect").User
}
if ($select -eq "ACTIVECOUNT") {
(Get-Query | where status -match "Active").Status.Count
}
if ($select -eq "INACTIVECOUNT") {
(Get-Query | where status -match "Disconnect").Status.Count
}
  • Проверить работу скрипта:

$path = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions"
.$path\Get-Query-Param.ps1 ACTIVEUSER
.$path\Get-Query-Param.ps1 INACTIVEUSER
.$path\Get-Query-Param.ps1 ACTIVECOUNT
.$path\Get-Query-Param.ps1 INACTIVECOUNT

  • Создать Items с ключами:

Get-Query-Param[ACTIVEUSER] Type: Text
Get-Query-Param[INACTIVEUSER] Type: Text
Get-Query-Param[ACTIVECOUNT] Type: Int
Get-Query-Param[INACTIVECOUNT] Type: Int

  • Макросы:

{$ACTIVEMAX} = 16
{$ACTIVEMIN} = 0

  • Триггеры:

last(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT])>{$ACTIVEMAX}
min(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT],24h)={$ACTIVEMIN}

zabbix_agent2.conf

# Агент может работать в пассивном (сервер забирает сам информацию) и активном режиме (агент сам отправляет):
Server=192.168.3.102
ServerActive=192.168.3.102
# Требуется указать hostname для ServerActive:
Hostname=huawei-book-01
# Если не указано, используется для генерации имени хоста (игнорируется, если имя хоста определено):
# HostnameItem=system.hostname
# Как часто обновляется список активных проверок, в секундах (Range: 60-3600):
RefreshActiveChecks=120
# IP-адрес источника для исходящих соединений:
# SourceIP=
# Агент будет слушать на этом порту соединения с сервером (Range: 1024-32767):
# ListenPort=10050
# Список IP-адресов, которые агент должен прослушивать через запятую
# ListenIP=0.0.0.0
# Агент будет прослушивать этот порт для запросов статуса HTTP (Range: 1024-32767):
# StatusPort=
ControlSocket=\\.\pipe\agent.sock
# Куда вести журнал (file/syslog/console):
LogType=file
LogFile=C:\zabbix-agent2-6.4.5\zabbix_agent2.log
# Размер лога от 0-1024 MB (0 - отключить автоматическую ротацию логов)
LogFileSize=100
# Уровень логирования. 4 - для отладки (выдает много информации)
DebugLevel=4

API Token

Documentation

$ip = "192.168.3.102"
$url = "http://$ip/zabbix/api_jsonrpc.php"

$data = @{
    "jsonrpc"="2.0";
    "method"="user.login";
    "params"=@{
        "username"="Admin";` в версии до 6.4 параметр "user"
        "password"="zabbix";
    };
    "id"=1;
}
$token = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result

$token = "2eefd25fdf1590ebcdb7978b5bcea1fff755c65b255da8cbd723181b639bb789" сгенерировать токен в UI (http://192.168.3.102/zabbix/zabbix.php?action=token.list)

user.get

$data = @{
    "jsonrpc"="2.0";
    "method"="user.get";
    "params"=@{
    };
    "auth"=$token;
    "id"=1;
}
$users = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result

problem.get

$data = @{
    "jsonrpc"="2.0";
    "method"="problem.get";
    "params"=@{
    };
    "auth"=$token;
    "id"=1;
}
(Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result

host.get

Получить список всех хостов (имя и id)

Endpoint host

host.create - creating new hosts
host.delete - deleting hosts
host.get - retrieving hosts
host.massadd - adding related objects to hosts
host.massremove - removing related objects from hosts
host.massupdate - replacing or removing related objects from hosts
host.update - updating hosts

$data = @{
    "jsonrpc"="2.0";
    "method"="host.get";
    "params"=@{
        "output"=@(` отфильтровать вывод
            "hostid";
            "host";
        );
    };
    "id"=2;
    "auth"=$token;
}
$hosts = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
$host_id = $hosts[3].hostid` забрать id хоста по индексу

item.get

Получить id элементов данных по наименованию ключа для конкретного хоста

$data = @{
    "jsonrpc"="2.0";
    "method"="item.get";
    "params"=@{
        "hostids"=@($host_id);` отфильтровать по хосту
    };
    "auth"=$token;
    "id"=1;
}
$items = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
$items_id = ($items | where key_ -match system.uptime).itemid` забрать id элемента данных

history.get

Получить всю историю элемента данных по его id

$data = @{
    "jsonrpc"="2.0";
    "method"="history.get";
    "params"=@{
        "hostids"=@($host_id); ` фильтрация по хосту
        "itemids"=@($items_id);` фильтрация по элементу данных
    };
    "auth"=$token;
    "id"=1;
}
$items_data_uptime = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result` получить все данные по ключу у конкретного хоста

Convert Secconds To TimeSpan and DateTime

$sec = $items_data_uptime.value

function ConvertSecondsTo-TimeSpan {
    param (
        $insec
    )
    $TimeSpan = [TimeSpan]::fromseconds($insec)
    "{0:dd' day 'hh\:mm\:ss}" -f $TimeSpan
}

$UpTime = ConvertSecondsTo-TimeSpan $sec[-1]

Convert From Unix Time

$time = $items_data_uptime.clock

function ConvertFrom-UnixTime {
    param (
        $intime
    )
    $EpochTime = [DateTime]"1/1/1970"
    $TimeZone = Get-TimeZone
    $UTCTime = $EpochTime.AddSeconds($intime)
    $UTCTime.AddMinutes($TimeZone.BaseUtcOffset.TotalMinutes)
}

$GetDataTime = ConvertFrom-UnixTime $time[-1]

($hosts | where hostid -eq $host_id).host получить имя хоста
$UpTime последнее полученное значение времени работы хоста
$GetDataTime время последнего полученного значения