专栏首页阿冬的运维技术栈Zabbix配置钉钉的带图片报警

Zabbix配置钉钉的带图片报警

实现思路:

  1. 首先报警信息里要有itemid,这是前提,根据信息里传入的参数使用正则匹配到itemid
  2. 构建一个session会话,或者使用cookie来进行登录,根据itemid去请求图片,并将获取到的图片保存到本地,由于markdown的图片链接需要被访问到,我的zabbix是在内网中,所以需要将图片传到图床或者传到一个具有公网IP的web服务器,我这里传到了我的个人服务器
  3. 将报警信息转换成markdown语法格式
  4. 构造请求利用钉钉的webhook发送消息

设置钉钉机器人

  • 钉钉机器人需要进行安全设置,这里我定义了关键词”通知“,也就是说发送的消息中必须包含这个词

脚本实现

  • 由于需要将图片从本地拷到远端,免密需要提前配置好,脚本是用zabbix用户执行,Web服务器目录的安全策略最好设置一下
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests,time
import json,sys,re,os

zabbixserver_url ='http://192.168.99.200/index.php'
#定义远端的web服务器地址,将图片复制到远端的web目录下
pname_path='http://47.103.15.51/dingding_pic/'
#定义获取的图片地址
testUrl = "http://192.168.99.200/chart.php"
host='192.168.99.200'
def get_itemid():
    itemid=re.search(r'ITEM ID:(\d+)',sys.argv[2]).group(1)
    return itemid
def get_picture(itemid,pname):
    #构建session,或者可以一次构建之后使用cookie登录
    myRequests = requests.Session()
    try:
        loginHeaders = {
            "Host":host,
            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
        }
        # 构建登录所需的信息
        playLoad = {
            "name": "Admin",
            "password": 'zabbix',
            "autologin": "1",
            "enter": "Sign in",
        }
        myRequests.post(url=zabbixserver_url, headers=loginHeaders, data=playLoad)
        testUrlplayLoad = {
           "from": "now-10m",
           "to": "now",
           "itemids": itemid,
           "width": "700",
        }
        testGraph =  myRequests.get(url=testUrl,params=testUrlplayLoad)
        IMAGEPATH = os.path.join('/usr/lib/zabbix/alertscripts/dingding_pic/', pname)
        #将获取到的图片数据写入到文件中去
        with open(IMAGEPATH,'wb') as f:
            f.write(testGraph.content)
        os.system("sudo scp %s root@47.103.15.51:/usr/share/nginx/html/dingding_pic" %IMAGEPATH)
        pname_url = pname_path+pname
        return pname_url
    except Exception as e:
        print(e)
        return False

#构造发送消息的请求
def send_msg(pname_url,info3):
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    print(info3)
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": info1,
            "text": "## 通知:\n"+info3+"![screenshot](%s)\n"%(pname_url)

        },
        "at":{
            "atMobiles": reminders,
            "isAtAll": False,
        },
        }
    r = requests.post(url=webhook_url,json=data,headers=headers)
    print(r.text)
#对报警信息进行格式化
def info_text():
    new_text = ""
    x = info2.split('\n')
    for i in x:
        if re.search('ITEM ID',str(i)):
            pass
        else:
            new_text+="- "+str(i)+('\n')
    print(type(new_text))
    return new_text

if __name__ == '__main__':
    #将报警信息写入日志
    os.system("echo hello >> /tmp/syslog.md")
    pname = str(int(time.time()))+'.png'
    info1 = str(sys.argv[1])
    info2 = str(sys.argv[2])
    info3 = info_text()

    with open('/tmp/syslog.md','a') as f:
        f.write(info1)
        f.write(info2)
        f.close()
    reminders = []
    webhook_url = 'https://oapi.dingtalk.com/robot/send?access_token=771ded387e6be652c51a2b6c83cade4e048e3da4fdfe128f1db6b124b87df18a'
    itemid = get_itemid()
    pname_url=get_picture(itemid,pname)
    print(pname_url)
    send_msg(pname_url,info3)

定义报警媒介类型

  • 打开zabbix监控web,在管理菜单中选择报警媒介类型,创建媒体类型,选择脚本,填写刚才编写的邮件带图脚本名称zabbix_email_pic.py,脚本参数,最后添加
  • 打开管理中的用户,点击需要设置邮件告警的用户,然后在报警媒介中添加报警媒介,在弹框中选择刚才定义的类型,收件人自定义,最后添加

定义告警动作

点击配置菜单中的动作,创建动作,然后根据图片进行填写

操作
默认标题 Zabbix告警:服务器:{HOSTNAME}发生: {TRIGGER.NAME}故障!
ITEMID:{ITEM.ID}
告警主机:{HOST.NAME}
告警主机:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
事件ID:{EVENT.ID}
恢复操作
Zabbix告警:服务器:{HOST.NAME}发生: {TRIGGER.NAME}已恢复!
ITEMID:{ITEM.ID}
告警主机:{HOST.NAME}
告警主机:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
事件ID:{EVENT.ID}

最终效果

可以手动触发一个报警测试效果

  • 至此,zabbix的微信,邮箱,钉钉的带图报警均已配置完成
文章分享自微信公众号:
阿冬的运维技术栈

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • centos7下docker运行zabbix钉钉报警配置

    zabbix监控系统部署完成以后,出现问题及时报警。是运维进行故障应急响应的关键。下面就来实现zabbix通过钉钉报警。

    IT不难
  • ZABBIX 事件通知

    在生产环境下被监控主机关联了监控项和触发器,当主机监控指标异常此时触发器状态发生改变产生异常事件,此时动作(action)选项将根据自定义的内容触发。当发生不同...

    Kevin song
  • 121-配置zabbix通过钉钉机器人报警

    zabbix服务器监控到异常,可以通过各种方式发送报警消息。配置步骤如下: 1、创建报警脚本

    凯茜的老爸
  • zabbix模块配置学习

    (1) Windows Agent下载安装配置 Agent下载地址:https://www.zabbix.com/download_agents 选择我们对应的...

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

    本文将带来 Zabbix 6.0 LTS 如何利用 Python 脚本实现钉钉机器人通知告警信息。

    IT小白Kasar
  • Zabbix实现钉钉告警通知,支持@多人功能

    钉钉报警时基于zabbix,访问钉钉应用接口去推送的报警消息,所以我们需要一个在钉钉创建一个报警应用。

    子润先生
  • 【运维篇】zabbix4.0添加钉钉报警

    1.进入zabbix server 配置文件目录 /etc/zabbix/zabbix_server.conf 安装方式不同所在目录不同。可以用 find / ...

    学一学大数据
  • 21年XX科技公司面试复盘

    9. Zabbix监控数据库的哪些项? 必须监控的有:CPU负载,内存使用率,磁盘大小,IO读写,网络流量,

    用户8229522
  • Python钉钉报警及Zabbix集成钉钉报警

    https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

    常见_youmen
  • Zabbix添加钉钉markdown报警

    默认zabbix服务端配置文件 /etc/zabbix/zabbix_server.conf 找到AlertScriptsPath,默认位置在/usr/lib...

    明哥的运维笔记
  • 分布式监控系统Zabbix3.4-钉钉告警配置记录

    群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。例如:通过聚合GitHub,GitLab等源码管理服务,实现源...

    洗尽了浮华
  • 专栏|Zabbix使用JavaScript配置Webhook发送告警通知

    Zabbix运维工程师,熟悉Zabbix开源监控系统的架构。乐于分享Zabbix运维经验,个人公众号“运维开发故事”。

    Zabbix
  • 基于docker的zabbix5.4 配置Cloud Alert报警方式

    在业务量小的时候,zabbix监控系统采用邮件或钉钉报警完全可以满足要求。随着业务的发展,对运维要求越来越高。由于邮件或钉钉消息经常看不到,所以配置新的报警方...

    IT不难
  • GrayLog中使用Prometheus Alert实现钉钉群机器人自动告警

    支持主流的监控系统Prometheus,Zabbix,日志系统Graylog和数据可视化系统Grafana发出的预警消息,

    yuanfan2012
  • Zabbix知识库更新,群内实用问答集锦!

    Zabbix中文问答知识库可登陆网站查看,文中提及案例均来源于#Zabbix开源社区微信群#及#宏时数据Zabbix技术服务群#。

    Zabbix
  • 【Zabbix】中小型企业Zabbix监控实战之告警大全

    转载声明:本文转载自「数睿技术」 前言 本篇文章介绍目前常用的告警方式,以及对功能实现做讲解。本篇文章中出现的代码片段可以回复"监控脚本"获取完整代码。 ...

    小小科
  • 快速掌握Zabbix配置

    zabbix的配置全部都在zabbix web上完成,下面以zabbix的中文界面为主进行介绍。

    Devops海洋的渔夫

扫码关注云+社区

领取腾讯云代金券