从Python脚本判断服务器不可达,到Zabbix报警
1、Python腳本獲取不可達服務器的IP:
? ? 腳本基于Python3.3.6,Python2.x版本的queue模塊應該是Queue,導入模塊時:"from Queue import Queue"。
? ? 通過簡單的ping命令判斷主機是否可達。腳本會讀取/etc/zabbix/scripts/iplist.txt文件中的內容,文件中每個IP占用一行,允許有“#”開頭的注釋行內容。
#!/usr/bin/python #-*-?coding:?utf-8?-*- from?__future__?import?print_function import?re import?subprocess import?threading from?queue?import?Queue from?queue?import?Emptydef?is_reachable(ip):'''根據ping命令的返回值,判斷IP是否可以ping通。如果返回值不是0,說明不通,輸出該IP'''if?subprocess.getstatusoutput('ping?-c?1?{0}'.format(ip))[0]?!=?0:print(ip,end=',')def?unreachable_ip(ip_queue):'''不用等待,從IP隊列中取出IP,調用is_reachable函數,直到隊列中的內容為空'''try:while?True:ip?=?ip_queue.get_nowait()is_reachable(ip)except?Empty:passdef?get_unreachable_ip(filename,?ip_queue,?threads):'''從iplist文件中獲取IP,加入到隊列中。創建5個線程調用unreachable_ip函數'''with?open(filename,?'rt')?as?fin:for?line?in?fin:if?line?and?not?re.match('#',?line):ip_queue.put(line.split('\n')[0])for?i?in?range(5):thr?=?threading.Thread(target=unreachable_ip,?args=(ip_queue,))thr.start()threads.append(thr)for?thr?in?threads:thr.join()if?__name__?==?'__main__':filename?=?'/etc/zabbix/scripts/iplist.txt'ip_queue?=?Queue()threads?=?[]get_unreachable_ip(filename,?ip_queue,?threads)2、Zabbix報警:
? ? 已經可以通過腳本獲取到不可達主機的IP,怎樣讓Zabbix獲取這些IP呢?
? ? 如果使用Zabbix的zabbix agent模式獲取的話,因為ping不可達的IP時,返回內容會有延遲,這樣可能會因為Zabbix執行腳本超時導致item不可用。我使用zabbix trapper向zabbix server發送數據。
? ? 首先創建item,需要注意的是“Type of information”,如果選擇“Numeric”會報類似于“value not supported”的錯誤。item設置如下圖:
? ? 使用zabbix_sender命令向zabbix server發送數據:
? ? 選項:
? ? ? ? -s --host host:指定主機名,IP和DNS不可用。agent的配置文件中定義或者zabbix的web頁面上。以下命令中,因為直接在zabbix server上執行的腳本,所以-s使用了“Zabbix server”;
? ? ? ??-z --zabbix-server server:zabbix server的主機名或IP地址;
? ? ? ? -k?--key key:item中的key;
? ? ? ? -o?--value value:item中key的value,這里使用腳本的結果作為value。value不支持多行內容,所以在腳本is_reachable函數中,將print結束符指定為“,”。
#?/usr/local/zabbix/bin/zabbix_sender?-s?"Zabbix?server"?-z?127.0.0.1?-k?"ip_unreachable"?-o?`/etc/zabbix/scripts/test_ping_new.py` info?from?server:?"processed:?1;?failed:?0;?total:?1;?seconds?spent:?0.000038" sent:?1;?skipped:?0;?total:?1? ??
設定一個定時任務,每隔幾分鐘執行一次zabbix_sender命令,向zabbix server發送數據。
設置觸發器:
? ? 設置觸發器表達式(Expression),我選擇“No date received during period of time T”,時間為5分鐘,初始值是“0”,如下圖:?
??
? ? ?可以在Trigger的Name中通過{ITEM.VALUE}獲取item的值,Trigger設置如下圖:
? ? 下圖是測試時,收到的一條報警短信:
3、對比:
? ? 下面是很久之前寫的一個shell腳本,循環ping主機,因為是一個IP完成之后,再去ping下一個IP,循環效率很低:
轉載于:https://blog.51cto.com/13568014/2117012
總結
以上是生活随笔為你收集整理的从Python脚本判断服务器不可达,到Zabbix报警的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式(二) 工厂模式
- 下一篇: python--通过xpath相对节点位