Установка агентов Zabbix на Windows и Linux
Со стороны сервера Zabbix настроена авторегистрация устройств (если на сервер приходит активная проверка), устройства добавляются в группу Discovered hosts, автоматически назначаются шаблоны на Windows или Linux, после установки устройству нужно добавить необходимые шаблоны и добавить в группу компании, после чего удалить членство в группе Discovered hosts
Windows хосты
Установка Windows автоматизирована через RMM, требуется только поставить RMM и убедиться, что хост расположен в разделе servers (в RMM)
После автодобавления хоста в Zabbix необходимо в настройках нового хоста в Zabbix Web заполнить поле Visible name аналогично Host name, но в нижнем регистре
Если всё-таки потребуется ручная установка, ниже приведён скрипт.
Логин и пароль к FTP-хранилищу дистрибутива в скрипт не вписываются — подставьте их из менеджера паролей или передайте через переменные окружения. Не сохраняйте учётные данные в файле скрипта на рабочих станциях.
скрипт powershell
#Set variable
$uri = "ftp://files.example.com/zabbix/zabbix-agent.zip"
$DownloadZipFile = "c:\iline\zabbix-agent.zip"
$ExtractPath = "c:\iline\"
$ZabbixAgentExe = "c:\iline\zabbix-agent\zabbix_agent2.exe"
$ZabbixAgentConf = "c:\iline\zabbix-agent\zabbix_agent2.conf"
$Hostname ="Hostname="+$env:COMPUTERNAME
$ftpuser = "<логин_ftp>"
$ftppass = "<пароль_ftp>"
if(Test-Path -Path 'c:\iline\zabbix-agent') {
write 'Zabbix folder exist'
if((Get-Item 'C:\iline\zabbix-agent\zabbix_agent2.exe').VersionInfo.ProductVersion -eq '6.2.0') {
write 'Zabbix alredy latest version'
exit 0
}
else {
write 'Zabbix will be installed'
}
}
if (Get-Service "Zabbix Agent 2" -ErrorAction SilentlyContinue) {
write "Service 'Zabbix Agent 2' alredy exist, will be stopped"
sc.exe stop "zabbix agent 2" | Out-Null
write "Service 'Zabbix Agent 2' stopped"
sleep 2
}
if ($(Test-Path -Path 'c:\iline\zabbix-agent\' -ErrorAction SilentlyContinue)) {
write "Folder 'c:\iline\zabbix-agent\' alredy exist, will be removed"
Remove-Item -Recurse -Force C:\iline\zabbix-agent | Out-Null
sleep 2
}
if (Test-Path -Path "HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application\Zabbix Agent 2" -ErrorAction SilentlyContinue) {
write "Reg key 'Zabbix Agent 2' alredy exist, removing..."
Get-Item "HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application\Zabbix Agent 2" | Remove-Item -Force -Verbose
}
#Check exist dir "c:\iline\" and create
if ($(Test-Path -Path 'c:\iline\' -ErrorAction SilentlyContinue)) {
write "Folder 'c:\iline\' already exist, creating skiped"
}
else {
write "Folder 'c:\iline\' not exist, will be created"
New-Item -Path "c:\" -Name "iline" -ItemType "directory" | Out-Null
sleep 2
}
#Download zip with zabbix agent and unzip
$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($ftpuser,$ftppass)
$WebClient.DownloadFile($uri,$DownloadZipFile)
$ExtractShell = New-Object -ComObject Shell.Application
$ExtractFiles = $ExtractShell.Namespace($DownloadZipFile).Items()
+
$ExtractShell.NameSpace($ExtractPath).CopyHere($ExtractFiles)
Remove-Item $DownloadZipFile
write 'Downloading and unziping of zabbix-agent package complited'
#Check exist Zabbix Agent firewall rules
if ($( Get-NetFirewallPortFilter -erroraction 'silentlycontinue' | Where { $_.LocalPort -eq "10050-10051" })) {
write 'Firewall rule for Zabbix with 10050-10051 Ports already exists, not creating new rule'
}
else {
write 'Firewall rule for Zabbix with 10050-10051 Ports not exists, creating new rule'
New-NetFirewallRule -DisplayName "zabbix-allow-inbound-10050" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 10050-10051 -Profile Any | Out-Null
New-NetFirewallRule -DisplayName "zabbix-allow-outbound-10050" -Direction Outbound -Protocol TCP -Action Allow -LocalPort 10050-10051 -Profile Any | Out-Null
}
#Check exist SQL firewall rules for Zabbix
if ($( Get-NetFirewallRule -erroraction 'silentlycontinue' -DisplayName sql-allow-inbound-1433-zabbix | Get-NetFirewallPortFilter | Where { $_.LocalPort -eq "1433" })) {
write-host 'Firewall rule with name sql-allow-inbound-1433-zabbix already exists, not creating new rule'
}
else {
write-host 'Firewall rule with name sql-allow-inbound-1433-zabbix not exists, creating new rule'
New-NetFirewallRule -DisplayName "sql-allow-inbound-1433-zabbix" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 1433 -RemoteAddress 10.20.0.0/16 -Profile Any | Out-Null
}
#Change hostname and convert conf file to UTF8
(Get-Content $ZabbixAgentConf) -replace 'Hostname=Windows host', $Hostname | Out-File $ZabbixAgentConf
Get-Content -Encoding UTF8 $ZabbixAgentConf | Out-File -Encoding UTF8 -FilePath "$($ZabbixAgentConf)temp"
Remove-Item -Force $ZabbixAgentConf
Rename-Item "$($ZabbixAgentConf)temp" $ZabbixAgentConf
[System.IO.FileInfo] $file = Get-Item -Path $ZabbixAgentConf
$sequenceBOM = New-Object System.Byte[] 3
$reader = $file.OpenRead()
$bytesRead = $reader.Read($sequenceBOM, 0, 3)
$reader.Dispose()
#A UTF-8+BOM string will start with the three following bytes. Hex: 0xEF0xBB0xBF, Decimal: 239 187 191
if ($bytesRead -eq 3 -and $sequenceBOM[0] -eq 239 -and $sequenceBOM[1] -eq 187 -and $sequenceBOM[2] -eq 191) {
$utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($ZabbixAgentConf, (Get-Content $ZabbixAgentConf), $utf8NoBomEncoding)
}
write "Hostname in config file changed to '$Hostname'"
#Instal Zabbix Agent service and configuration
if (Get-Service "Zabbix Agent 2" -ErrorAction SilentlyContinue) {
write "Service 'Zabbix Agent 2' alredy exist, service will be configured"
sleep 2
sc.exe failure "zabbix agent 2" reset= 86400 actions= restart/60000/restart/60000/restart/60000 | Out-Null
write "Service 'Zabbix Agent 2' configuration complited"
sc.exe start "zabbix agent 2" | Out-Null
write "Service 'Zabbix Agent 2' started"
sleep 2
}
else {
write "Service 'Zabbix Agent 2' not exist, installing"
cmd.exe /c $ZabbixAgentExe --config $ZabbixAgentConf --install | Out-Null
write "Service 'Zabbix Agent 2' installation completed"
sc.exe failure "zabbix agent 2" reset= 86400 actions= restart/60000/restart/60000/restart/60000 | Out-Null
write "Service 'Zabbix Agent 2' configuration complited"
sleep 2
sc.exe start "zabbix agent 2" | Out-Null
write "Service 'Zabbix Agent 2' started"
sleep 2
}
Этапы:
- проверка существования папки 'c:\iline\zabbix-agent', если не существует, создается
- проверка существования zabbix-agent2.exe и его версии, сравнение с текущей
- если требуется установка или обновление:
- проверка, запущена ли служба, остановка
- проверка существования папки 'c:\iline\zabbix-agent\', удаление
- проверка ключа реестра отвечающего за логирование, если существует, удаляется
- проверка существования папки 'c:\iline\', если не существует, создается
- скачивание актуального архива с агентом с нашего ftp, распаковка
- проверка правил firewall, если не существуют, создаются
- заменяется hostname в конфиг файле на имя текущего хоста
- выполняется установка и настройка параметров службы
Linux хосты
В процессе установки происходит запрос необходимости сменить имя хоста для zabbix, если необходимо, чтобы оно отличалось от системного имени
Команда установки (скачиваем, делаем исполняемым, запускаем, после выполнения удаляем):
wget https://files.example.com/files/scripts/zabbix-linux.sh && sudo chmod +x zabbix-linux.sh && ./zabbix-linux.sh && rm zabbix-linux.sh
скрипт bash
#!/bin/bash
sudo apt install -y lsb-release
lsb_strin=$(lsb_release -d)
debian_repo=$(lsb_release -d | sed -e 's/Description://g' -e 's/ //g' -e 's/GNU\/Linux//g' -e 's/(.*//' | tr [:upper:] [:lower:])
ubuntu_repo=$(lsb_release -d | sed -e 's/Description://g' -e 's/ //g' -e 's/\./%/2' -e 's/%.*//' | tr [:upper:] [:lower:])
zbx_hostname=$(hostname)
if [[ $lsb_strin == *"Debian"* ]]; then
repo=$(lsb_release -d | sed -e 's/Description://g' -e 's/ //g' -e 's/GNU\/Linux//g' -e 's/(.*//' | tr [:upper:] [:lower:])
distrib="debian"
elif [[ $lsb_strin == *"Ubuntu"* ]]; then
repo=$(lsb_release -d | sed -e 's/Description://g' -e 's/ //g' -e 's/\./%/2' -e 's/%.*//' | tr [:upper:] [:lower:])
distrib="ubuntu"
fi
if [[ $(dpkg -l | grep zabbix-agent2) ]]; then
echo "Zabbix alredy installed, aborting"
echo "------"
echo "$(dpkg -l | grep zabbix-agent2)"
exit
fi
repo_uri=https://repo.zabbix.com/zabbix/6.4/$(echo ${distrib})/pool/main/z/zabbix-release/zabbix-release_6.4-1+$(echo ${repo})_all.deb
repo_file=zabbix-release_6.4-1+$(echo ${repo})_all.deb
wget $repo_uri
sudo dpkg -i $repo_file
rm -f $repo_file
sudo apt update && sudo apt-get install -y zabbix-agent2
mark=0
while [[ $mark -eq 0 ]]
do
echo "------"
read -p "'$zbx_hostname' - current hostname, want to change hostname for zabbix? [Y/n] " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
read -p "Enter new hostname:" -r zbx_hostname
echo "'$zbx_hostname' - hostname set"
mark=1
elif [[ $REPLY =~ ^[Nn]$ ]]; then
echo "'$zbx_hostname' - hostname set"
mark=1
elif [[ $REPLY =~ ^[A-MO-Za-mo-z]$ ]]; then
echo "------"
echo "wrong key"
mark=0
fi
done
echo $zbx_hostname
sudo sed -i 's/Server=127.0.0.1/Server=10.20.0.0\/16/' /etc/zabbix/zabbix_agent2.conf
sudo sed -i 's/ServerActive=127.0.0.1/ServerActive=10.20.2.4/' /etc/zabbix/zabbix_agent2.conf
sudo sed -i "s/Hostname=Zabbix server/Hostname=${zbx_hostname}/" /etc/zabbix/zabbix_agent2.conf
sudo sed -i 's/# HostMetadataItem=/ \nHostMetadataItem=system.uname/' /etc/zabbix/zabbix_agent2.conf
sudo systemctl restart zabbix-agent2 && sudo systemctl enable zabbix-agent2
Этапы:
- проверяется установлен ли zabbix-agent2
- если zabbix-agent2 не установлен:
- определяется дистрибутив, Debian или Ubuntu
- скачивается необходимый пакет с репозиторием, устанавливается
- обновляется список пакетов, устанавливается zabbix-agent2
- запрос замены имени хоста, при необходимости (требуется ручное подтверждение)
- замена параметров в конфигурационном файле
- активация автозапуска и запуск службы