Zabbix 随笔:钉钉机器人告警(脚本方式)

2022-03-03 08:47:39 浏览数 (1)

本文将带来 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
代码语言:javascript复制
#!/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 的方式实现,参考笔者之前的那一篇文章。

0 人点赞