Пролог
Собирать метрики со всех устройств в сети — это здорово, но не так уж приятно, если у вас уже есть более 10 устройств и вы только решили, что вам нужен мониторинг. А если устройств 100 и больше? Придется много клацать мышкой! Но что мы за админы, если не умеем правильно лениться? Давайте создадим небольшой скрипт, добавим его в GPO, и пусть часть работы за нас выполняет машина.
Подготовка
-
На сервере Zabbix создаем новую группу, куда будут попадать новые хосты, например
NewHosts. Запишите ID группы — он пригодится позже (в URL строке последние цифры и будут ID). -
Генерируем токен для подключения к Zabbix API. Для этого перейдите в настройки пользователя, пункт API Tokens.
-
Определяем переменные сервера для скрипта:
# 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), которую создали на этапе подготовки.
- Определяем переменные хоста для скрипта:
# 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 агент.
Я уже прописал скрипт для автоматического заполнения, но вы всегда можете взять отдельные куски кода и запустить их в терминале.
- Определяем функцию для регистрации нового хоста:
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 адрес.
- Функция установки MSI пакета:
function InstallZbxAgent() {
msiexec /i \\fs1\soft\zabbix_agent2-openssl.msi /qn SERVER=$ZBX_SERVER_INSTALL LISTENPORT=$AGENT_PORT HOSTNAME=$HOSTNAME
}
\\fs1\soft\— указываем путь до установочного файла.
Основные шаги выполнены. Осталось добавить в скрипт проверку на случай, если Zabbix агент уже установлен, и указать так называемый 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
}
Готовый скрипт
# 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"
# 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 "debug" $REQ_PARAMS
}
RegisterNewHost
function InstallZbxAgent() {
echo "start install msi"
msiexec /i \\fs1\soft\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
}
Добавляем скрипт в политику
## Script name:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
## Script parameters:
-Noninteractive -ExecutionPolicy Bypass -Noprofile -file "\\DC1\NETLOGON\zbx_agent_install.ps1"
Настройка завершена. Подключаемся к любому хосту и обновляем политики с помощью команды gpupdate /force.
Выводим список всех политик с помощью команды gpresult /R /scope:computer.
Проверяем установку на Windows и добавление устройства на сервере.