Вернуться в blog
12 июн. 2024 г.
5 min read

# Групповые политики GPO для Zabbix Agent с использованием магии API

Краткое руководство по созданию скрипта для автоматизации добавления новых устройств в доменной сети

# Пролог

Собирать метрики со всех устройств в сети — это здорово, но не так уж приятно, если у вас уже есть более 10 устройств и вы только решили, что вам нужен мониторинг. А если устройств 100 и больше? Придется много клацать мышкой! Но что мы за админы, если не умеем правильно лениться? Давайте создадим небольшой скрипт, добавим его в GPO, и пусть часть работы за нас выполняет машина.

## Подготовка

1. На сервере Zabbix создаем новую группу, куда будут попадать новые хосты, например `NewHosts`. Запишите ID группы — он пригодится позже (в URL строке последние цифры и будут ID).

2. Генерируем токен для подключения к Zabbix API. Для этого перейдите в настройки пользователя, пункт API Tokens.

3. Определяем переменные сервера для скрипта:

    # 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. Определяем переменные хоста для скрипта:

    # 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 агент.

Я уже прописал скрипт для автоматического заполнения, но вы всегда можете взять отдельные куски кода и запустить их в терминале.

5. Определяем функцию для регистрации нового хоста:

    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 пакета:

    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 и добавление устройства на сервере.

Prev
Хватит терять заявки пользователей
Next
Активация Windows в организации через KMS server