120600
This commit is contained in:
217
src/content/blog/05-zabbix-api.md
Normal file
217
src/content/blog/05-zabbix-api.md
Normal file
@@ -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 и добавленное устройство на сервере.
|
||||
Reference in New Issue
Block a user