基于钉钉方式报警,网上广泛存在的是:
html
一、报警脚本中 使用钉钉提供的 "text" 文本方式填充内容,报警内容均为黑白字体;python
二、钉钉报警彩色显示内容,使用github上现成的二进制程序,配合xml文本,固定格式报警,程序有可能对zabbix版本有些缺陷;git
基于markdown消息类型,能够实现字体彩色显示,而且报警格式配置更加灵活,更有利于个性化定制消息
github
成品报警图
web
钉钉报警各类文章配置大同小异,再也不详细介绍,只将步骤写出,其余参考网络文章便可,着重会写出markdown类型配置。json
后面用到的先在此说明:api
zabbix版本: V3.4.6 zabbix脚本路径: zabbix_server.conf 文件中 AlertScriptsPath 字段配置 webhook 是什么,机器人支持的markdown语法是什么?
https://open-doc.dingtalk.com/docs/doc.htm?treeId=257&articleId=105735&docType=1
markdown
zabbix web配置网络
一、 Administrator -- media types 增长钉钉报警类型app
二、Administrator-- users 创建报警用户
此处使用super user , 发送对象为 手机号
三、 configure -- action 添加报警动做 【重点说明:markdown 内容编辑在于此】
在 【options -- default messages】中写入markdown语法内容,用html语法可设置字体颜色,在;
此处对应脚本中要发送的内容,内容使用zabbix内置变量便可。
<font color=#FF0000 size=6 face="黑体">事故等级: {TRIGGER.SEVERITY} </font> ##### **发生时间**: {EVENT.DATE} {EVENT.TIME} ##### **机器**: {HOST.NAME} - {HOST.IP} **问题**: {TRIGGER.NAME} **报警值**: {ITEM.VALUE}
在 option details 中 send only to 选中 设置的钉钉报警 (详细设置参考网络文章,略)
同理,【recovery options -- default mesages】写入报警恢复时发送内容
**状态**: {TRIGGER.STATUS} **机器**: {HOST.NAME} - {HOST.IP} **恢复时间**: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME} **问题**: {TRIGGER.NAME} **报警值**: {ITEM.VALUE}
以上是页面配置中针对markdown类型的语法实例,效果见文章开头,根据我的喜爱DIY设置便可。
发送脚本基于网上的python脚本,本身作了一些修改 :
#!/usr/bin/env python # -*- coding: utf-8 -*- # https://www.aityp.com ## mobified by benson , remove config file import requests import json import sys import os import time #import configparser headers = {'Content-Type': 'application/json;charset=utf-8'} time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) log_file = "/var/log/zabbix/zabbix_dingding.log" api_url = "https://oapi.dingtalk.com/robot/send?access_token=bdd59ba55647c60ea9d63025c2af416fb9bd67d17e351430b0535d4ba55da2d2" def log(info): #注意权限,不然写不进去日志 if os.path.isfile(log_file) == False: f = open(log_file, 'a+') f = open(log_file,'a+') f.write(info) f.close() def msg(text,user): json_text= { "msgtype": "markdown", "markdown": { "title":"zabbix monitor", "text": text }, "at": { "atMobiles": [ user ], "isAtAll": True } } r=requests.post(api_url,data=json.dumps(json_text),headers=headers).json() code = r["errcode"] if code == 0: log(time + ":消息发送成功 返回码:" + str(code) + "\n") else: log(time + ":消息发送失败 返回码:" + str(code) + "\n") exit(3) if __name__ == '__main__': text = sys.argv[3] user = sys.argv[1] msg(text,user)