目的:用zabbix和放在異地分公司內網的刷了openwrt的路由器以及微信接口來構建一套分佈式的公網監控報警系統。用於監控各個地方訪問公司的應用的鏈接連通性,訪問時間,dns解析結果
第一版的效果圖
想折騰這個需要的技能:1 搭建zabbix 環境 2 理解zabbix trapper模式 3 會折騰openwrt 路由器
軟硬件環境:
主節點:zabbix server ,server端口需要映射至公網
分佈式節點:一臺刷了openwrt的路由器(常見的mtk7260 以及ralink等都可以),無需公網ip,但是需要互聯網連接,wan口dhcp,怎麼折騰,建議參考恩山論壇,安裝zabbix sender 軟件包
實現過程:分佈式節點的cron 裏面每分鐘調用zabbix sender命令 發送curl網址的結果,調用時間給 server
server對收到的信息進行分析,處理。
難點:1、一個網站如果掛了,所有分佈式節點都會報警,那麼我的微信是不是會被吵死?
2、分佈式節點沒有公網端口,怎麼樣要增加或者減少網址怎麼辦?
3、異地分公司網絡環境複雜,誤報很多怎麼辦?
我的處理方式:1&3 :server收到消息,並觸發trigger之後,把相關信息寫入數據庫,在對數據庫信息進行處理 我用的邏輯有以下幾條
(1) 一分鐘之內 觸發告警並且恢復的不推微信
(2) 一分鐘內,所有觸發並且沒有恢復的報警合併在一起推微信,並且一個網址的多個節點合併成一起報出來,參看前圖
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 發送微信的代碼參考我之前博客