从Python脚本判断服务器不可达,到Zabbix报警
1、Python腳本獲取不可達(dá)服務(wù)器的IP:
? ? 腳本基于Python3.3.6,Python2.x版本的queue模塊應(yīng)該是Queue,導(dǎo)入模塊時(shí):"from Queue import Queue"。
? ? 通過簡單的ping命令判斷主機(jī)是否可達(dá)。腳本會(huì)讀取/etc/zabbix/scripts/iplist.txt文件中的內(nèi)容,文件中每個(gè)IP占用一行,允許有“#”開頭的注釋行內(nèi)容。
#!/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):'''根據(jù)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隊(duì)列中取出IP,調(diào)用is_reachable函數(shù),直到隊(duì)列中的內(nèi)容為空'''try:while?True:ip?=?ip_queue.get_nowait()is_reachable(ip)except?Empty:passdef?get_unreachable_ip(filename,?ip_queue,?threads):'''從iplist文件中獲取IP,加入到隊(duì)列中。創(chuàng)建5個(gè)線程調(diào)用unreachable_ip函數(shù)'''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報(bào)警:
? ? 已經(jīng)可以通過腳本獲取到不可達(dá)主機(jī)的IP,怎樣讓Zabbix獲取這些IP呢?
? ? 如果使用Zabbix的zabbix agent模式獲取的話,因?yàn)閜ing不可達(dá)的IP時(shí),返回內(nèi)容會(huì)有延遲,這樣可能會(huì)因?yàn)閆abbix執(zhí)行腳本超時(shí)導(dǎo)致item不可用。我使用zabbix trapper向zabbix server發(fā)送數(shù)據(jù)。
? ? 首先創(chuàng)建item,需要注意的是“Type of information”,如果選擇“Numeric”會(huì)報(bào)類似于“value not supported”的錯(cuò)誤。item設(shè)置如下圖:
? ? 使用zabbix_sender命令向zabbix server發(fā)送數(shù)據(jù):
? ? 選項(xiàng):
? ? ? ? -s --host host:指定主機(jī)名,IP和DNS不可用。agent的配置文件中定義或者zabbix的web頁面上。以下命令中,因?yàn)橹苯釉趜abbix server上執(zhí)行的腳本,所以-s使用了“Zabbix server”;
? ? ? ??-z --zabbix-server server:zabbix server的主機(jī)名或IP地址;
? ? ? ? -k?--key key:item中的key;
? ? ? ? -o?--value value:item中key的value,這里使用腳本的結(jié)果作為value。value不支持多行內(nèi)容,所以在腳本is_reachable函數(shù)中,將print結(jié)束符指定為“,”。
#?/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? ??
設(shè)定一個(gè)定時(shí)任務(wù),每隔幾分鐘執(zhí)行一次zabbix_sender命令,向zabbix server發(fā)送數(shù)據(jù)。
設(shè)置觸發(fā)器:
? ? 設(shè)置觸發(fā)器表達(dá)式(Expression),我選擇“No date received during period of time T”,時(shí)間為5分鐘,初始值是“0”,如下圖:?
??
? ? ?可以在Trigger的Name中通過{ITEM.VALUE}獲取item的值,Trigger設(shè)置如下圖:
? ? 下圖是測試時(shí),收到的一條報(bào)警短信:
3、對比:
? ? 下面是很久之前寫的一個(gè)shell腳本,循環(huán)ping主機(jī),因?yàn)槭且粋€(gè)IP完成之后,再去ping下一個(gè)IP,循環(huán)效率很低:
轉(zhuǎn)載于:https://blog.51cto.com/13568014/2117012
總結(jié)
以上是生活随笔為你收集整理的从Python脚本判断服务器不可达,到Zabbix报警的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式(二) 工厂模式
- 下一篇: 区块链开发_以太坊多重签名