zabbix 是很熟悉的东西,但是实际上博主已经跳过了这个东西,直接蹦到 Prometheus 去了
但是,存在即合理,当下公司用的是这个,那么用就用吧,zabbix发到钉钉告警。
那么我们也研究一下如何发到钉钉告警,而且好看一些
原理:
原理就是用 post 向钉钉机器人的 webhook 地址提交 Markdown 的 json 信息
首先我们要建立个钉钉群,然后在群中添加一个群机器人,这里就会有两个选择,一个是这个机器人只接受特定的词语,二是向机器人发送消息的机器的ip是固定的。
阿里云建议的是关键词:云监控、云服务、监控、Monitor、ECS、报警

当然,这里更加建议IP,IP是死的,报警里带关键词意味着发送内容被部分固定了。
如上,我们会得到一个钉钉机器人的Webhook地址:
https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx
然后我们要准备一个发送的脚本,python很合适
#!/usr/bin/env python
#coding:utf-8
#zabbix钉钉报警
import requests,json,sys,os,datetime
#说明:这里改为自己创建的机器人的webhook
webhook="https://oapi.dingtalk.com/robot/send?access_token=xxxxxx"
def log(info):
if os.path.isfile("/tmp/dingding.log") == False:
f = open(log_file, 'a+')
else:
f = open(log_file,'w+')
f.write(info)
f.close()
def msg(text,user):
json_text= {
"msgtype": "markdown",
"markdown": {
"title": "zabbix monitor",
"text": text
},
"at": {
"atMobiles": [
user
],
"isAtAll": False
}
}
headers = {'Content-Type': 'application/json'}
r=requests.post(url=webhook,data=json.dumps(json_text),headers=headers).json()
code = r["errcode"]
time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
if code == 0:
log(time + ":消息发送成功 返回码:" + str(code) + "\n")
else:
log(time + ":消息发送失败 返回码:" + str(code) + "\n")
exit(3)
if __name__ == '__main__':
user = sys.argv[1] #用户
subject = sys.argv[2] #标题
text = sys.argv[3] #消息
msg(text,user)
我们把上面的文件内容放到 /usr/lib/zabbix/alertscripts 目录下,名字就叫做 dingding.py ,只能是这个目录,因为这是 zabbix 缺省外挂脚本文件的目录。
从上面代码里我们可以看到,实际是发送了一个 markdown 的文本,那么自然,各种markdown的语法就可以用起来了,仔细看一下钉钉markdown参数的详解:

可以根据自己需求来修改。
接下来我们配置Zabbix的告警配置
- 创建新的告警媒介:媒介类型选择脚本,提前将上方的脚本放置于
/usr/lib/zabbix/alertscripts中并在脚本名称处填写你命名的文件名。

添加告警参数:这里用到了3个参数,第一个是
{ALERT.SENDTO}告警对象,第二个是{ALERT.SUBJECT}告警对象,第三个是{ALERT.MESSAGE}告警正文,按照填写即可。ALERT.SENDTO}#对应Python脚本中的,user=sys.argv1。
{ALERT.SUBJECT}#发送的信息的标题
{ALERT.MESSAGE}#对应Python脚本中的,text=sys.argv3。

增加Message type:一般增加3个就足够了,发现问题、问题恢复、问题更新,详细的设置在下方说明。

这里就是关键了:
发现问题的模板:
 > * ##### 告警主机: {HOSTNAME1} > * ##### 告警时间: {EVENT.DATE} {EVENT.TIME} > * ##### 告警等级: {TRIGGER.SEVERITY} > * ##### 告警信息: {TRIGGER.NAME} > * ##### 告警项目: {TRIGGER.KEY1} > * ##### 问题详情: {ITEM.NAME}:{ITEM.VALUE} > * ##### 当前状态: {TRIGGER.STATUS}:{ITEM.VALUE1} > * ##### 事件ID: {EVENT.ID}Problem recovery(问题恢复)的模板:
 > * #### 警告解除:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME} > * ##### 告警持续时长: {EVENT.DURATION} > * ##### 告警主机: {HOST.NAME} > * ##### 告警信息: {EVENT.NAME} > * ##### 告警等级: {EVENT.SEVERITY} > * ##### 事件ID: {EVENT.ID} > * ##### {TRIGGER.URL}有这两个就够了
创建动作(点击左边菜单的配置—>动作)

添加告警条件

添加 触发器示警度 大于等于 警告

操作,选择发送给Admin组,或者其他组。

在操作细节里,我们发送告警到Admin组,然后方式选dingding,这样就跟报警媒介联系起来了。

这样一轮轮的更新以后,就可以使用了。注意要研究Markdown的语法。另外提前准备好图片。
我们就得到一个跟阿里云告警一摸一样的东西了,说实话,好看,没有鸟用。
