企业微信机器人对接Zabbix告警全流程实战指南当服务器半夜突发故障时谁不想第一时间收到告警通知本文将带你从零开始将Zabbix监控系统的告警无缝对接企业微信机器人。无论你是运维新人还是对脚本配置感到困惑的工程师这篇保姆级教程都能帮你避开90%的配置陷阱。1. 环境准备与基础配置在开始之前我们需要确保Zabbix服务端和客户端的基础环境已经就绪。虽然主机名修改并非强制步骤但规范的命名能大幅降低后续维护成本。以下是推荐的初始化操作# 在Zabbix-Server执行 hostnamectl set-hostname zabbix-server # 在Zabbix-Agent执行 hostnamectl set-hostname zabbix-agent # 同步hosts文件到所有节点 echo 10.128.0.0 zabbix-server /etc/hosts echo 10.128.0.1 zabbix-agent /etc/hosts scp /etc/hosts zabbix-agent:/etc/hosts安全策略调整是另一个关键点。Zabbix组件间的通信需要临时关闭SELinuxsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config提示生产环境建议配置SELinux策略而非直接禁用测试环境可暂时关闭以简化流程2. 企业微信机器人创建详解企业微信机器人的创建看似简单但有几个隐藏的坑点需要特别注意企业注册访问企业微信官网使用个人手机号即可注册测试企业无需企业认证机器人添加进入目标群聊 → 点击右上角群设置 → 添加群机器人选择自定义类型设置易于识别的名称如Zabbix-Alert关键信息获取创建完成后点击机器人名称进入详情页Webhook地址中的key参数就是后续脚本需要的Token千万不要使用教程中的示例Key每个机器人都有唯一标识图Key参数位于Webhook地址的query string中3. Zabbix监控体系配置3.1 主机与模板管理首先创建逻辑分组建议按业务或环境划分进入Zabbix控制台 → 配置 → 主机群组 → 创建群组添加监控主机主机名称建议使用业务-环境-序号的命名规则如order-prod-01可见名称可填写更易读的别名群组选择刚创建的群组Agent接口填写被监控节点的真实IP和端口默认10050模板创建时需要注意版本兼容性-- 检查Zabbix版本 SELECT version FROM dbversion;版本号模板兼容性5.0.x基础模板6.0.x增强模板3.2 监控项与触发器配置CPU负载监控的经典配置示例监控项键值system.cpu.load[all,avg1]更新间隔30s生产环境可适当延长历史数据保留7d趋势数据保留365d触发器表达式{主机名:system.cpu.load[all,avg1].last()}5严重性一般告警依赖关系可设置级联触发注意触发器条件需要根据实际服务器配置调整4核和32核服务器的阈值显然不同4. 告警媒介脚本深度解析将以下JavaScript脚本保存为wechat_alert.js存放在Zabbix的AlertScriptsPath目录通常为/usr/lib/zabbix/alertscriptsvar Wechat { token: null, to: null, message: null, parse_mode: null, sendMessage: function() { var params { msgtype: markdown, chat_id: Wechat.to, markdown: { content: Wechat.message }, disable_web_page_preview: true, disable_notification: false }; var request new CurlHttpRequest(), url https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key Wechat.token; request.AddHeader(Content-Type: application/json); var response request.Post(url, JSON.stringify(params)); try { response JSON.parse(response); if (request.Status() ! 200 || response.errcode ! 0) { throw response.errmsg || Unknown error; } } catch (error) { Zabbix.Log(4, [Wechat Webhook] Error: error); throw Send failed: error; } } } try { var params JSON.parse(value); Wechat.token params.Token; Wechat.to params.To; Wechat.message ### ${params.Subject}\n${params.Message}; Wechat.sendMessage(); return OK; } catch (error) { throw Message processing failed: error; }关键配置点检查清单[ ] 脚本文件权限应为755chmod 755 wechat_alert.js[ ] 确保Zabbix用户有执行权限[ ] 测试脚本能否独立运行zabbix用户执行测试[ ] 日志级别调整为4以获取详细调试信息5. 告警策略与消息模板优化5.1 告警动作配置在Zabbix中创建告警媒介管理 → 报警媒介类型 → 创建媒体类型类型选脚本脚本名称填写wechat_alert.js添加三个脚本参数{ALERT.SENDTO}{ALERT.SUBJECT}{ALERT.MESSAGE}5.2 消息模板设计推荐使用Markdown格式增强可读性### 【{TRIGGER.STATUS}】{HOST.NAME} **告警级别**: {TRIGGER.SEVERITY} **发生时间**: {EVENT.DATE} {EVENT.TIME} **问题详情**: {ITEM.NAME} {ITEM.VALUE} **当前状态**: {TRIGGER.STATUS} [点击查看详情]({ZBX_URL}/tr_events.php?triggerid{TRIGGER.ID}eventid{EVENT.ID})效果对比元素原始文本优化后效果状态标识PROBLEM PROBLEM主机信息Host: server1Host:server1数值展示CPU: 98%CPU Load: 98%时间格式2023-01-01 00:002023-01-01 00:00:006. 全链路测试与排错指南6.1 模拟告警测试触发CPU高负载的最快方法# 在被监控机器执行 yes /dev/null 观察三个关键节点是否正常Zabbix监控图表是否显示负载上升触发器状态是否变为PROBLEM企业微信群是否收到告警消息6.2 常见问题排查症状1收不到任何告警检查Zabbix动作日志管理 → 报警 → 动作日志查看zabbix_server.log是否有脚本执行错误测试手动运行脚本sudo -u zabbix /usr/lib/zabbix/alertscripts/wechat_alert.js {Token:your_key}症状2收到告警但格式错乱确认消息模板中的花括号未被转义检查Markdown语法是否正确企业微信支持部分语法测试纯文本消息是否能正常发送症状3告警延迟严重调整监控项的更新间隔检查Zabbix队列状态仪表盘 → 队列概览优化触发器依赖关系避免级联计算7. 高阶配置技巧7.1 告警分级通知通过修改触发器严重性和动作条件实现分级告警// 在脚本中添加严重性判断 if (params.Severity Disaster) { Wechat.message \nall 请立即处理; }7.2 自动恢复通知优化恢复通知的模板### 【恢复通知】{HOST.NAME} 问题已解决持续时间: {EVENT.AGE} 恢复时间: {EVENT.RECOVERY.TIME} 初始问题: {EVENT.NAME}7.3 告警去重策略在动作配置中设置默认操作步骤持续时间15m问题更新时触发仅当严重性变化时实际项目中最容易被忽视的是脚本权限问题和Key的过期机制。有次凌晨三点收到告警轰炸排查发现是企业微信机器人Key被误重置。现在团队规定所有关键凭证必须由两人共同保管。
保姆级教程:手把手教你用企业微信机器人给Zabbix 6.0/5.x发告警(附脚本和避坑点)
企业微信机器人对接Zabbix告警全流程实战指南当服务器半夜突发故障时谁不想第一时间收到告警通知本文将带你从零开始将Zabbix监控系统的告警无缝对接企业微信机器人。无论你是运维新人还是对脚本配置感到困惑的工程师这篇保姆级教程都能帮你避开90%的配置陷阱。1. 环境准备与基础配置在开始之前我们需要确保Zabbix服务端和客户端的基础环境已经就绪。虽然主机名修改并非强制步骤但规范的命名能大幅降低后续维护成本。以下是推荐的初始化操作# 在Zabbix-Server执行 hostnamectl set-hostname zabbix-server # 在Zabbix-Agent执行 hostnamectl set-hostname zabbix-agent # 同步hosts文件到所有节点 echo 10.128.0.0 zabbix-server /etc/hosts echo 10.128.0.1 zabbix-agent /etc/hosts scp /etc/hosts zabbix-agent:/etc/hosts安全策略调整是另一个关键点。Zabbix组件间的通信需要临时关闭SELinuxsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config提示生产环境建议配置SELinux策略而非直接禁用测试环境可暂时关闭以简化流程2. 企业微信机器人创建详解企业微信机器人的创建看似简单但有几个隐藏的坑点需要特别注意企业注册访问企业微信官网使用个人手机号即可注册测试企业无需企业认证机器人添加进入目标群聊 → 点击右上角群设置 → 添加群机器人选择自定义类型设置易于识别的名称如Zabbix-Alert关键信息获取创建完成后点击机器人名称进入详情页Webhook地址中的key参数就是后续脚本需要的Token千万不要使用教程中的示例Key每个机器人都有唯一标识图Key参数位于Webhook地址的query string中3. Zabbix监控体系配置3.1 主机与模板管理首先创建逻辑分组建议按业务或环境划分进入Zabbix控制台 → 配置 → 主机群组 → 创建群组添加监控主机主机名称建议使用业务-环境-序号的命名规则如order-prod-01可见名称可填写更易读的别名群组选择刚创建的群组Agent接口填写被监控节点的真实IP和端口默认10050模板创建时需要注意版本兼容性-- 检查Zabbix版本 SELECT version FROM dbversion;版本号模板兼容性5.0.x基础模板6.0.x增强模板3.2 监控项与触发器配置CPU负载监控的经典配置示例监控项键值system.cpu.load[all,avg1]更新间隔30s生产环境可适当延长历史数据保留7d趋势数据保留365d触发器表达式{主机名:system.cpu.load[all,avg1].last()}5严重性一般告警依赖关系可设置级联触发注意触发器条件需要根据实际服务器配置调整4核和32核服务器的阈值显然不同4. 告警媒介脚本深度解析将以下JavaScript脚本保存为wechat_alert.js存放在Zabbix的AlertScriptsPath目录通常为/usr/lib/zabbix/alertscriptsvar Wechat { token: null, to: null, message: null, parse_mode: null, sendMessage: function() { var params { msgtype: markdown, chat_id: Wechat.to, markdown: { content: Wechat.message }, disable_web_page_preview: true, disable_notification: false }; var request new CurlHttpRequest(), url https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key Wechat.token; request.AddHeader(Content-Type: application/json); var response request.Post(url, JSON.stringify(params)); try { response JSON.parse(response); if (request.Status() ! 200 || response.errcode ! 0) { throw response.errmsg || Unknown error; } } catch (error) { Zabbix.Log(4, [Wechat Webhook] Error: error); throw Send failed: error; } } } try { var params JSON.parse(value); Wechat.token params.Token; Wechat.to params.To; Wechat.message ### ${params.Subject}\n${params.Message}; Wechat.sendMessage(); return OK; } catch (error) { throw Message processing failed: error; }关键配置点检查清单[ ] 脚本文件权限应为755chmod 755 wechat_alert.js[ ] 确保Zabbix用户有执行权限[ ] 测试脚本能否独立运行zabbix用户执行测试[ ] 日志级别调整为4以获取详细调试信息5. 告警策略与消息模板优化5.1 告警动作配置在Zabbix中创建告警媒介管理 → 报警媒介类型 → 创建媒体类型类型选脚本脚本名称填写wechat_alert.js添加三个脚本参数{ALERT.SENDTO}{ALERT.SUBJECT}{ALERT.MESSAGE}5.2 消息模板设计推荐使用Markdown格式增强可读性### 【{TRIGGER.STATUS}】{HOST.NAME} **告警级别**: {TRIGGER.SEVERITY} **发生时间**: {EVENT.DATE} {EVENT.TIME} **问题详情**: {ITEM.NAME} {ITEM.VALUE} **当前状态**: {TRIGGER.STATUS} [点击查看详情]({ZBX_URL}/tr_events.php?triggerid{TRIGGER.ID}eventid{EVENT.ID})效果对比元素原始文本优化后效果状态标识PROBLEM PROBLEM主机信息Host: server1Host:server1数值展示CPU: 98%CPU Load: 98%时间格式2023-01-01 00:002023-01-01 00:00:006. 全链路测试与排错指南6.1 模拟告警测试触发CPU高负载的最快方法# 在被监控机器执行 yes /dev/null 观察三个关键节点是否正常Zabbix监控图表是否显示负载上升触发器状态是否变为PROBLEM企业微信群是否收到告警消息6.2 常见问题排查症状1收不到任何告警检查Zabbix动作日志管理 → 报警 → 动作日志查看zabbix_server.log是否有脚本执行错误测试手动运行脚本sudo -u zabbix /usr/lib/zabbix/alertscripts/wechat_alert.js {Token:your_key}症状2收到告警但格式错乱确认消息模板中的花括号未被转义检查Markdown语法是否正确企业微信支持部分语法测试纯文本消息是否能正常发送症状3告警延迟严重调整监控项的更新间隔检查Zabbix队列状态仪表盘 → 队列概览优化触发器依赖关系避免级联计算7. 高阶配置技巧7.1 告警分级通知通过修改触发器严重性和动作条件实现分级告警// 在脚本中添加严重性判断 if (params.Severity Disaster) { Wechat.message \nall 请立即处理; }7.2 自动恢复通知优化恢复通知的模板### 【恢复通知】{HOST.NAME} 问题已解决持续时间: {EVENT.AGE} 恢复时间: {EVENT.RECOVERY.TIME} 初始问题: {EVENT.NAME}7.3 告警去重策略在动作配置中设置默认操作步骤持续时间15m问题更新时触发仅当严重性变化时实际项目中最容易被忽视的是脚本权限问题和Key的过期机制。有次凌晨三点收到告警轰炸排查发现是企业微信机器人Key被误重置。现在团队规定所有关键凭证必须由两人共同保管。