在生产环境中,往往使用邮件和短信来进行告警,由于邮件经常被忽略或当垃圾邮件清理掉,起不到告警的作用,而短信告警价格费用又比较高,而我们又经常使用及时通信软件像微信等等,利用微信告警可以大幅度的降低运维成本。具体的使用微信告警步骤,如下:
(一)申请微信企业号。
(1)微信的第三方接口要求我们申请一个企业号来进行传送据,网站为:https://qy.weixin.qq.com/
。具体安装一步步来进行注册。
(2)在通讯录中添加组和成员:
a,添加子部门,如图一
b,添加成员,如图二
图一
图二
注意:1,我们要把成员信息添加到组织部门,必须填写手机号+微信号+邮箱,这样别人扫码二维码才能正常的关注。
2,记住子部门的ID和成员的账号
(3)在应用中心创建应用(单价+号-->消息性应用-->添加应用的名称,功能,应用范围)。创建应用,是因为通过应用发送消息给部门成员,一定要记住应用的ID。如下图:
(4)给部门设置管理员:
设置--->功能设置---->权限管理---->新建管理组 管理员必须事先已经关注了企业号,并且已经设置好邮箱地址
注意:本次我们需要记住上次标红的部分,CorpID和Secret,这两个参数的值,在我们调用参数的时候要用到。
综上所述,我们需要提取如下信息:成员账号.组织部门的ID.应用ID.CorpID.Secret
(二)如何调用微信接口:调用微信接口需要一个调用接口的凭证:access_toke 通过 :CropID 、Secret 才能获取到access_token,但是获取到的token有效期为7200s.微信企业号接口调试工具传送门:http://qydev.weixin.qq.com/debug
(三)写shell脚本
使用: curl -s -G url 获取 AccessToken
curl --data url 传送凭证调用企业号接口
zabbix会传递三个参数给脚本,$1是消息接收账号,$2报警标题,$3报警内容
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
|
#!/bin/bash
###send message from weixin for zabbix monitor
#author:lqb
#date:V1-2016-4-12
CropID=
'xxxxxx'
Secret=
'xxxxxx'
GURL=
"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(
/usr/bin/curl
-s -G $GURL |
awk
-F\"
'{print $4}'
)
PURL=
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function
body() {
local
int AppID=1
#企业号中的应用id
local
UserID=$1
#部门成员id,zabbix中定义的微信接收者
local
PartyID=2
#部门id,定义了范围,组内成员都可接收到消息
local
Msg=$(
echo
"$@"
|
cut
-d
" "
-f3-)
#过滤出zabbix传递的第三个参数
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
|
由于微信企业号开放的端口有固定的格式现在:
企业号支持的格式:http://qydev.weixin.qq.com/wiki/index.php?title=消息类型及数据格式
(四)将脚本放到zabbix默认的执行路径下,并赋予可执行权限。
1
2
3
|
[root@zabbix alertscripts]
# mv weixin.sh /usr/local/zabbix/alertscripts/
[root@zabbix alertscripts]
# chown zabbix.zabbix weixin.sh
[root@zabbix alertscripts]
# chmod +x weixin.sh
|
(五)在zabbix服务器端进行如下设置。
(1)创建媒介。管理-->示警媒体类型-->创建示警媒体类型-->类型选脚本.
(4)创建发送的方式。
(六)收到的告警信息;
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
|
python脚本为:
#!/usr/bin/env python
#coding: utf-8
import
time
import
urllib,urllib2
import
json
import
sys
''
'
1 空
2 空
3 内容
''
'
""
"
touser否成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送
toparty否部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数
totag否标签ID列表,多个接收者用‘|’分隔。当touser为@all时忽略本参数
msgtype是消息类型,此时固定为:text
agentid是企业应用的
id
,整型。可在应用的设置页面查看
content是消息内容
safe否表示是否是保密消息,0表示否,1表示是,默认0
""
"
# baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
# securl = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
class WeChatMSG(object):
def __init__(self,content):
self.gettoken_url =
'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
self.gettoken_content = {
'corpid'
:
'wxdc26c4d41cb90b70'
,
'corpsecret'
:
'D8Q-0d_6PKLhfJAST0BroOn2pgzb2BIVd0RUUNcu5HigsIXYppmApte1DiqQ1PFS'
,
}
self.main_content = {
"toparty"
:
"1"
,
"agentid"
:
"3"
,
"msgtype"
:
"text"
,
"text"
:{
"content"
:content,
}
}
def get_access_token(self,string):
token_result = json.loads(string.
read
())
access_token= token_result[
'access_token'
]
return
access_token.encode(
'utf-8'
)
def geturl(self,url,data):
data = self.encodeurl(data)
response = urllib2.urlopen(
'%s?%s'
% (url,data))
return
response.
read
().decode(
'utf-8'
)
def posturl(self,url,data,isjson = True):
if
isjson:
data = json.dumps(data)
response = urllib2.urlopen(url,data)
return
response.
read
().decode(
'utf-8'
)
def encodeurl(self,dict):
data =
''
for
k,
v
in
dict.items():
data +=
'%s=%s%s'
% (k,
v
,
'&'
)
return
data
if
__name__ ==
'__main__'
:
if
len(sys.argv) == 4:
touser,notuse,content = sys.argv[1:]
else
:
print
'error segments, now exit'
sys.
exit
()
msgsender = WeChatMSG(content)
access_token_response = msgsender.geturl(msgsender.gettoken_url, msgsender.gettoken_content)
access_token = json.loads(access_token_response)[
'access_token'
]
sendmsg_url =
'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s'
% access_token
print msgsender.posturl(sendmsg_url,msgsender.main_content)
|
注意:
由于2017年6月3号中午微信企业号升级到企业微信参考(https://work.weixin.qq.com/api/doc#10087):
企业号现已升级为企业微信,微信插件继承原企业号的所有能力。
管理员可在企业微信管理后台新建应用、群发通知,成员扫码关注微信插件后,即可在微信中接收企业通知和使用企业应用。原先的脚步暂时用不了,发不了微信,现在需要进行如下修改:
(一)申请企业微信号
(1)申请地址:work.weixin.qq.com/login。具体申请步骤省略:
(2)进入企业微信号创建企业应用,并把AgentId和Secret值记下来。
(3)进入我的企业,记下来CorpID的值
(4)编写微信的过滤脚步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/bin/bash
# SCRIPT_NAME: weixin.sh
# DESCRIPTION: send message from weixin for zabbix monitor
# DATE : 2017-06-07
CropID=
'XXXXX'
Secret=
'XXXXX'
#获取access_token
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
Meg=$(
echo
"$@"
|
cut
-d
" "
-f3-)
echo
""
"{
\"touser\" : \"@all\",
\"msgtype\" : \"text\",
\"agentid\" : XXXXX,
\"text\" : {
\"content\" : \"$Meg\"}
}
""
"
}
/usr/bin/curl
--data-ascii
"$(body $1 $2 $3)"
$PURL
/usr/bin/curl
--data-ascii
"$(body $1 $2 $3)"
$PURL >>
/tmp/weixin
.log
|
其他的和上边的一样。
不过特别要注意:zabbix3.0版本以上的,要添加变量,如下图,否则收不到信息的。
使用钉钉告警要先安装pip 具体参考:http://blog.51cto.com/liqingbiao/1749098。安装
pip install request
脚本为:
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
|
#!/usr/bin/python
import
requests
import
sys
import
json
import
datetime
import
os
corpid =
'ding5cbc5f3ec1c44e36'
corpsec =
'thHja9f9FmulSGJavsRWzE4gUm0LZN6075HufdjDHvazEe7K-3yka3hUUIZKjMGU'
r = requests.get(
'https://oapi.dingtalk.com/gettoken?corpid='
+corpid+
'&corpsecret='
+corpsec)
token = r.json()[
'access_token'
]
data = {
"touser"
: sys.argv[1],
"msgtype"
:
"text"
,
"agentid"
:
"120385392"
,
"text"
: {
"content"
: sys.argv[3]}
}
print data
data = json.dumps(data)
headers = {
'content-type'
:
'application/json'
}
r = requests.post(
'https://oapi.dingtalk.com/message/send?access_token='
+token,data=data,headers=headers)
print r.status_code
ZBLOG =
open
(
'/tmp/newdingding.log'
,
'a'
)
ZBLOG.write(str(datetime.datetime.now()))
ZBLOG.write(
'\n'
)
ZBLOG.write(str(sys.argv))
ZBLOG.write(
'\n'
)
ZBLOG.write(str(r.json()))
ZBLOG.write(
'\n'
)
ZBLOG.close()
|
最后,以上是基本步骤,非常感谢下善若火(http://wuhf2015.blog.51cto.com/8213008/1688614)本文大部分参考该文档,非常感谢。
本文转自 lqbyz 51CTO博客,原文链接:http://blog.51cto.com/liqingbiao/1763073