diff --git a/src/content/blog/05-zabbix-api.md b/src/content/blog/05-zabbix-api.md new file mode 100644 index 0000000..1c8e24c --- /dev/null +++ b/src/content/blog/05-zabbix-api.md @@ -0,0 +1,217 @@ +--- +title: "Группоые политики GPO для Zabbix Agent используя магию API" +summary: "Небольшой гайд по созданию готового скрипта для автоматизации добавление новых устройств в доменной сети" +date: "June 12 2024" +draft: false +tags: +- Windows +- Zabbix +- API +- Monitoring +--- + +# Пролог + +Круто когда у тебя собираються метрики со всех устройст в сети, но не круто если у тебя уже есть зоопарк более 10х устройств и ты только решил что тебе нужен мониториг, а если есть 100х устройств... Мда придеться поклацать мышкой это уж точно! +Но что мы за админы если не умеем правильно лениться, давайте соберем небольшой скрипт и добавим его в GPO и пусть часть работы за нас делает машина. + +## Подготовка +1. На сервере zabbix создаем новую группу куда будут новые хосту валиться, например `NewHosts`, запишите id группу пригоидиться дальше, (в url строке посдение цыфры и будут id). + +2. Генерим токен, для подключения к заббикс api. Для этого перейдем в настройки пользователя, пункт API Tokens. + +3. Определяет переменные сервера для скрипта: + +``` ps1 +# Zabbix server: +$ZBX_SERVER = "192.168.0.2:8080" +$ZBX_SERVER_INSTALL = "192.168.0.2" +$ZBX_API = "http://$ZBX_SERVER/api_jsonrpc.php" +$ZBX_TOKEN = "b1c4f904b2b56a342912dd0c44c890cd35dcac1f69e72cb23c765d8feaf85f0a" +$ZBX_TEMPLATE = "Windows by Zabbix agent" +$ZBX_HOSTGRP = "NewHosts" +``` + +- $ZBX_SERVER - адрес zabbix-сервера для URL +- $ZBX_SERVER_INSTALL - адрес zabbix-сервера для msi пакета +- $ZBX_API - адрес API zabbix-сервера. +- $ZBX_TOKEN - Токен API zabbix, который мы сгенерили на этапе подготовки. +- $ZBX_TEMPLATE - в значении этой переменной указывается шаблон мониторинга из zabbix. +- $ZBX_HOSTGRP - группа (NewHosts), которую создали на этапе подготовки. + +4. Определяет переменные хоста для скрипта: + +``` ps1 +# Host vars: +$HOSTIP = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.InterfaceAlias -imatch "Ethernet"}).IPAddress.toString() +$HOSTDNS = ([System.Net.Dns]::GetHostByName($env:computerName).HostName).tolower() +$HOSTNAME = $env:computerName.ToUpper() +$AGENT_PORT = "10050" +``` + +- $HOSTIP - IP адрес устройства. +- $HOSTDNS - DNS имя устройства. +- $HOSTNAME - Имя добавляемого устройства. +- $AGENT_PORT - порт, на котором слушает zabbix agent. + +Я уже прописал скрипт для автоматического заполнения, но вы всегда можете взять отдельные куски кода и запихаь их в терминал. + +5. Определяет функцию для скрипта: + +``` ps1 +function RegisterNewHost() { + $REQ_PARAMS = @{ + jsonrpc = "2.0" + method = "host.create" + params = @{ + host = $HOSTNAME + interfaces = @( + @{ + type = 1 + main = 1 + useip = 0 + ip = $HOSTIP + dns = $HOSTDNS + port = $AGENT_PORT + } + ) + groups = @( + @{ + groupid = "24" + } + ) + templates = @( + @{ + templateid = "10081" + } + ) + } + id = 1 + auth = $ZBX_TOKEN + } | ConvertTo-Json -Depth 5 + $uri = $ZBX_API + $headers = @{ + "Content-Type" = "application/json" + } + $method = "Post" + + Invoke-WebRequest -Uri $uri -Headers $headers -Method $method -Body $REQ_PARAMS +} +``` + +- groupid - укажите обязательно id группы вашего созданной в начале +- templateid - Укажите шаблон для добавление 10081 по умолчанию "Windows by Zabbix agent" +- useip - Значение определяет что будет индефкатором для хоста =0 будет DNS, =1 будет IP адрес + +6. Функция установки msi пакета + +``` ps1 +function InstallZbxAgent() { + msiexec /i \\fs1\soft\Monitoring\zabbix_agent2-openssl.msi /qn SERVER=$ZBX_SERVER_INSTALL LISTENPORT=$AGENT_PORT HOSTNAME=$HOSTNAME +} +``` + +- \\fs1\soft\Monitoring\ - указываем путь до установочного файла. + +Из основного все, остается только добавить в скрипт проверку, на тот случай если заббикс агент уже установлен. И указать так называемый - entry point для скрипта. + +``` +if (!(Test-Path -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent") -and !(Test-Path -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent 2")) { + InstallZbxAgent + RegisterNewHost +} +``` + +### Готовый скрипт + +Примерно будет выглядеть так + +``` ps1 +# Zabbix server vars: +$ZBX_SERVER = "172.16.0.22:8080" +$ZBX_SERVER_INSTALL = "172.16.0.22" +$ZBX_API = "http://$ZBX_SERVER/api_jsonrpc.php" +$ZBX_TOKEN = "b1c4f904b2b56a342912dd0c44c890cd35dcac1f69e72cb23c765d8feaf85f0a" +$ZBX_TEMPLATE = "Windows by Zabbix agent" +$ZBX_HOSTGRP = "Unassigned" +# Host vars: +$HOSTIP = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.InterfaceAlias -imatch "Ethernet"}).IPAddress.toString() +$HOSTDNS = ([System.Net.Dns]::GetHostByName($env:computerName).HostName).tolower() +$HOSTNAME = $env:computerName.ToUpper() +$AGENT_PORT = "10050" + +echo "$HOSTIP/$HOSTNAME" + +function RegisterNewHost() { + $REQ_PARAMS = @{ + jsonrpc = "2.0" + method = "host.create" + params = @{ + host = $HOSTNAME + interfaces = @( + @{ + type = 1 + main = 1 + useip = 0 + ip = $HOSTIP + dns = $HOSTDNS + port = $AGENT_PORT + } + ) + groups = @( + @{ + groupid = "24" + } + ) + templates = @( + @{ + templateid = "10081" + } + ) + } + id = 1 + auth = $ZBX_TOKEN + } | ConvertTo-Json -Depth 5 + $uri = $ZBX_API + $headers = @{ + "Content-Type" = "application/json" + } + $method = "Post" + + Invoke-WebRequest -Uri $uri -Headers $headers -Method $method -Body $REQ_PARAMS + # Для отладки, можно удалить следующую строку. + echo "good" $REQ_PARAMS +} + +RegisterNewHost + +function InstallZbxAgent() { + echo "start install" + msiexec /i \\fs1.mczdorovie.lan\soft\Monitoring\zabbix_agent2-openssl.msi /qn SERVER=$ZBX_SERVER_INSTALL LISTENPORT=$AGENT_PORT HOSTNAME=$HOSTNAME + +} + +InstallZbxAgent + +if (!(Test-Path -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent") -and !(Test-Path -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent 2")) { + InstallZbxAgent + RegisterNewHost +} +``` + +### Добавляем скрипт в политику + +``` bash + +## Script name: +%windir%\System32\WindowsPowerShell\v1.0\powershell.exe + +## Script parameters: +-Noninteractive -ExecutionPolicy Bypass -Noprofile -file "\\DC01\NETLOGON\zbx_agent_install.ps1" +``` + +С настройкой все закончили. Подключаемся на любой хост, и обновляем политики. Команда - gpupdate /force. + +Выводим список всех политик. Команда - gpresult /R /scope:computer + +Проверяем установку в windows и добавленное устройство на сервере. \ No newline at end of file