В этом посте я расскажу о методе, который применил для обновления агента Zabbix на >300 машинах в домене с помощью скрипта PowerShell и групповых политик.
Изначально задача звучала просто: обновить конфигурационный файл и исполняемый файл самого агента Zabbix. Простая замена файла zabbix_agentd.exe (и сопутствующих ему), само собой, возможна только после остановки процесса программы, а с файлом конфигурации проблема только одна — он должен содержать имя текущего хоста, на котором установлен агент. Простое копирование отпадает. Кроме того, необходимо предусмотреть и соответствие разрядности агента и операционной системы.
Решать данную задачу хорошо бы автоматизировано, поэтому предпочтительней смотреть в сторону PS1 и групповых политик.
Для начала я разместил на общем сетевом ресурсе папку с исходными файлами агента. Внутри создал каталоги для разных разрядностей (папки х64 и х86). В каталогах разрядностей, в свою очередь, создал папку zabbix. По умолчанию, путь установки для клиентских хостов будет C:/zabbix.

Теперь реализация задачи на PowerShell. Общая логика скрипта разделена на условные блоки и снабжена комментариями, но по блоку установки агента нужно пройтись отдельно.
# Адрес Zabbix на целевом ПК #
$zabbixdir = "C:\zabbix"
$configfile = "C:\zabbix\zabbix_agentd.win.conf"
$path = "C:\"
# Установочные файлы Zabbix #
$zabbix64 = "\\server\zabbixinstall\x64\zabbix"
$zabbix86 = "\\server\zabbixinstall\x86\zabbix"
# Получить имя хоста и версию ОС #
$hostname = ([System.Net.Dns]::GetHostByName($env:computerName).HostName).ToLower()
$os = (Get-WmiObject Win32_OperatingSystem).Caption
$oldhost = "Hostname=namepc"
$newhost = "Hostname=" + $hostname
# Переменные индикации #
$indicator = "C:\zabbix\indicator.txt"
$testpath = Test-Path -PathType Leaf -Path $indicator
# Установка агента #
if (!$testpath)
{
if (Get-Service -Name "Zabbix Agent" -ErrorAction SilentlyContinue) { Stop-Service -Name "Zabbix Agent" -Force -ErrorAction Ignore }
Remove-Item -Path $zabbixdir -Recurse -Force -ErrorAction Ignore
if ((Get-WmiObject win32_operatingsystem | select osarchitecture).osarchitecture -like "64*")
{ #x64
Copy-Item -Path $zabbix64 -Destination $path -Force -Recurse -ErrorAction Ignore
}
else
{ #x86
Copy-Item -Path $zabbix86 -Destination $path -Force -Recurse -ErrorAction Ignore
}
(Get-Content $configfile) -replace $oldhost, $newhost | Out-File $configfile -ErrorAction Ignore -Encoding ASCII
if (Get-Service -Name "Zabbix Agent" -ErrorAction SilentlyContinue) { Start-Service -Name "Zabbix Agent" -ErrorAction Ignore }
}
Прежде всего, скрипт проверяет наличие службы и если она есть и запущена — останавливает её. Далее удаляется папка с уже установленным агентом. Теперь копируются новые файлы агента, учитывая разрядность операционной системы. После того, как файлы будут скопированы — в конфигурации заменяется строка с конструкцией Hostname=namepc на Hostname=имя_текущего_хоста.домен. В завершении, скрипт попытается запустить службу zabbix.
Для того, чтобы отделить компьютеры с обновлённым агентом zabbix от тех, которые (по каким-то причинам) обновиться не смогли, я использовал индикаторный файл — indicator.txt. Если скрипт находит его в папке с агентом — значит агент уже обновлён и ничего делать не следует.
Приведённый выше скрипт надо установить в политиках автозагрузки сценариев PowerShell в конфигурации компьютера.
После нескольких этапов тестирования, пришёл к выводу, что возможную установку агента лучше вынести в отдельный скрипт. Примечательно, что отработка на машинах с уже активной службой вернёт код наличия службы и ничего делать не станет. Этот же скрипт лучше поместить в политику конфигурации пользователя при входе в систему.
& C:\zabbix\zabbix_agentd.exe --config C:\zabbix\zabbix_agentd.win.conf --install
После регистрации службы — можно перезапустить машину и служба агента запустится.