更新:
后來在實際使用中發現,與其使用zabbix自動注冊,不如直接調用zabbix的api主動發起添加服務器的請求,這樣就不需要在zabbixserver上配置host信息了。實現全自動。具體調用方式見
https://www.zabbix.com/documentation/3.2/manual/api/reference/host/create
前言:
zabbix監控在小規模的時候,可以使用手動一台台添加服務器,到了大規模以后,就不合適了,這時候需要使用zabbix的自動發現或者自動注冊,自動發現可以自動發現一個網段內的agent機器,而我們公司使用的aws,所有服務器都不在一個網段內,故這里采用自動注冊,自動注冊是由agent主動想server發起注冊請求。
自動注冊的一個難點在於agent的配置文件修改,雲服務器通常是通過使用模板克隆出來的,如果需要手動去服務器上修改agent的hostname,那么自動注冊就沒有意義了。這里我們采用ansible,根據agent主動注冊上來的消息特征,將特定的agent配置文件發送給agent使用,實現無需連接agent就可以實現修改agent配置文件。
實現思路:
windows服務器使用zabbixagent模板配置文件(設置hostname=new)——添加自動注冊事件,發現有叫做hostname=new的客戶端鏈接——調用ansible,根據對應策略,將正確的agent配置文件發送給agent,並重啟zabbix_agentd——zabbixagent重新上報注冊事件——zabbix發現新的名字的agent注冊——根據名字添加模板,添加監控。
環境准備:
1,zabbixserver+ansible
2,windows支持ansible,windows7和windows server 2008r2,需要升級到sp1才能安裝powershell3.0,powershell版本在powershell中通過get-host查看。
3,修改zabbixserver的hosts文件,添加ip與主機名的對應(原因為,zabbix默認使用DNS作為監控對象名,如果沒有就使用ip地址)
ansible說明:
server端必須是linux服務器,搭建在zabbixserver上正好。
雖然ansible不需要angent,但是在windows上,ansible是通過powershell實現的控制,故對windows操作系統有一定的要求,如下:
- 安裝Framework 3.0+
- 更改powershell策略為remotesigned
- 升級PowerShell至3.0+
- 設置Windows遠端管理,英文全稱WS-Management(WinRM)
(1)安裝Framework 3.0+
下載鏈接為:http://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_x86_x64.exe。 下載至本地后雙擊左鍵安裝即可,期間可能會多次重啟,電腦需正常連接Internet。
(2)更改powershell策略為remotesigned

(3)升級powershel3.0
用powershell運行附件腳本。upgrade_to_ps3.ps1,這個腳本是ansible官方提供的。
(4)設置遠端管理
用powershell運行附件腳本,ConfigureRemotingForAnsible.ps1,這個腳本也是ansible官方提供。
設置完成以后,看看ansible能不能正常和windows通訊
添加服務器:
(5) 開啟防火牆
如果服務器防火牆是開啟的,需要手動添加針對winrm的訪問,開放5985(http)和5986(https)端口,也可以根據實際情況選擇開啟其中一個。(記得選擇允許所有來源ip訪問,默認是只允許本地訪問這兩個端口)
vim /etc/ansible/hosts
[windows]
192.168.53.133 ansible_ssh_user="Administrator" ansible_ssh_pass="123456" ansible_ssh_port=5985 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore
添加完成之后,用ansible測試一下
ansible服務端需要安裝pywinrm模塊
ansible windows -m win_ping
圖是偷來的,我自己的虛擬機已經關了,湊合看吧。看到這個表示ansible准備好了。
zabbixserver端配置
1,創建一個自動注冊的動作,叫做自動修改客戶端配置文件
2,設置觸發條件如圖(這里說明,這里所有雲主機模板里的agent配置文件中,hostname=new,就是說,雲服務器創建以后,自動有一個zabbixagent啟動,並且hostname=new)
3,創建動作,動作是在zabbixserver上執行一個腳本,這個腳本用來更改自動注冊上來的agent修改配置文件,這個根據自動注冊上報的ip匹配這個服務器應該叫什么名字,這個腳本要執行成功,必須加sudo,並且在sudoers文件里給zabbix添加免密sudo設置。要不然命令執行成功,但是不生效。
4,這個self-find腳本的內容如下:
1 #!/bin/bash 2 js_path="/usr/local/zabbix/ansible"
3 #設置腳本目錄 4 clientip=$1
5 #獲取第一個參數,也就是自動注冊client的ip地址 6 clientname=`cat $js_path/ip-name.txt|grep $clientip|awk '{print $2}'` 7 #根據client的ip地址,去ip-name.txt這個文件里查找對應的名字 8 sed -i "s/Hostname=new/Hostname=$clientname/g" $js_path/zabbix_agentd.win.conf 9 #生成這個client專用的配置文件 10 /usr/bin/ansible windows -m win_file -a "path=C:\\zabbix\\zabbix_agentd.win.conf state=absent"
11 #刪除client上現有的配置文件 12 /usr/bin/ansible windows -m win_copy -a "src=$js_path/zabbix_agentd.win.conf dest=C:\\zabbix\\zabbix_agentd.win.conf"
13 #將新的配置文件復制到client 14 /usr/bin/ansible windows -m win_service -a "name='Zabbix Agent' state=restarted"
15 #重啟client的zabbix_agentd服務 16 sed -i "s/Hostname=$clientname/Hostname=new/g" $js_path/zabbix_agentd.win.conf 17 #將修改過的配置文件再修改回去,方便下次使用
ip-name.txt這個文件內容如下
192.168.58.133 windows_test
5,這個動作創建以后,zabbix每2分鍾檢測一次自動注冊,如果發現有agent用new這個hostname上報到zabbixserver,zabbixserve就執行這個腳本,把新的配置文件發給agent並重啟agent,
6,接着創建第二個自動注冊動作,用於將使用新配置文件的agent自動添加監控
7,設置觸發條件為主機名windows_test,這個主機名是ip-name哪里來的,根據實際情況填寫。
8,添加操作如下
9,到此,已經可以實現自動發現windows服務器了。
原創作品,轉載請說明出處,謝謝