Pull to refresh

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

Reading time 4 min
Views 36K
Добрый день!
Недавно передо мной встала задача — быстро установить большое количество 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.

Вот, собственно, и все. Надеюсь данный туториал будет хоть кому-нибудь полезен.
Tags:
Hubs:
+4
Comments 5
Comments Comments 5

Articles