日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

从Python脚本判断服务器不可达,到Zabbix报警

發布時間:2025/3/19 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从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,循環效率很低:

#!/bin/bash while?true doi=0ip_array=()for?IP?in?$(cat?/etc/zabbix/scripts/login_iplist.txt?|?grep?-v?"^#")doKEY=$(ping?$IP?-c?5?|?grep?"ttl"?|?wc?-l)if?[?$KEY?-eq?0?]thenip_array[$i]=$IPi=$((?$i?+?1?))fidoneif?[?${#ip_array[@]}?-ne?0?]then/usr/local/zabbix/bin/zabbix_sender?-s?"Zabbix?server"?-z?127.0.0.1?-k?"test_ping"?-o?"${ip_array[*]}?unreachable"fi done


轉載于:https://blog.51cto.com/13568014/2117012

總結

以上是生活随笔為你收集整理的从Python脚本判断服务器不可达,到Zabbix报警的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。