Деплой Zabbix-агентов на большое количество Windows-based серверов с помощью Powershell

от автора

Добрый день!
Недавно передо мной встала задача — быстро установить большое количество Zabbix-агентов на Windows-сервера.
Я решил, что это можно и нужно решать с помощью скриптов. В качестве «языка» я выбрал любимый мной (и не только мной!) Powershell.
Небольшой мануал Вы найдете под катом!

Powershell v2.0+ предлагает очень удобные средства удаленного запуска (Powershell Remoting) и я бы с удовольствием использовал бы их, но в моем случае имелась одна проблема — на «пути» могли попадаться сервера с Windows Server 2003 (без необходимых апдейтов), поэтому я принял решение использовать psexec.exe

Мне нужно было максимально автоматизированное решение, поэтому я писал такой скрипт, в который я загружаю список DNS-имен серверов из файла, а на выходе получаю XML-файл для импорта в Zabbix.

Первое, что нам надо сделать, это положить на общий ресурс папку (\\server\share\DeployZabbix), в которой будут:
1) Файл агента для x86-систем (zabbix_agentd86.exe)
2) Файл агента для x64-систем (zabbix_agentd64.exe)
3) Файл конфигурации zabbix_agentd.conf (в котором нужно указать хотя бы адрес/DNS-имя Zabbix-сервера)
4) 2 батника, Install86.bat и Install64.bat со следующим содержанием:
Install86.bat:

"C:\Program Files\Zabbix\zabbix_agentd86.exe" --config "C:\Program Files\Zabbix\zabbix_agentd.conf" --install net start "Zabbix Agent" 

Install64.bat:

"C:\Program Files\Zabbix\zabbix_agentd64.exe" --config "C:\Program Files\Zabbix\zabbix_agentd.conf" --install net start "Zabbix Agent" 

Второе, что нам потребуется, это папка, в которой будет лежать скрипт для разворачивания агентов, и все необходимое для его работы:
1) Собственно, сам скрипт DeployZabbix.ps1 (о нем ниже)
2) Три .txt-файла (Source1.txt, Source2.txt, Source3.txt) — это «куски» .xml файла, который получится на выходе. Не забудьте заменить группу «Default» на нужную Вам в тексте!

Source1.txt

<?xml version="1.0" encoding="UTF-8"?> <zabbix_export>     <version>2.0</version>     <date>2012-11-21T09:18:17Z</date>     <groups>         <group>             <name>Default</name>         </group>     </groups>     <hosts> 

Source2.txt

<proxy/>             <status>0</status>             <ipmi_authtype>-1</ipmi_authtype>             <ipmi_privilege>2</ipmi_privilege>             <ipmi_username/>             <ipmi_password/>             <templates>                 <template>                     <name>Template OS Windows</name>                 </template>             </templates>             <groups>                 <group>                     <name>Default</name>                 </group>             </groups>             <interfaces>                 <interface>                     <default>1</default>                     <type>1</type>                     <useip>0</useip>                     <ip/> 

Source3.txt

<port>10050</port>                     <interface_ref>if1</interface_ref>                 </interface>             </interfaces>             <applications/>             <items/>             <discovery_rules/>             <macros/>             <inventory/>         </host> 

3) Собственно, сам psexec.exe (взять его можно отсюда)
4) Файл computers.csv, в котором FQDN-имена серверов идут каждый с новой строчки.

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

Remove-Item .\out.txt #уберем старые файлы Remove-Item .\out.xml #уберем старые файлы copy .\Source1.txt .\out.txt #скопируем первую часть xml в новый файл #импортируем список компьютеров Import-CSV ".\computers.csv" -header("ComputerName") | ForEach { $ComputerName = $_.ComputerName #чуть-чуть упростим, мне так удобнее :) New-Item "\\$ComputerName\c$\Program Files\Zabbix" -Type Directory $path = "\\$ComputerName\c$\Program Files\Zabbix" Copy-Item \\server\share\DeployZabbix\* $path $bit = Get-WmiObject Win32_Processor -computername $ComputerName | where {$_.DeviceID -eq "CPU0"} | Select AddressWidth if ($bit -like '*64*') { .\psexec.exe \\$ComputerName "C:\\Program Files\Zabbix\Install64.bat" -h } else { .\psexec.exe \\$ComputerName "C:\\Program Files\Zabbix\Install86.bat" -h } Add-Content .\out.txt ('<host>') Add-Content .\out.txt ('<host>' + $_.ComputerName + '</host>') Add-Content .\out.txt ('<name>' + $_.ComputerName + '</name>') gc Source2.txt | Out-File .\out.txt -Append -Encoding default Add-Content .\out.txt ('<dns>' + $_.ComputerName + '</dns>') gc Source3.txt | Out-File .\out.txt -Append -Encoding default } Add-Content .\out.txt ('</hosts>') Add-Content .\out.txt ('</zabbix_export>') Rename-Item .\out.txt "out.xml"  

Можно еще добавить строчки, чтобы скрипт убирал ненужные файлы, но т.к. они весят меньше 1Мб, я заморачиваться не стал.

Затем, получившийся .xml-файл (который будет лежать в каталоге со скриптом) импортируем в список хостов в Zabbix.

Вот, собственно, и все. Надеюсь данный туториал будет хоть кому-нибудь полезен.

ссылка на оригинал статьи http://habrahabr.ru/post/168185/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *