問題:當服務器發生報錯時,有一個信息能實現自動發送到我的手機或者應用上,以達到對服務器的實時的監控與處理。郵件與短信不能滿足實時性,於是想到了釘釘的通知。
思路:在釘釘里面建一個群,群里面拉個機器人。用zabbix配置一個腳本,讓服務器監控的報警自動發送到釘釘,再由釘釘發送給自己。
參考鏈接:
python之釘釘機器人zabbix報警:https://blog.51cto.com/m51cto/2051945
小油2018zabbix釘釘報警:https://www.cnblogs.com/xiaoyou2018/p/10612628.html#commentform
釘釘開發者文檔機器人:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
一、環境准備
zabbix4.0
zabbix系統:centos7.6
腳本:python2.7
客戶端:windwos10
報警應用:釘釘
二、腳本及說明
腳本:dingding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
import datetime
webhook = "https://oapi.dingtalk.com/robot/send?access_xxxxxxxxxxxxxxxxxx"
user=sys.argv[1]
text=sys.argv[3]
data={
"msgtype": "text",
"text": {
"content":text
},
"at": {
"atMobiles": [
user
],
"isAtAll": True
}
}
headers = {'Content-Type': 'application/json'}
x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
if os.path.exists("/usr/local/zabbix/log/dingding.log"):
f=open("/usr/local/zabbix/log/dingding.log","a+")
else:
f=open("/usr/local/zabbix/log/dingding.log","w+")
f.write("\n"+"--"*30)
if x.json()["errcode"] == 0:
f.write("\n"+str(datetime.datetime.now())+" "+str(user)+" "+"發送成功"+"\n"+str(text))
f.close()
else:
f.write("\n"+str(datetime.datetime.now())+" "+str(user)+" "+"發送失敗"+"\n"+str(text))
f.close()
解釋:一定記住用手打,不要復制粘貼,因為linux的編碼可能復制進去用不了,耐心一點!!!
前面帶#的2行是定義,定義語言與編碼字符串
跟着5行import是python的格式用法
中間的webhook是機器人的地址,要再釘釘群里面建了機器人把地址更換進來
user很text是定義變量,里面的1跟3是后面輸出的的3個值
data是釘釘機器人的用法
atMobiles是釘釘里面發給誰的手機號,要加上
isAtAlL是開啟是否@所有人,釘釘發送給群所有人
下面的if else是定義日志的文件路徑與日志顯示的內容
三、釘釘建一個群,添加一個機器人,復制地址
釘釘新建一個群,點擊群右側“更多”-“群助手”-“添加自定義機器人”-“復制地址”
四、zabbix服務器配置腳本
機器人地址:`https://oapi.dingtalk.com/robot/send?access_tokenxxxxxxxxx`
1.遠程zabbix服務器,檢查安裝python(centos7.6自帶python2.x版本)
python -V 查看python版本(這個腳本是基於puthon2.x版本的)
yum -y install epel-release 安裝epel源
yum install python-pip 安裝pip工具
pip -v 查看版本
pip install requests 安裝模塊requests
2.編寫腳本,腳本要新建在zabbix 的alertscripts目錄下
cd /usr/lib/zabbix/alertscripts 打開目錄
vim dingding.py 編輯新建腳本
3.腳本:見上
一定要將自己的釘釘機器人地址,替換webhook里面的地址,其他可以不變
4.日志文件創建與授權:
chmod 777 dingding.py
chown zabbix.zabbix dingding.py
touch /usr/local/zabbix/logs/dingding.log
chown zabbix.zabbix /usr/local/zabbix/logs/dingding.log
5.測試腳本
python dingding.py user1 12345678911 測試發送釘釘 (測試中要輸入3個數據,分別是用戶,電話,跟內容)
五、zabbix管理界面添加腳本
1.登錄zabbix管理網頁,上面選擇“管理”-“報警媒介類型”-“創建報警媒介類型”(將剛才寫的dingding腳本調用起來)
2.單擊“管理”-“用戶”-“Admin”-“報警媒介”-添加一個剛才的報警媒介
3.單擊“配置”-“動作”-“創建一個動作”
設置“操作”的報警;“恢復操作”的報警;“更新”的報警的格式;
在操作里面添加發送腳本的動作,每一個都要做添加發送腳本的動作!
操作的報警消息內容格式:
服務器:{HOST.NAME}發生: {TRIGGER.NAME}故障!
故障:
{報警主機:{HOST.NAME}
主機地址:{HOST.IP}
監控項目:{ITEM.NAME}
監控取值:{ITEM.LASTVALUE}
報警等級:{TRIGGER.SEVERITY}
當前狀態:{TRIGGER.STATUS}
報警信息:{TRIGGER.NAME}
報警時間:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}
恢復操作的報警消息內容:
服務器:{HOST.NAME}: {TRIGGER.NAME}已恢復!
已恢復:
{報警主機:{HOST.NAME}
主機地址:{HOST.IP}
監控項目:{ITEM.NAME}
監控取值:{ITEM.LASTVALUE}
報警等級:{TRIGGER.SEVERITY}
當前狀態:{TRIGGER.STATUS}
報警信息:{TRIGGER.NAME}
報警時間:{EVENT.DATE} {EVENT.TIME}
恢復時間:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持續時間:{EVENT.AGE}
事件ID:{EVENT.ID}
}
六、測試
1.添加一個監控主機,並設置一個測試值,例如ping
見我的另一篇博客:https://www.cnblogs.com/subsea/p/13532579.html
2.關閉或者拔掉網線,測試客戶機,看釘釘是否通知