【zabbix】企业微信告警

本文介绍如何在Zabbix监控系统中配置企业微信告警,包括安装必要组件、编写和测试告警脚本,以及在Zabbix中设置告警媒介和动作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇基于我的前两章环境续写:

1、【zabbix】docker安装zabbix、yum安装zabbix-agent

2、【zabbix】MySQL模板创建与监控

企业微信部分

一、首先得有个企业微信号

添加部门

 应用管理创建应用

 

 

 我的企业里面找到企业id,和上面两条一起,总共三条信息都要用到

测试以下通讯是否正常,微信企业号接口调试工具:

企业微信接口调试工具

 

脚本准备部分 

这里准备了两份脚本,两种发送方式,可以自选其一使用!

在宿主机/usr/lib/zabbix/alertscripts/路径下创建weixin.py

第一种脚本:这里要修改脚本里的这三条信息,也就是上文说到的三条信息

  1. corpid='' #企业ID

  2. appsecret='' #secret

  3. agentid=1000002 #AgentID

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#comment: zabbix接入微信报警脚本

import requests
import sys
import os
import json
import logging

logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
	datefmt = '%a, %d %b %Y %H:%M:%S',
	filename = os.path.join('/tmp','weixin.log'),
	filemode = 'a')
	
	
corpid='企业ID' #企业ID
appsecret='secret'  #secret
agentid=AgentID #AgentID

#获取accesstoken
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']

#发送消息
msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken

touser=sys.argv[1]
subject=sys.argv[2]
toparty='3|4|5|6'
message=sys.argv[3]

params={
        "touser": touser,
        "toparty": toparty,
        "msgtype": "text",
        "agentid": agentid,
        "text": {
                "content": message
        },
        "safe":0
}

req=requests.post(msgsend_url, data=json.dumps(params))

logging.info('sendto:' + touser + ';;subject:' + subject + ';;message:' + message)

第二种脚本:使用微信机器人,这个需要在企业微信里面创建群,在群里创建机器人,之后复制机器人的Webhook:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

#!/usr/bin/env python                                                                                                                                                                                                                       
#_*_coding:utf-8 _*_                                                                                                                                                                                                                        
                                                                                                                                                                                                                                            
import requests,sys,json,time                                                                                                                                                                                                               
import urllib3                                                                                                                                                                                                                              
urllib3.disable_warnings()                                                                                                                                                                                                                  
                                                                                                                                                                                                                                            
def SendMessageURL(User,Subject,Messages):     
    ###机器人的Webhook                                                                                                                                                                                             
    URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"                                                                                                                                       
    HEADERS = {"Content-Type": "application/json"}                                                                                                                                                                                          
    Data = {                                                                                                                                                                                                                                
        "msgtype": "markdown",                                                                                                                                                                                                              
        "markdown": {                                                                                                                                                                                                                       
                "content": "# ...... \n <font color=\"warning\">%s</font> \n <font color=\"info\">%s</font> \n <@%s>"% (Subject,Messages,User),                                                                                             
                #"mentioned_list" : [User],                                                                                                                                                                                                 
                #"content": \<font color="warning">Subject</font>  \n  Messages,                                                                                                                                                            
                #"mentioned_list" :[User],   
                ###因为是故障告警群,所以需要@all,这个看自己选择                                                                                                                                                                                            
                "mentioned_list" :[User,"@all"]                                                                                                                                                                                             
                #"mentioned_mobile_list" : ["13800000000","@all"]                                                                                                                                                                           
            }                                                                                                                                                                                                                               
    }                                                                                                                                                                                                                                       
    r = requests.post(url=URL, headers=HEADERS, json=Data, verify=False)                                                                                                                                                                    
    print(r.json())                                                                                                                                                                                                                         
                                                                                                                                                                                                                                            
if __name__ == "__main__":                                                                                                                                                                                                                  
    SENDTO = str(sys.argv[1])                                                                                                                                                                                                               
    SUBJECT = str(sys.argv[2])                                                                                                                                                                                                              
    MESSAGE = str(sys.argv[3])                                                                                                                                                                                                              
    Status = str(SendMessageURL(SENDTO,SUBJECT,MESSAGE))                                                                                                                                                                                    
    print (Status)                                                                                                                                                                                                                          
                                 

脚本ok了 ,先在宿主机测试一下

先看下宿主机python版本

[root@k8s-node2 alertscripts]# python -V
Python 2.7.5
python weixin.py HuYiDuo gaojing jingbao

ok 手机上的企业微信已经收到消息了

我的zabbix服务端是基于zabbix/zabbix-appliance官方镜像,版本为4.4.6,

所以这里就直接把脚本拷贝到容器中去

cp /usr/lib/zabbix/alertscripts/weixin.py 容器id:/usr/lib/zabbix/alertscripts/

进入zabbix/zabbix-appliance容器

docker exec -it 9fc7a9551127f bash

脚本已经过来了

 在容器中再测试一下

python weixin.py HuYiDuo gaojing jingbao

哟?报错了?

 看错误是缺少了requests,另外python版本是2.7.16

用pip install requests 下载看看,结果也报错了,看到这个结果大致思路应该是python版本低了,得升级版本
由于是在容器中安装python环境,所以要先确定下系统的发行版

这里查出来是Alpine Linux,所以这里用不了yum,得用apk

apk add build-base   //安装 GCC等工具
编译时的依赖库
apk add --no-cache -U zlib-dev    //安装 zlib-devel
apk add --no-cache -U openssl-dev   //安装openssl-devel
手动下载:https://www.python.org/downloads/source/
命令下载:wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz
解压:tar -xvf Python-3.7.6.tgz
进入源码根目录:cd Python-3.7.6
配置源码生成makefile
./configure --enable-optimizations --with-ensurepip=install   //加上此选项会安装pip工具
编译:make 
安装:make install
由于执行configure时没有指定安装路径(--prefix=/opt/Python),所以安装到默认路径/usr/local/bin
cd /usr/local/bin
ln -s python3.5 python   //建立软连接,方便执行

其他:
apk add python3
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

​

安装好后继续下载requests

pip install requests

再测试一下

成功了

 zabbix配置企业微信告警部分

 配置报警媒介类型

收件人:
{ALERT.SENDTO}
主题:
{ALERT.SUBJECT}
消息:
{ALERT.MESSAGE}

测试报警媒介

 消息发送成功

注:如果这一步之前在服务器及容器里测试消息都成功,但web页面报警媒介这里测试发送却报错就得检查脚本本身的问题了。

如:#!/usr/bin/env python   这一行是否有对应环境,或者脚本python版本适配问题!

消息接收成功

配置动作

这里先配了个zabbix客户端状态的触发器,待会做测试用

注:触发器这一步配置也蛮重要,触发器配置不好无法触发,告警信息就会无法送达!

 操作里面的发送消息给用户和用户群组得自定义创建

服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
消息内容:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
----------------------------------------------------
服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!
消息内容:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
----------------------------------------------------
服务器:{HOST.NAME}: {TRIGGER.NAME}已更新!
消息内容:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}

这里及下面的发送消息给用户后来我给拿掉了,直接配成了管理组,这个发送消息给xx的配置自己自定义就好,只要能接收到消息。

消息内容框里的内容部分,在消息内容:这一行上面把默认标题框里的信息给填上去,这样告警信息看起来会顺眼美观一些。

接下来给用户Admin配置报警媒介,收件人这里我直接填写的@all

 用户配置完成就可以做测试了

回到服务器,关闭zabbix-agent

systemctl stop zabbix-agent

 成功接收到故障报警信息

 再启动zabbix-agent

systemctl start zabbix-agent

 成功接收到故障恢复信息

好了,至此企业微信告警就配置完了!!!

zabbix全套配置思路也结束了!!!

### 配置 Zabbix企业微信集成实现告警通知 #### 一、概述 为了使 Zabbix 能够通过企业微信发送告警通知,需要完成以下几个主要部分的配置:创建企业微信机器人、编写并配置告警脚本、设置 Zabbix 的媒体类型和动作。 --- #### 二、具体配置步骤 ##### 1. 创建企业微信应用及获取 Webhook 地址 在企业微信管理后台中,进入 **应用管理** 页面,新建一个自定义应用或者启用已有的应用。记录下该应用的 `Secret` 和 `AgentId` 参数。如果选择使用群聊机器人,则可以直接复制其 webhook URL[^2]。 ##### 2. 编写告警脚本 (WeChat.sh) 在 Zabbix Server 上编辑用于发送消息到企业微信的通知脚本: ```bash #!/bin/bash # wechat.sh - 发送企业微信告警通知 corpid="wxXXXXXX" # 替换为企业微信CorpID corpsecret="YYYYYYY" # 应用密钥(Secret) agentid=ZZZZZ # 应用AgentId touser=$1 # 接收者UserID列表(多个以|分隔) subject=$2 # 主题/标题 message=$3 # 正文内容 token_url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}" access_token=$(curl -s ${token_url} | python -c "import sys, json; print(json.load(sys.stdin)['access_token'])") send_url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}" payload='{ "touser": "'${touser}'", "msgtype": "text", "agentid": '${agentid}', "text": { "content": "'"${subject}\n\n${message}"'" }, "safe":"0" }' result=$(curl --silent --show-error --data-binary "${payload}" "${send_url}") echo $result ``` 保存此文件至 `/usr/lib/zabbix/alertscripts/wechat.sh` 并赋予可执行权限: ```bash chmod +x /usr/lib/zabbix/alertscripts/wechat.sh ``` 验证脚本运行正常,尝试手动调用它来确认可以成功向指定用户推送一条测试信息[^3]。 ##### 3. 设置 Zabbix 中的 Media Type 登录 Zabbix Web UI,在 **Configuration -> Media Types** 下新增一种名为 “Enterprise WeChat” 或类似的 media type 类型。 - 类型选择为 Script; - 在 Script name 字段填入刚才放置于 alertscript 文件夹下的脚本名即 `wechat.sh`; - 定义三个宏参数 `{ALERT.SENDTO}`, `{ALERT.SUBJECT}` 及 `{ALERT.MESSAGE}` 对应命令行输入变量 `$1`, `$2`, `$3`. ##### 4. 绑定 User 到 Media Type 前往 **Administration -> Users**, 找到目标用户的 profile 页面添加新的媒介(Media),关联之前建立的企业微信媒体种类,并填写必要的接收方 UserID 数据作为 Send to 值。 ##### 5. 构建 Action 动作触发器 最后一步是在 **Configuration -> Actions** 设计好何时何种条件下激活对应的操作行为。当满足特定条件时(比如主机不可达),系统会依据预设规则自动发起对企业微信端的消息投递请求[^1]。 --- #### 三、注意事项 - 确认所有涉及路径均正确无误,尤其是脚本位置需匹配实际环境部署情况。 - 如果采用的是 HTTPS 请求方式而非本地脚本形式,请注意防火墙策略可能影响外发连接的成功率。 - 测试阶段建议先单独调试脚本逻辑后再整合进整个监控体系里去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值