Zabbix由淺入深之主機自動化注冊(Windows篇)
在之前的Linux篇提到了自動化安裝的原理其實也是腳本安裝,只不過安裝部分省去了部分人力重復工作,但是Windows比較特殊,需要用到powershell這款自帶的軟件,這款軟件在Windows 2008版本引入后,開啟了Windows自動化的旅程,由此拉開了Windows命令行的序幕,題外話就不提了,如果感興趣可以參考官方文檔,最新的7.0還是比較強大的。
正文
思路
整體思路是通過通過ansible遠程到Windows主機,推送powershell腳本,Windows執(zhí)行powershell腳本自動拉取agent文件、替換配置、啟動一系列操作。
準備工作
由于Ansible遠程到Windows需要主機powershell版本為3.0以上,如果不是3.0的powershell需要進行升級,需要注意的是Windows 2008 R2后的版本(不包含Windows 2008 R2以前的版本)起步是4.0,所以都是滿足的。

Windows 2008 R2
1.下載framework 4.5.2以上。
這里我選擇的是4.6.1,自行互聯(lián)網(wǎng)下載。(下面相關軟件我會打包放在一起)

2.升級powershell
目前官方提供的是WMF5.1版本。安裝完成后需要重啟才行。

3.查看版本信息。
- $PSVersionTable

升級成功
開啟遠程功能
1.查看powershell執(zhí)行策略(需要管理員權限運行)
默認應該是Restricted,需要改為remotesigned,這么做有什么意義?如果不改為該值會出現(xiàn)PS腳本無法執(zhí)行。
- get-executionpolicy
- set-executionpolicy remotesigned
遇到這樣的報錯證明沒有用管理員身份運行

輸入Y即可
2.啟動遠程管理功能。
啟動遠程管理服務(winrm),輸入y即可
- winrm quickconfig

3.啟用認證。
- winrm set winrm/config/service/auth '@{Basic="true"}'
- winrm set winrm/config/service '@{AllowUnencrypted="true"}'

Ansible連接測試
1.安裝pywinrm,此處出問題的朋友估計是pip工具沒有或者其他原因,自行互聯(lián)網(wǎng)搜索
- pip3 install pywinrm
2.編寫ansible hosts文件
- vi /etc/ansible/hosts
- [window]
- 192.168.31.82
- [window:vars]
- ansible_ssh_user="Administrator"
- ansible_ssh_pass="123.com"
- ansible_ssh_port=5985
- ansible_connection="winrm"
- ansible_winrm_server_cert_validation=ignore
3.ansible ping 測試
- ansible window -m win_ping

PS腳本
下面的腳本粘貼到.ps1后綴的文件里(文件自行創(chuàng)建)
這里需要注意的是在獲取文件的時候注意版本,這里我采用的是Zabbix 5.4的agent v2版本,如果你的版本非次版本,則需要去官網(wǎng)查看,如下面的圖二和圖三,另外agent2和agent也有所區(qū)別,如果懶癌的朋友可以找我要不同版本對應的腳本,否則執(zhí)行會報錯,我相信大家都會一點powershell的語法,畢竟我們都是站在巨人的肩膀上。
- mkdir C:\zabbix
- invoke-webrequest -uri https://cdn.zabbix.com/zabbix/binaries/stable/5.4/5.4.2/zabbix_agent2-5.4.2-windows-amd64-openssl-static.zip -outfile C:\zabbix\zabbix-win.zip
- $file = "C:\zabbix\zabbix-win.zip"
- $shell = New-Object -ComObject shell.application
- $zip = $shell.NameSpace($file)
- $dest = $shell.NameSpace((Split-Path $file -Parent))
- $dest.CopyHere($zip.Items())
- Copy-Item C:\zabbix\bin\*.exe C:\zabbix\
- Copy-Item C:\zabbix\conf\*.conf C:\zabbix\
- Rename-Item C:\zabbix\zabbix_agent2.conf zabbix_agentd.conf
- Rename-Item C:\zabbix\zabbix_agent2.exe zabbix_agentd.exe
- Remove-Item C:\zabbix\zabbix-win.zip
- $conf= Get-Content C:\zabbix\zabbix_agentd.conf -Encoding UTF8
- $conf= $conf.Replace("LogFile=c:\zabbix_agentd.log", "LogFile=c:\zabbix\zabbix_agentd.log")
- $conf= $conf.Replace("Server=127.0.0.1", "Server=192.168.31.137")
- $conf= $conf.Replace("ServerActive=127.0.0.1", "ServerActive=192.168.31.137:10051")
- $conf= $conf.Replace("Hostname=Windows host", "Hostname=${Env:COMPUTERNAME}")
- #$conf= $conf.Replace("# HostnameItem=system.hostname", "HostnameItem=system.hostname")
- $conf= $conf.Replace("# HostMetadata=", "HostMetadata=")
- [IO.File]::WriteAllLines("C:\zabbix\zabbix_agentd.conf", $conf)
- cd C:\zabbix\
- .\zabbix_agentd.exe -i -c C:\zabbix\zabbix_agentd.conf
- .\zabbix_agentd.exe -s -c zabbix_agentd.conf

選擇zip包

下載地址
推送腳本并安裝
1.編寫playbook,一定要注意格式
- ---
- - hosts: window
- tasks:
- - name: pull
- win_copy: 'src=/root/install.ps1 dest=c:/'
- - name: install
- win_shell: "c:/install.ps1"
2.執(zhí)行playbook
- ansible-playbook window.yml

執(zhí)行效果
Zabbix前端操作
由于此前在Linux篇已經(jīng)講過了,此處不再細講,下圖代表條件為主機名包含K進行自動注冊,動作為添加主機、添加到主機組、鏈接到模板。

遇到的問題
如果在測試過程中遇到下列問題,大概率是防火墻的問題,需要放開入方向10050端口或者采用主動模式即可,另外在08以后的版本可以通過powershell關閉,這里不再演示,我會在附件里提供。

最終效果

Windows 2008 R2

ansible推送剩下的Windows機器

寫在最后
其實整體來講,Windows的操作相對較復雜,因為需要手動開啟遠程的一些功能,所以與其說是自動化倒不如說是腳本安裝更為合適,只不過可以批量,也許是我才疏學淺,還有更好的方式去實現(xiàn),但思想應該是沒錯的,只不過是換種更簡便的方式,那么自動化注冊部分到這里該結束了。