目的:用zabbix和放在異地分公司內網的刷了openwrt的路由器以及微信接口來構建一套分佈式的公網監控報警系統。用於監控各個地方訪問公司的應用的連接連通性,訪問時間,dns解析結果python
初版的效果圖數據庫
想折騰這個須要的技能:1 搭建zabbix 環境 2 理解zabbix trapper模式 3 會折騰openwrt 路由器 bash
軟硬件環境:微信
主節點:zabbix server ,server端口須要映射至公網網絡
分佈式節點:一臺刷了openwrt的路由器(常見的mtk7260 以及ralink等均可以),無需公網ip,可是須要互聯網鏈接,wan口dhcp,怎麼折騰,建議參考恩山論壇,安裝zabbix sender 軟件包
app
實現過程:分佈式節點的cron 裏面每分鐘調用zabbix sender命令 發送curl網址的結果,調用時間給 server curl
server對收到的信息進行分析,處理。分佈式
難點:一、一個網站若是掛了,全部分佈式節點都會報警,那麼個人微信是否是會被吵死?ide
二、分佈式節點沒有公網端口,怎麼樣要增長或者減小網址怎麼辦?fetch
三、異地分公司網絡環境複雜,誤報不少怎麼辦?
個人處理方式:1&3 :server收到消息,並觸發trigger以後,把相關信息寫入數據庫,在對數據庫信息進行處理 我用的邏輯有如下幾條
(1) 一分鐘以內 觸發告警而且恢復的不推微信
(2) 一分鐘內,全部觸發而且沒有恢復的報警合併在一塊兒推微信,而且一個網址的多個節點合併成一塊兒報出來,參看前圖
二、每一個節點每小時訪問個人server 來同步crontab 的內容,而且天天凌晨重啓
附代碼
1 分佈式節點檢測網址的腳本
#!/bin/bash
now=`date +%F-%H-%M-%S`
cd /etc/zabbix/monitor_scripts/timefile
[[ -f time.$now ]]||touch time.$now
{ time bash /root/curl1.sh $1; } &> time.$now
TIME=`cat time.$now |grep real|awk -F m '{print $2}'|awk -F s '{print $1}'`
/usr/bin/zabbix_sender -s beijing-unicom -z #ZABBIX HOSTNAME -k "time[$1]" -o $TIME &>/dev/null
find /etc/zabbix/monitor_scripts/timefile -mmin +5 -delete
2 檢測數據庫的python代碼:
cur.execute('UPDATE zabbix SET SENDTOWECHAT1=1,SENDTOWECHAT2=1 WHERE RESOLVED= 1 and SENDTOWECHAT1 = 0 and SENDTOWECHAT2=0')
conn.commit()
cur.execute('SELECT URL FROM zabbix WHERE RESOLVED=0 and SENDTOWECHAT1 = 0 and SENDTOWECHAT2=0')
resault=cur.fetchall()
message=''
for i in set(resault):
i=i[0]
cur.execute('SELECT HOST FROM zabbix WHERE RESOLVED=0 and SENDTOWECHAT1 = 0 and SENDTOWECHAT2=0 and URL="{0}"'.format(i))
resault=(set(cur.fetchall()))
HOST=''
for j in resault:
HOST=HOST+str(j[0])+","
print(HOST)
message=message+ ("節點{0}訪問{1}出現問題。".format(HOST,i))
代碼僅僅是拋磚引玉,
3 發送微信的代碼參考我以前博客