基於釘釘方式報警,網上廣泛存在的是:
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)