一、申请企业微信号
注册地址:https://work.weixin.qq.com
这里测试下API链接,将刚刚的AgentdId 和Secret输入进下面网址测试:https://work.weixin.qq.com/api/devtools/devtool.php
wget https://pypi.python.org/packages/f0/07/26b519e6ebb03c2a74989f7571e6ae6b82e9d7d81b8de6fcdbfc643c7b58/simplejson-3.8.2.tar.gz
tar zxf simplejson-3.8.2.tar.gz
python setup.py build
python setup.py install
[root@localhost ~]# grep alertscripts /etc/zabbix/zabbix_server.conf
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
[root@localhost ~]# cd /usr/lib/zabbix/alertscripts #切换至zabbix-server默认脚本文件夹中
五、编写脚本
这里有三种脚本,第一种是shell脚本,第二种是python脚本,第三种是python3.5版本以上的脚本
[root@localhost alertscripts]# vim wechat.sh #在zabbix-server默认脚本路径下新建一个wechat.sh脚本
#!/bin/bash
###SCRIPT_NAME:weixin.sh###
###send message from weixin for zabbix monitor###
###wuhf###
###V1-2019-06-18###
CropID='wwe749f****' #企业ID
Secret='iNK-u8DyNFOapqBvt3eYGOTyCKF4-0bKyOFof******' #应用中的Secret
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int AppID=1000003 #企业号中的应用id
local UserID=LiuYong #部门成员id,zabbix中定义的微信接收者
local PartyID=2 #部门id,定义了范围,组内成员都可接收到消息
local Msg=$(echo "$@" | cut -d" " -f3-)
printf '{\n'
printf '\t"touser": "'"$UserID"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'" $AppID "\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL
[root@localhost alertscripts]# vim wechat.py #在zabbix-server默认脚本路径下新建一个wechat.py脚本
#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
import requests,sys,json
import urllib3
urllib3.disable_warnings()
reload(sys)
sys.setdefaultencoding('utf-8')
def GetToken(Corpid,Secret):
Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
Data = {
"corpid":Corpid,
"corpsecret":Secret
}
r = requests.get(url=Url,params=Data,verify=False)
Token = r.json()['access_token']
return Token
def SendMessage(Token,User,Agentid,Subject,Content):
Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
Data = {
"touser": User, # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
#"totag": Tagid, # 企业号中的部门id,群发时使用。
"msgtype": "text", # 消息类型。
"agentid": Agentid, # 企业号中的应用id。
"text": {
"content": Subject + '\n' + Content
},
"safe": "0"
}
r = requests.post(url=Url,data=json.dumps(Data),verify=False)
return r.text
if __name__ == '__main__':
User = sys.argv[1] # zabbix传过来的第一个参数
Subject = sys.argv[2] # zabbix传过来的第二个参数
Content = sys.argv[3] # zabbix传过来的第三个参数
Corpid = "wwe749f2********" # CorpID是企业号的标识
Secret = "iNK-u8DyN***************" # Secret是管理组凭证密钥
#Tagid = "2" # 通讯录标签ID
User = "LiuYong" #指定用户名
Agentid = "1000003" # 应用ID
Token = GetToken(Corpid, Secret)
Status = SendMessage(Token,User,Agentid,Subject,Content)
print Status
[root@localhost alertscripts]# vim wechat.py #在zabbix-server默认脚本路径下新建一个wechat.py脚本
#!/usr/local/bin/python3.5
#coding:utf-8
import requests,sys,json
import urllib3
import sys
import imp
import importlib
importlib.reload(sys)
urllib3.disable_warnings()
def GetToken(Corpid,Secret):
Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
Data = {
"corpid":Corpid,
"corpsecret":Secret
}
r = requests.get(url=Url,params=Data,verify=False)
Token = r.json()['access_token']
return Token
def SendMessage(Token,User,Agentid,Subject,Content):
Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
Data = {
"touser": User, # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
"totag": Tagid, # 企业号中的部门id,群发时使用。
"msgtype": "text", # 消息类型。
"agentid": Agentid, # 企业号中的应用id。
"text": {
"content": Subject + '\n' + Content
},
"safe": "0"
}
r = requests.post(url=Url,data=json.dumps(Data),verify=False)
return r.text
if __name__ == '__main__':
User = sys.argv[1] # zabbix传过来的第一个参数
Subject = sys.argv[2] # zabbix传过来的第二个参数
Content = sys.argv[3] # zabbix传过来的第三个参数
Corpid = "wwe749f2********" # CorpID是企业号的标识
Secret = "iNK-u8DyN***************" # Secret是管理组凭证密钥
Tagid = "2" # 通讯录标签ID
User = "LiuYong" #指定用户名
Agentid = "1000003" # 应用ID
Token = GetToken(Corpid, Secret)
Status = SendMessage(Token,User,Agentid,Subject,Content)
print (Status)
脚本说明:
1.corpid、appsecret、agentid就是我们需要从企业号和应用中获取到的信息,其中.corpid、appsecret用于获取accesstoken,agentid用于往应用发送消息
2.由于zabbix会往脚本中传入3个参数,分别为sendto(收件人)、subject(报警主题)、message(报警信息)。这3个参数需要在zabbix中配置,我们下面会讲到。
此脚本中我们没有接受subject参数,而是直接使用sendto及message参数。
另经测试添加toparty部门变量后,发现报警信息会重复发送,因此在此注释掉。
具体的报警发送信息,我们通过脚本打印在日志weixin.log中
授予相关权限
由于我的系统python版本是2.7,所以这里我使用了第二种脚本,创建wechat.py
chmod +x wechat.py #给新建脚本授予权限
touch weixin.log #创建日志
chown zabbix.zabbix weixin.log #将日志添加zabbix组
[root@localhost alertscripts]# ./wechat.py 2 报警测试 error
六、Zabbix前段对接企业微信服务
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
添加动作
操作中的
默认标题:
服务器:{HOST.NAME}出现故障!\n
消息内容:
告警主机:{HOSTNAME1}
主机地址:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复操作中:
默认标题:
服务器:{HOST.NAME}已恢复!\n
消息内容
恢复主机:{HOSTNAME1}
主机地址:{HOST.IP}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
故障信息:{TRIGGER.NAME}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
到此zabbix企业微信报警完成,测试是否有效:
我通过更改模板中CPU使用率触发值(大于0则报警告)来测试
这里测试成功!