本文将带来 Zabbix 6.0 LTS 如何利用 Python 脚本实现钉钉机器人通知告警信息。
正文
本文环境
- RockyLinux 8.5
- Zabbix 6.0 LTS
- Python 3
钉钉配置
登录钉钉软件,点击右上方的 号
点击创建按钮(如下图)
填写相关信息,群聊需要 3 人以上
群聊创建完成后,点击下图红框的设置图标(如下图)
选择智能群助手
进入机器人管理,点击添加机器人后面的 … (如下图)
进入机器人管理后,下拉找到自定义(通过 Webhook 接入自定义服务,如下图)
点击添加
填写相关信息。
钉钉机器人需要设置安全条件,如果不符合安全条件,则无法通过钉钉机器人发送消息,这点需要注意
- 自定义关键词
- 加签
- IP 地址(支持网段)
完成机器人添加后记住 Webhook 的地址,下面会用到
添加完成后,群聊里会有相关提示
Zabbix 配置
由于是脚本的关系,所以需要找到 Zabbix 调用脚本的路径
代码语言:javascript复制cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath
vim /etc/zabbix/zabbix_server.conf
将注释取消掉,重启 Zabbix 服务
代码语言:javascript复制systemctl restart zabbix-server
脚本部分
Python 脚本需要注意格式缩进,如果出现脚本不可用,基本就是格式问题,
- python3
- python2
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
import time
headers = {'Content-Type': 'application/json;charset=utf-8'}
time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
api_url = "您的 Webhook 地址"
def msg(text,user):
json_text= {
"msgtype": "markdown",
"markdown": {
"title": "Kasar",
"text": text "n n @" user
},
"at": {
"atMobiles": [
user
],
"isAtAll": False
}
}
r = requests.post(api_url,data=json.dumps(json_text),headers=headers).json()
code = r["errcode"]
if __name__ == '__main__':
text = sys.argv[2]
user = sys.argv[1]
msg(text,user)
代码语言:javascript复制#!/usr/bin/python2
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=c8a8336f237f35bc7efe68bcb4f8a71344950397b338f9fef1ed6019bbb4ef04"
def msg(text,user):
json_text= {
"msgtype": "markdown",
"markdown": {
"title":"IT小白Kasar",
"text": text "n n @" user
},
"at": {
"atMobiles": [
user
],
"isAtAll": False
}
}
r=requests.post(api_url,data=json.dumps(json_text),headers=headers).json()
code = r["errcode"]
if __name__ == '__main__':
text = sys.argv[2]
user = sys.argv[1]
msg(text,user)
.content .tabs ul { margin: 0; } .tab-content { display: none; } function onTabClick (event) { var tabTitle = $(event.currentTarget).children('span:last-child').text(); $('.article .content .tab-content').css('display', 'none'); $('.article .content .tabs li').removeClass('is-active'); $('#' tabTitle).css('display', 'block'); $(event.currentTarget).parent().addClass('is-active'); }
添加执行权限后执行脚本
代码语言:javascript复制chmod x dingding.py
./dingding.py 1 1
执行报错,出现文件或者目录没找到,如下图
证明系统不存在该路径,需要安装 python3
代码语言:javascript复制yum -y install python3
再次执行,出现问题,出现模块无法找到,如下图
需要通过 pip 安装 request 模块
代码语言:javascript复制dnf -y install python3-pip
pip3 install requests
再次执行,且钉钉显示消息
Zabbix 前端配置
创建媒介类型 路径为:Administration(管理)–> Media types(媒介类型)–> Create media type(创建媒介类型)
填写相关信息,名称为 dingding,Type(类型)选择 Script(脚本),脚本参数填写 {ALERT.SENDTO}
,{ALERT.MESSAGE}
,这两个为内置宏,且和 python 脚本传参有很大关联性,这里分别对应user = sys.argv[1]
,text = sys.argv[2]
创建完成后点击刚刚创建的媒介后面的 test(测试)按钮
这里仅仅需要填写 Send to(发送)和 Message(内容),这里也和上面的内置宏一一对应,另外本文采用的安全条件为关键字(test),正文里有 test
如果出现 Media type test successful. 则代表正常,如果失败则要分析具体原因了。
钉钉 APP 里显示测试消息,显示的为正文,所以代表 Subject 是不会带过来的,和脚本有直接关系
用户权限授权 路径为:Administration(管理)–> Users(用户) 本文以 Admin 用户为例,点击用户
找到 Media 选项卡,点击 Add(添加)
Type(类型)选择刚刚创建的 dingding 测试用户随便填写,如果采用了 @ 方式,那就要选择正确信息,另外接收告警的级别、时间段可以自行选择
效果如下
创建动作 路径为:Configuration(配置)–> Actions(动作)–> Trigger actions(触发器动作)
点击 Create action(创建动作)
Action 选项卡主要是设置条件,本文以 Zabbix Servers主机组为例,其余参考官网文档
在 Operations(操作)选项卡主要是告警通知相关的内容,点击 Operation(操作)块里的 add(添加)
在 send Message 这一块属于告警升级的相关内容,这个在后续会提到,本文不讲,本文只针对用户,也就是 send to users 部分选择 Admin 用户,send only to(仅发送)选择 dingding,这块就是调用刚刚创建的媒介,Custom message 和前方的媒介里有关联性,任意配置一项即可。
配置完成
继续刚才的 custom message(自定义消息)部分讲,由于通知需要模板消息,此时在媒介里的 Message templates(消息模板)选项卡可以配置模板。
点击 add 后会出现模板的配置界面,会自带消息模板,这里和动作里的效果是一模一样的,当然这里也可以修改,也可以不配置,在动作里配置,但是必须得有一个是配置
添加完成(问题、问题恢复、问题更新)
创建一个虚拟主机测试,IP 为 10.0.0.1,主机组为 Zabbix servers,类型为 agent,模板为 ICMP Ping
由于是虚拟主机,所以无法 ping 通,会触发告警
钉钉 APP 能看到机器人推送的通知
此时换成能 ping 通的 IP,告警恢复
钉钉 APP 同样收到恢复的通知
写在最后
整个流程看起来很复杂,其实相对来说还好,但是存在格式问题,对于新手而言相对比较麻烦,排错压力比较大,所以建议新手还是使用 JavaScript 脚本的方式去实现,可以在通过 webhook 的方式实现,参考笔者之前的那一篇文章。