之前的运维告警多通过SMS、mail 等方式通知到相应的人员。不过虽着 IM 和手机APP的发展,很多告警也会发送到IM软件上去。目前比较常用的是发送到微信和钉钉上。不过微信发送时,需要开通企业公众号,比较麻烦。而钉钉在今年更新的机器人功能比较易用,只要启用的有钉钉,可以通过官方提供的API,可以很方便的post数据到相应的接收人 。其支持的机器人类型也比较丰富,除支持自定义webhook发送消息外,其还有gitlab、github、jira等机器人。

一、创建自定义webhook

通过桌面版或手机APP的钉钉发起聊天,选取相应的联系人创建聊天:

create-dingding-chat
create-dingding-chat

点选右上角的机器人

dingding-robot
dingding-robot

这里选取自定义webhook

点击创建后,指定机器人名称并编辑头像后,会后成一个hook地址 。记得复制下来该hook地址。其包含唯一的access tokenid 。

二、python post调用

当前自定义机器人支持文本(text)、连接(link)、markdown(markdown)等消息类型,需要注意的是发起POST请求时,必须将字符集编码设置成UTF-8,并且指定header的类型为json格式---注意字符和header不能少,少了无法正常发送消息。具体可以参考官方文档

这里以text类型为例,如下:

 1#code from www.361way.com
 2#coding: utf-8
 3import json,urllib2
 4url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxx"
 5header = {
 6    "Content-Type": "application/json",
 7    "charset": "utf-8"
 8    }
 9data = {
10     "msgtype": "text",
11        "text": {
12            "content": "www.361way.com告警测试"
13        },
14     "at": {
15            "isAtAll":True   # at为非必须
16         }
17    }
18sendData = json.dumps(data)
19request = urllib2.Request(url,data = sendData,headers = header)
20urlopen = urllib2.urlopen(request)
21print urlopen.read()

当然在python下可以使用的post请求模块比较多,也可以使用requests模块进行操作。其用法如下:

1req = requests.post(url, data=String_textMsg, headers=HEADERS)

成功调用后示例如下:

dingding-alter
dingding-alter

三、zabbix告警发送钉钉

将上面的代码修改下,我们将tokenid、suject、message做为参数,具体脚本如下:

 1#code from www.361way.com
 2#coding=utf-8
 3import json,urllib2,sys
 4def usage():
 5    '''usage'''
 6    print 'Usage: %s %s %s %s' %(sys.argv[0],'tokenid','Subject','Content')
 7    sys.exit()
 8def dingding(tokenid,subject,message):
 9    url = "https://oapi.dingtalk.com/robot/send?access_token=" + tokenid
10    header = {
11        "Content-Type": "application/json",
12        "charset": "utf-8"
13        }
14    data = {
15         "msgtype": "text",
16            "text": {
17                "content": subject + '\n' + content
18            }
19        }
20    sendData = json.dumps(data)
21    request = urllib2.Request(url,data = sendData,headers = header)
22    urlopen = urllib2.urlopen(request)
23    return urlopen.read()
24def main():
25    if len(sys.argv) != 4:
26        usage()
27    tokenid = sys.argv[1]
28    subject = sys.argv[2]
29    message = sys.argv[3]
30    dingding(tokenid, subject,message)
31if __name__ == "__main__":
32    main()

将上面的脚本放到zabbix_server.conf中的AlertScriptsPath目录下,并给其可执行权限。并在zabbix的web管理界面找到报警媒介类型---创建媒介类型---脚本---并给脚本创建参数,指定传的三个参数:{ALERT.SENDTO}、 {ALERT.SUBJECT} 、{ALERT.MESSAGE}。

zabbix-dingding
zabbix-dingding

并新增一个zabbix用户,指定其接收人为tokenid

zabbix-dingding-user
zabbix-dingding-user

接下来在配置---动作中创建新的动作或编辑已存在的动作,指定触发条件,并选择发送到刚刚的用户,选择使用的脚本为刚刚创建的ding宕机告警。

四、其他

由于钉钉机器人配置起来比较便捷,其适用于自动化巡检、svn和git的提交、现网版本发布等各种场景。同时由于官方提供的便捷示例,也可以很方便的创建富文本消息。官方同时提供了java和php调用的demo 。