PowerShell — Zabbix Agent Deployment Script GPO

Предлагаю вашему вниманию скрипт для автоматизированного разворачивания zabbix-agent на доменные компьютеры с помощью gpo.

Удобство в том, что при изменении файлов агента, конфига или при появлении новых скриптов, используемых агентом, агент останавливается, обновляет файлы и запускается заново. Это позволяет обновлять хоть версию самого агента, хоть его конфиг, обновляя файл на сетевой шаре, а не на каждом клиенте.

Все комментарии внесены в сам скрипт, который находится в самом конце инструкции.

Статья в стиле «краткая инструкция».

Создаем групповую политику. В ней будет несколько действий:

  1. Открытие порта для zabbix-agent 10
  2. Копирование файла скрипта на локальный компьютер (важный момент) 25
  3. Создание задачи в планировщике, выполняющейся от имени системы11
  4. Указываем путь к скрипту через переменные среды12

 

Путь к файлам агента указан в самом скрипте \\Domain\NETLOGON\DeployZabbixAgent. Сейчас чуток жалею об этом, можно было указать через аргументы в планировщике.

Сам скрипт:

 


#### Задаю переменные с именами файлов агента
$agentd_name = 'zabbix_agentd.exe'
$conf_name = 'zabbix_agentd.win.conf'
$ServiceName = 'ZabbixAgent'
#### Задаю переменные с расширениями файлов
$ScriptFiles = @('.ps1','.bat','.cmd')
$Includes = @('*.exe','*.conf','*.ps1','*.bat','*.cmd')
$Excludes = @('excludedfile1.ps1','excludedfile2.ps1','DeployZabbixAgentScript.ps1')
#### Задаю переменные с путями до исходного положения и назначения
$q = [string][char]34
$Domain = (Get-WmiObject Win32_ComputerSystem).Domain
$Source = '\\' + $Domain + '\NETLOGON' + '\DeployZabbixAgent'
#### Задаю переменные прямо во время создания папок
$Destination = (New-Item -Path $($ENV:SystemDrive+'\ZabbixAgent') -type directory -Force).FullName
$ScriptsPath = (New-Item -Path $($Destination+'\Scripts') -type directory -Force).FullName
#### Создаю хеш-таблицу с параментрами для сплаттинга в командлет LS
$ls_param_arr = @{'Recurse' = $true; 'Include' = $Includes; 'Exclude' = $Excludes}
#### Собираю список файлов с учетом расширений и исключенных имен
$LS_Source = @(ls $Source @ls_param_arr)
#### Если не удалось получить список исходных файлов, завершить скрипт
if(!$LS_Source){"The source path is not available"; exit}

$LS_Destination = @(ls $Destination @ls_param_arr)
#### Сравниваю список по имени и дате изменения файлов, затем нахожу файлы, которых нехватает в месте назначения
$diff_files = diff -ReferenceObject $LS_Source -DifferenceObject $LS_Destination -Property Name,LastWriteTime | ? {$_.SideIndicator -eq '<='}
#### Получаю имя сервиса, если он установлен в системе
$ServiceGet = (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue).Name

if($diff_files){# Если в результате сравнения найдены расхождения
	if($ServiceGet){# Если сервис установлен
		# останавливаю
		Stop-Service -Name $ServiceName
		# копирую файлы корень папки назначения
		$Copyed = Copy-Item -Path @($LS_Source | % {$_.FullName}) -Destination $Destination -Force -PassThru
		# копирую файлы, из скопированных отбираю скрипты, перекладываю во вложенную папку и запускаю сервис
		$Copyed | ? {($ScriptFiles -contains $_.Extension) -and ($Excludes -notcontains $_.Name)} | % {Move-Item -Path $_.FullName -Destination ($ScriptsPath + '\' + $_.Name) -Force }
		Start-Service -Name $ServiceName
	}else{# Если сервис не установлен
		# копирую файлы корень папки назначения
		$Copyed = Copy-Item -Path @($LS_Source | % {$_.FullName}) -Destination $Destination -Force -PassThru
		# из скопированных отбираю скрипты и перекладываю их во вложенную папку
		$Copyed | ? {($ScriptFiles -contains $_.Extension) -and ($Excludes -notcontains $_.Name)} | % {Move-Item -Path $_.FullName -Destination ($ScriptsPath + '\' + $_.Name) -Force }
		# нахожу в скопированных файлы агента
		$agentd = ( $Copyed | ? {$_.Name -eq $agentd_name } ).FullName
		$conf = ( $Copyed | ? {$_.Name -eq $conf_name} ).FullName
		$BinaryPathName = $q + $agentd + $q + ' --config ' + $q + $conf + $q
		if($agentd -and $conf){# если файлы агента найдены
			# создаю и запускаю сервис
			New-Service -Name $ServiceName -DisplayName $ServiceName -BinaryPathName $BinaryPathName -StartupType Automatic -Description 'Deployed from GPO'
			Start-Service -Name $ServiceName
		}
	}
}else{# Если в результате сравнения расхождений нет

		if($ServiceGet){# Если сервис установлен, все хорошо, можно выходить
			"Good!"
		}else{# Если сервис не установлен
			# копирую файлы корень папки назначения
			$Copyed = Copy-Item -Path @($LS_Source | % {$_.FullName}) -Destination $Destination -Force -PassThru
			# из скопированных отбираю скрипты и перекладываю их во вложенную папку
			$Copyed | ? {($ScriptFiles -contains $_.Extension) -and ($Excludes -notcontains $_.Name)} | % {Move-Item -Path $_.FullName -Destination ($ScriptsPath + '\' + $_.Name) -Force }
			# нахожу в скопированных файлы агента
			$agentd = ( $Copyed | ? {$_.Name -eq $agentd_name } ).FullName
			$conf = ( $Copyed | ? {$_.Name -eq $conf_name} ).FullName
			$BinaryPathName = $q + $agentd + $q + ' --config ' + $q + $conf + $q
			if($agentd -and $conf){# если файлы агента найдены
				# создаю и запускаю сервис
				New-Service -Name $ServiceName -DisplayName $ServiceName -BinaryPathName $BinaryPathName -StartupType Automatic -Description 'Deployed from GPO'
				Start-Service -Name $ServiceName
			}
		}
}

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s