diamon@truediamon.ru:~$

Windows, Linux, КПК и немного ещё.

Пакетное обновление агентов Zabbix

На днях релизнулся Zabbix 3.0, да к тому же LTS. Обновление серверной части не заняло много времени (да здравствуют репозитории!), а вот ползать по куче серверов (а их собственно за сотню) для обновления агентов было впадлу. Можно было конечно и забить, но некрасиво как-то. Поэтому на коленке был сварганен следующий скрипт.

Лень было делать параметры, мне проще один комментарий перенести. Скрипт берёт или список компов из текстового файла (по строке на хостнейм, 13 строка), или просто шерстит АД в поисках серверных виндов (12 строка), и обновляет, если версия младше, чем указана в переменной $zabbix_version (первая строка, обратите внимание на звёздочку). Лог с результатами кладёт рядом с собой.

Комментировать сий наколеночный скрипт с кучей ифов мне лень, но вроде ничего сложного в нём нет.

$zabbix_version = "3.0.0*"

$curDir = $MyInvocation.MyCommand.Definition | split-path -parent
$d=Get-Date -Format "yyyy-MM-dd"
$t=Get-Date -Format "HH:mm"
$LogFile = "$curDir\updatelog_"+$d+".log"

$log = "`n" + $d + " " + $t + " Start"
Write-Host $log
Out-File -FilePath $LogFile -Append -Encoding default -InputObject $log

Get-ADComputer -Filter {OperatingSystem -Like "Windows Server*"} -Property Name, OperatingSystem| ForEach {
#Import-CSV "$curDir\computers.csv" -header("Name") | ForEach {
	$ComputerName = $_.Name
	$path = "\\$ComputerName\c$\Program Files\Zabbix"
	Write-host $ComputerName
	if ((Test-Connection $ComputerName -quiet -count 1)) {
		if ((Test-Path $path)) {
		if ((Get-Service "zabbix agent" -ComputerName $ComputerName)) {
			$installed_zabbix_version = (Get-Item $path\zabbix_agentd.exe).versioninfo.fileversion
				if (($installed_zabbix_version -notlike $zabbix_version)) {
					$bit = (Get-WmiObject Win32_ComputerSystem -computer $ComputerName).systemtype
					if (($bit)) {

						Set-Service "zabbix agent" -ComputerName $ComputerName -Status stopped -PassThru
						if ($bit -like '*64*') {
							Copy-Item $curDir\win64\*.exe $path
							$zbit = 64
						}
						else {
							Copy-Item $curDir\win32\*.exe $path
							$zbit = 32
						}
						Set-Service "zabbix agent" -ComputerName $ComputerName -Status running -PassThru

			$msg = " - Agent updated, " + $_.OperatingSystem + ", " + $bit + ", " + $zbit
					}
					else { $msg = " - Agent not updated, unknown architecture or RPC is unavailable " + $bit }
			}
			else { $msg = " - already updated " + $installed_zabbix_version}
		}
		else { $msg = " - Agent not installed" }
		}
		else { $msg = "- Zabbix folder not exist" }
	}
	else { $msg = " is not available" }
$log = $d + " " + $t + " " + $ComputerName + $msg
Write-Host $log
Out-File -FilePath $LogFile -Append -Encoding default -InputObject $log
}

$log = $d + " " + $t + " All done"
Write-Host $log
Out-File -FilePath $LogFile -Append -Encoding default -InputObject $log