简言

微信作为日常使用最频繁的工具,因此我们希望将微信接入zabbix报警,这样收到消息更加快捷。

申请微信企业号

1.注册地址: https://work.weixin.qq.com

2.注册好之后配置企业微信

创建部门

添加成员

这里也可以手动添加,也可以扫码添加,推荐邀请方式

注意:这里我们要记住成员的账号,后面会用到

创建应用

这里我们点击应用管理,进入自建栏目

填写应用名称和可见成员

记住应用(AgentId、Secret后面会用到)

至此,微信企业号的配置完成。

这里提供一下企业微信的API测试链接

1
https://work.weixin.qq.com/api/devtools/devtool.php

ZabbixServer端配置

1.下载依赖工具

1
2
3
4
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

2.更改zabbixserver端的配置文件

1
2
3
[root@localhost ~]# grep alertscripts /etc/zabbix/zabbix_server.conf
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/opt/scripts/zabbix/alertscripts

编写脚本

1.脚本的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
######shell脚本:weixin.sh

#!/bin/bash
###SCRIPT_NAME:weixin.sh###
###send message from weixin for zabbix monitor###
###wuhf###
###V1-2019-06-18###
CropID='ww37662****'
Secret='yD04iYsPMipqWRfGduBjuJ8uzb7j******'
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=1000002 #企业号中的应用id
local UserID=$1 #部门成员id,zabbix中定义的微信接收者
local PartyID=1 #部门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
######python脚本: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 = "ww376622********" # CorpID是企业号的标识
Secret = "yD04iYsPM***************" # Secret是管理组凭证密钥
#Tagid = "1" # 通讯录标签ID
User = "PenHu" #指定用户名
Agentid = "1000002" # 应用ID
Token = GetToken(Corpid, Secret)
Status = SendMessage(Token,User,Agentid,Subject,Content)
print Status
#####python3.5版本以上
#!/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 = "wwc*****f25*****c1" # CorpID是企业号的标识
Secret = "vL*****wE6F5h1*****0sLc" # Secret是管理组凭证密钥
Tagid = "47" # 通讯录标签ID
User = "0*****822" #指定用户名
Agentid = "10*****13" # 应用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中

2.授予相关权限

1
2
3
4
#添加权限
chmod +x wechat.sh
touch weixin.log
chown zabbix.zabbix weixin.log

3.脚本测试

1
./wechat.sh 2 报警测试 error

Zabbix前端对接企业微信服务

1.添加报警媒介

1
2
3
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

2.添加用户

这里比较关键的就是收件人,这里我们写@all则为全部都发,写部门ID则以部门为ID去群发。写用户账号则为账号去发

3.添加动作

1
2
3
4
5
6
7
8
9
10
11
服务器:{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}
1
2
3
4
5
6
7
8
9
服务器:{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微信报警已完成,自行测试即可