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

一、创建自定义webhook

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

java 调用钉钉机器人的 钉钉机器人的webhook_自定义

点选右上角的机器人

java 调用钉钉机器人的 钉钉机器人的webhook_php发送企业通知钉钉_02

这里选取自定义webhook

java 调用钉钉机器人的 钉钉机器人的webhook_自定义_03

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

二、python post调用

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

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

#code from www.361way.com
#coding: utf-8
import json,urllib2
url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxx"
header = {
"Content-Type": "application/json",
"charset": "utf-8"
}
data = {
"msgtype": "text",
"text": {
"content": "www.361way.com告警测试"
},
"at": {
"isAtAll":True # at为非必须
}
}
sendData = json.dumps(data)
request = urllib2.Request(url,data = sendData,headers = header)
urlopen = urllib2.urlopen(request)
print urlopen.read()

当然在python下可以使用的post请求模块比较多,也可以使用requests模块进行操作。其用法如下:req = requests.post(url, data=String_textMsg, headers=HEADERS)

成功调用后示例如下:

java 调用钉钉机器人的 钉钉机器人的webhook_php发送企业通知钉钉_04

三、zabbix告警发送钉钉

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

#code from www.361way.com
#coding=utf-8
import json,urllib2,sys
def usage():
'''usage'''
print 'Usage: %s %s %s %s' %(sys.argv[0],'tokenid','Subject','Content')
sys.exit()
def dingding(tokenid,subject,message):
url = "https://oapi.dingtalk.com/robot/send?access_token=" + tokenid
header = {
"Content-Type": "application/json",
"charset": "utf-8"
}
data = {
"msgtype": "text",
"text": {
"content": subject + '\n' + content
}
}
sendData = json.dumps(data)
request = urllib2.Request(url,data = sendData,headers = header)
urlopen = urllib2.urlopen(request)
return urlopen.read()
def main():
if len(sys.argv) != 4:
usage()
tokenid = sys.argv[1]
subject = sys.argv[2]
message = sys.argv[3]
dingding(tokenid, subject,message)
if __name__ == "__main__":
main()

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

java 调用钉钉机器人的 钉钉机器人的webhook_php发送企业通知钉钉_05

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

java 调用钉钉机器人的 钉钉机器人的webhook_php发送企业通知钉钉_06

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

四、其他

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