使用這個服務的前提是,你必需要有一個微信訂閱號,或者公衆號,而且是經過認證的號
由於認證事後的號纔有模版消息和獲取用戶openid等信息的權限 ,以下,登陸微信公衆號的登陸頁後,底下有個接口權限的展現
咱們能夠理解爲它類傳於郵件發送告警的思路,
首先,你須要關注大家的微信公衆號,其次zabbix後須要能調用騰訊的API接口,發送業務通知消息到指定的OpenID的人員
其次,你要有發送對象的openID,它就相似因而郵箱地址。須要將這個OpenID配置到用戶的告警媒介,讓其傳參給咱們的腳本中,
至於如何獲取(已關注你公衆號的微信用戶的OpenID),可參考如下連接的PHP方法得到。
固然,若是你自己不是很懂PHP,而且你的公衆號只有內部使用的話,人員使用得少,獲取用戶的OpenID,只需在公衆號上配置一個回調的80端口域名,這個回調域名是你配置在你掌控的後臺服務器上,在此服務器上安裝nginx後,能夠跟這個公衆號進行交互,好比回覆消息,或點擊相關的公衆號的連接按鈕,經過查看微信回調過程當中,攜帶的URL中,也是能夠看出當前操做者的OpenID的,
以下截圖,tail 一下回調服務器上的nginx的access log, 在openid=XXXXX 到&字符以前的這段ID就是OpenID
接着建立一個微信公衆平臺上的模版消息python
有了接收告警的OpenID人員+模版消息的ID後,接來就是簡單的建立腳本和動做了。
在zabbix 服務器端的數據庫中,先建立一張表來做存放zabbix端發起微信API接口時返回的token(token請求是有次數的,而且token的失效時間較長,咱們須要靈活應用)
mysql -u root -p
use zabbix;
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `wechat_token`;
CREATE TABLE `wechat_token` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`token` varchar(300) NOT NULL,
`time_available` float(100,0) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `wechat_token` VALUES ('1', 'zRKH6VmKhNFLUBPwhKKeZb0KzZbfDOn8OYpl9zBEqzoQqFg-iU5Lry0mNZdKzliQYdhaq19_0qIT9LnFkw_SSJ7GrtolSJHcgCT6Kt-Pa9J8w1uG54a-fbJS2bvKoriMZNZdCGASGS', '1484297600');
退出數據庫,
在服務器端的如下目錄,建立發送微信腳本
# yum install MySQL-python -y
cd /usr/lib/zabbix/alertscripts
[root@zabbixserver alertscripts]# vi wechat_monitor.py
#!/usr/bin/python
# coding=utf-8
import json
import time,sys
import MySQLdb
import requests
class wechat_monitor():
appID = "wxe72b2acXXXXX"
appsecret = "ed4f3975ebbfXXXXXXXXXXXXX"
tempId = "HvPyBT6zIXj700B8hDN51DQXXXXXXXXXXXXXX"
userOpenId = "o7oUNwLP2UXXXXXXXXXXXXXX"
sendMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="
template = {'touser' : userOpenId,
'template_id' : tempId,
'url ' : "https://mail.qq.com",
'topcolor ' : '#7B68EE',
'data' : "" }
tonkenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appID +"&secret=" + appsecret
db_host = "127.0.0.1"
db_port = 3306
db_user = "root"
db_password = "venic8888"
db_name = "zabbix"
now = time.time()
def __init__(self):
conn = self.__connections()
cur=conn.cursor()
selectSql = "select * from wechat_token"
cur.execute(selectSql)
data = cur.fetchone()
if (int( self.now) - int(data[2])) < 3200:
self.token = data[1]
else:
self.__getToken()
updateSql = 'UPDATE wechat_token SET token="'+self .token+'",time_available=' +str(self.now)
try:
cur.execute(updateSql)
conn.commit()
except Exception, e:
conn.rollback()
print "數據庫更新失敗"
print "Exception:" + e
self.__closeDatabase(conn,cur)
def __getToken(self):
# print self.tonkenURL
res = requests.post( self.tonkenURL)
self.token = json.loads(res.text)["access_token"]
def sendMessage(self,data):
self.template["url" ] = ""
self.template["data"] = data
res = requests.post( self.sendMessageUrl + self.token, json.dumps(self.template))
return res
def __connections(self):
try:
conn = MySQLdb.connect(self.db_host,self.db_user,self.db_password, self.db_name,charset="utf8")
except Exception, e:
print "數據庫鏈接失敗"
print "Exception:" + e
return conn
def __closeDatabase(self,conn,cur):
try:
cur.close()
conn.close()
except Exception, e:
print "數據庫關閉失敗"
print "Exception:" + e
if __name__ == '__main__':
wm = wechat_monitor()
wm.template["touser"] = sys.argv[1]
data = {"first" : { "value" : sys.argv[2 ],"color" : "#173177" },
"performance":{"value" : sys.argv[3],"color" : "#173177" },
"time":{"value" :time.ctime(),"color" : "#173177" },
"remark":{"value" : "更多內容請登陸郵箱查看!","color" : "#173177"}}
res = wm.sendMessage(data)
保存賦權。
chmod +x /usr/lib/zabbix/alertscripts/wechat_monitor.py
在報警媒介中,建立一個類型,啓命叫WeChat
分析一下上面的微信腳本。
appID = "wxe72bXXXXXXXXXX"-------這是公衆號的ID(已認證過的。公衆號平臺上會一次性提供,須要本身留存)
appsecret = "ed4f3975ebbf17b2XXXXXXXXXXXXX"-------這是VIFI產品公衆號的密鑰(已認證過的。公衆號平臺上會一次性提供,須要本身留存)
tempId = "HvPyBT6zIXj700B8hXXXXXXXXXXXXXXXX"---------這是這個公衆號的消息模版的ID(必須是認證過的。纔有權限,公衆號平臺上會一次性提供,須要本身留存)
userOpenId = "o7oUNwEl4nRKXXXXXXXX" 是我本身的OpenID用來測試提早賦值用的。
若是要拋開zabbix,先自測微信公衆號的接口的話,能夠經過如下腳本在本身電腦上的eclips上跑一下看看可否收到
#!/usr/bin/python
# coding=utf-8
import json
import time
import requests
appID = "wxe72bXXXXXXXXXXXXXX"
appsecret = "ed4f3975ebbf1XXXXXXXXXXXXXX"
tempId = "HvPyBT6zIXj700B8hXXXXXXXXXXXXXXXXX"
userOpenId = "o7oUNwLP2XXXXXXXXXXXXXXX"
sendMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="
template = {'touser' : userOpenId,
'template_id' : tempId,
'url ' : "https://mail.qq.com",
'topcolor ' : '#7B68EE',
'data' : "" }
tonkenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appID +"&secret=" + appsecret
res = requests.post( tonkenURL)
token = json.loads(res.text)["access_token"]
def sendMessage(data):
template["url" ] = ""
template["data"] = data
res = requests.post( sendMessageUrl + token, json.dumps(template))
return res
if __name__ == '__main__':
data = {"first" : { "value" : '',"color" : "#173177" },
"performance":{"value" : '',"color" : "#173177" },
"time":{"value" :time.ctime(),"color" : "#173177" },
"remark":{"value" : "更多內容請登陸郵箱查看!","color" : "#173177"}}
res = sendMessage(data)
接下來就是測試zabbix可否正常運行這個腳本。
首次先在zabbix服務器上自測一下
python /usr/lib/zabbix/alertscripts/wechat_monitor.py 你的OpenID test test
正常後,再定義zabbix的dashboard界面
管理員再添加一個告警媒介
關閉一臺agent的機器的服務,等待其郵件和微信的告警推送。mysql