Парадокс нашей админской жизни - как бы мы не стремились в Unixway, все равно приходится админить сервера на Windows. Вообщем и эта заметка будет про автоматизацию процесса установки zabbix-агентов на windows сервера.

Собственно раскатывать агентов будем через груповые политики AD, ранее я уже писал об этом в прошлых заметках. Остается только придумать как реализовать процесс добавления хоста в заббикс. Этот поинт будем решать, через скриптец, который напишем далее.

Подготовка

На стороне заббикс-сервера, нужно внести некоторые приготовления. По моему замыслу, все новые хосты должны назначаться в определенную группу, и далее администратор заббикса распределит хосты по нужным группам. Поэтому создаем хост-группу - Unassigned : zbx-auto-install-pic1.png

Отлично группа добавлена, давайте теперь сгенерим токен, для подключения к заббикс api. Для этого перейдем в настройки пользователя, пункт API Tokens. zbx-auto-install-pic2.png

В новом окне добавляем токен: zbx-auto-install-pic3.png

Указываем имя для токена, и описание для удобства. Также в зависимости от вашей политики безопасности, можно указать дату когда токен протухнет. zbx-auto-install-pic4.png

В следующем окне копируем токен, и сохраняем его к себе.

Скриптец на добавление

Теперь давайте напишим скриптец, который будет автоматом добавлять наши хосты в zabbix-сервер. По причине того, что эта реализация для windows серверов, скриптец будем писать на Powershell.

Написание нашей портянки, начнем с объявления списка переменных.:

# Zabbix server vars: 
$ZBX_SERVER = "zabbix.local"
$ZBX_API = "http://$ZBX_SERVER/api_jsonrpc.php"
$ZBX_TOKEN = "sdalmin15..........91h51insaf"
$ZBX_TEMPLATE = "Windows by Zabbix agent"
$ZBX_HOSTGRP = "Unassigned"
  • $ZBX_SERVER - адрес zabbix-сервера
  • $ZBX_API - адрес апишки zabbix-сервера, как можно заметить в строку адреса добавляется переменная - $ZBX_SERVER. Думаю, что значение этой переменной по большой части будет статичное. За исключением, если придеться поправить uri строку.
  • $ZBX_TOKEN - тут указывается токен к api заббикса, который мы сгенерили на этапе подготовки.
  • $ZBX_TEMPLATE - в значении этой переменной указывается шаблон мониторинга из заббикса. Как ранее я говорил, здесь будем использовать шаблон для мониторинга винды через агента.
  • $ZBX_HOSTGRP - группа (Unassigned), которую создали на этапе подготовки.

Далее идет блок с объявлением переменных с данными добавляемого хоста. Я временно захардкодил значения, в последующем в эти значения мы будем передавать аргументы.

# Host vars:
$HOSTIP = "1.1.1.1"
$HOSTNAME = "TEst-api"
$AGENT_PORT = "10050"
  • $HOSTIP - адрес сервера, который мы хотим добавить.
  • $HOSTNAME - имя добавляемого сервера.
  • $AGENT_PORT - порт, на котором слушает заббикс агент.

Теперь нужно набросать запрос на добавление нового хоста. Поэтому объявляем новый массив.

$REQ_PARAMS = @{
    body =  @{
        "jsonrpc"= "2.0"
        "method"= "host.create"
        "params"= @{
            "host"= $HOSTNAME
            "interfaces"= @(
                @{
                "type"= 1
                "main"= 1
                "useip"= 1
                "ip"= $HOSTIP
                "dns"= ""
                "port"= $AGENT_PORT
                }
            )
            "groups"= @(
                @{
                "groupid"= "90"
                }
            )
        }
        "id"= 1
        "auth"= $ZBX_TOKEN
    } | ConvertTo-Json -Depth 5
    uri = "$ZBX_API"
    headers = @{"Content-Type" = "application/json"}
    method = "Post"
}

В данном массиве, мы указываем основные параметры. Это метод запроса - POST, в хедере - поле content-type, адрес сервера и в теле запроса - json-ка. Как видно из этого сниппета, в значении body объявляется массив с описанием объекта, который в дальнейшем конвертируется в json. В документации по api заббикса, описывается какие поля нужно использовать для вызова того или иного метода.

Основная часть работы проделана, все необходимые данные определены. Теперь остается только выполнять запрос в скрипте. Для этого воспользуемся командлетов powershell - Invoke-WebRequest, это некий аналог curl.

Invoke-WebRequest @REQ_PARAMS

Командлету передаем запрос, который написали ранее.

С написанием все, файл с криптецким выложил в gitlab. Ну и для проверки запускаем скриптец, что бы убедиться в корректности его работы. zbx-auto-install-pic5.png

В ответе видим статускод 200, и в значении поля content указан результат запроса:

StatusCode        : 200
StatusDescription : OK
Content           : {"jsonrpc":"2.0","result":{"hostids":["11126"]},"id":1}
RawContent        : HTTP/1.1 200 OK

Идем на заббикс сервер, и ищем наш хост. zbx-auto-install-pic6.png

Создание груповой политики

С сайта zabbix качаем установочный пакет с агентом. Установочный пакет размещаем на доступной шаре. zbx-auto-install-pic7.png Выставляем на файл права чтение/выполнение.

Инсталятор запускать будем из-под скрипта, поэтому вносим изменения. Ну для начала действия по добавлению хоста в zabbix выносим в отдельную функцию:

function RegisterNewHost() {
    $REQ_PARAMS = @{
    body =  @{
        "jsonrpc"= "2.0"
        "method"= "host.create"
        "params"= @{
            "host"= $HOSTNAME
            "interfaces"= @(
                @{
                "type"= 1
                "main"= 1
                "useip"= 1
                "ip"= $HOSTIP
                "dns"= ""
                "port"= $AGENT_PORT
                }
            )
            "groups"= @(
                @{
                "groupid"= "90"
                }
            )
        }
        "id"= 1
        "auth"= $ZBX_TOKEN
    } | ConvertTo-Json -Depth 5
    uri = "$ZBX_API"
    headers = @{"Content-Type" = "application/json"}
    method = "Post"
    }

    Invoke-WebRequest @REQ_PARAMS
}

Теперь пишем функцию, которая будет запускать инсталятор:

function InstallZbxAgent() {
    msiexec /i \\dc01\agents\zabbix_agent2-6.0.14-windows-amd64-openssl.msi /qn SERVER=$ZBX_SERVER LISTENPORT=$AGENT_PORT HOSTNAME=$HOSTNAME      
}

В теле функции запускается установка msi-пакета, с агрументами. В качестве аргументов указывается сервер заббикса, порт и имя хоста.

Изменения также коснулись и переменных, в значения которых ранее мы хардкодили ip и fqdn:

# Host vars:
$HOSTIP = (Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias Ethernet).IPAddress.toString()
$HOSTNAME = ([System.Net.Dns]::GetHostByName($env:computerName).HostName).tolower()
$AGENT_PORT = "10050"

В значение переменной $HOSTIP - указывается результат выполнения командлета Get-NetIPAddress. А в значение переменной $HOSTNAME - FQDN сервера из окружения.

Из основного все, остается только добавить в скрипт проверку, на тот случай если заббикс агент уже установлен. И указать так называемый - 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 Agent и Zabbix Agent 2, то выполнить функции - InstallZbxAgent и RegisterNewHost. Обновленную версию скрипта, также выложил в gitlab репу.

Ну и заклютельным этапом, остается создать новую групповую политику, в которой будем запускать уже готовый сценарий. Открываем редактор групповых политик, создаем новую политику в контейнере с серверами. zbx-auto-install-pic8.png

Отредактируем политику: zbx-auto-install-pic9.png

В новом окне проваливаемся внутрь -> Computer Configuration, Policies, Windows Settings, Scripts (Startup/Shutdown). zbx-auto-install-pic10.png

Открываем Startup properties, во вкладке Scripts добавляем новый скрипт (Кнопка Add). В новом окне прописываем путь к powershell, а в параметрах к запускаемой программе указываем путь до скрипта:

zbx-auto-install-pic11.png

## Script name:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe

## Script parameters:
-Noninteractive -ExecutionPolicy Bypass -Noprofile -file "\\DC01\NETLOGON\zbx_agent_install.ps1"

Сохраняемся и выходим.

Теперь если посмотреть вьюху групповой политики, нас будет ждать что-то вроде этого: zbx-auto-install-pic12.png

Наш готовый скриптец закидываем в каталог, который указывали в параметрах startup скрипта: zbx-auto-install-pic13.png

С настройкой все закончили. Подключаемся на любой хост, и обновляем политики. Команда - gpupdate /force. zbx-auto-install-pic14.png

Выводим список всех политик. Команда - gpresult /R /scope:computer zbx-auto-install-pic15.png

Что бы протестировать работу процесса, я поднял временно виртуалку, добавил ее в домен и перенес в контейнер с серверами.

После ввода тачки в домен, перезапускаем сервер и смотрим. zbx-auto-install-pic16.png Агент установился.

Смотрим на стороне zabbix-сервер: zbx-auto-install-pic17.png Хост создался.

Отлично, мы успростили себе немного жизнь =)

Полезные ссылки