Парадокс нашей админской жизни - как бы мы не стремились в Unixway, все равно приходится админить сервера на Windows. Вообщем и эта заметка будет про автоматизацию процесса установки zabbix-агентов на windows сервера.
Собственно раскатывать агентов будем через груповые политики AD, ранее я уже писал об этом в прошлых заметках. Остается только придумать как реализовать процесс добавления хоста в заббикс. Этот поинт будем решать, через скриптец, который напишем далее.
Подготовка
На стороне заббикс-сервера, нужно внести некоторые приготовления. По моему замыслу, все новые хосты должны назначаться в определенную группу, и далее администратор заббикса распределит хосты по нужным группам. Поэтому создаем хост-группу - Unassigned
:
Отлично группа добавлена, давайте теперь сгенерим токен, для подключения к заббикс api. Для этого перейдем в настройки пользователя, пункт API Tokens
.
В новом окне добавляем токен:
Указываем имя для токена, и описание для удобства. Также в зависимости от вашей политики безопасности, можно указать дату когда токен протухнет.
В следующем окне копируем токен, и сохраняем его к себе.
Скриптец на добавление
Теперь давайте напишим скриптец, который будет автоматом добавлять наши хосты в 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. Ну и для проверки запускаем скриптец, что бы убедиться в корректности его работы.
В ответе видим статускод 200, и в значении поля content указан результат запроса:
StatusCode : 200
StatusDescription : OK
Content : {"jsonrpc":"2.0","result":{"hostids":["11126"]},"id":1}
RawContent : HTTP/1.1 200 OK
Идем на заббикс сервер, и ищем наш хост.
Создание груповой политики
С сайта zabbix качаем установочный пакет с агентом. Установочный пакет размещаем на доступной шаре.
Выставляем на файл права чтение/выполнение.
Инсталятор запускать будем из-под скрипта, поэтому вносим изменения. Ну для начала действия по добавлению хоста в 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 репу.
Ну и заклютельным этапом, остается создать новую групповую политику, в которой будем запускать уже готовый сценарий.
Открываем редактор групповых политик, создаем новую политику в контейнере с серверами.
Отредактируем политику:
В новом окне проваливаемся внутрь -> Computer Configuration
, Policies
, Windows Settings
, Scripts (Startup/Shutdown)
.
Открываем Startup
properties, во вкладке Scripts
добавляем новый скрипт (Кнопка Add). В новом окне прописываем путь к powershell, а в параметрах к запускаемой программе указываем путь до скрипта:
## Script name:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
## Script parameters:
-Noninteractive -ExecutionPolicy Bypass -Noprofile -file "\\DC01\NETLOGON\zbx_agent_install.ps1"
Сохраняемся и выходим.
Теперь если посмотреть вьюху групповой политики, нас будет ждать что-то вроде этого:
Наш готовый скриптец закидываем в каталог, который указывали в параметрах startup скрипта:
С настройкой все закончили. Подключаемся на любой хост, и обновляем политики. Команда - gpupdate /force
.
Выводим список всех политик. Команда - gpresult /R /scope:computer
Что бы протестировать работу процесса, я поднял временно виртуалку, добавил ее в домен и перенес в контейнер с серверами.
После ввода тачки в домен, перезапускаем сервер и смотрим.
Агент установился.
Смотрим на стороне zabbix-сервер:
Хост создался.
Отлично, мы успростили себе немного жизнь =)