环境信息
- 系统:Ubuntu
- Zabbix 版本:Zabbix Server
- 告警方式:企业微信机器人 webhook + shell 脚本告警
- 脚本存放目录:
/usr/lib/zabbix/alertscripts
⚠️重要提示:root 用户执行脚本正常,不代表 zabbix 进程可以正常调用,需要注意权限、systemd 沙箱、配置重启问题;媒介类型页面的【测试】按钮报错,不代表真实告警不可用,以实际触发器事件推送结果为准。
一、获取企业微信机器人 Webhook 地址
- 企业微信群聊 → 群设置 → 添加机器人
- 创建自定义机器人,复制 webhook 地址
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxx
保存该地址,后续配置需要使用。
二、编写企业微信告警 shell 脚本
- 进入 alertscripts 目录
cd /usr/lib/zabbix/alertscripts
- 创建脚本
wecom.sh
sudo vim wecom.sh
脚本参考内容:
#!/bin/bash
# Zabbix 企业微信机器人告警脚本
WEBHOOK_URL="$1"
SUBJECT="$2"
MESSAGE="$3"
curl -s -X POST "$WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"text\",
\"text\": {
\"content\":\"${SUBJECT}\n${MESSAGE}\"
}
}"
- 设置脚本权限与属主
# 修复Windows粘贴脚本带来CRLF换行问题(如从windows复制脚本到服务器必执行)
sudo sed -i 's/\r$//' /usr/lib/zabbix/alertscripts/wecom.sh
# 设置执行权限
sudo chmod 755 /usr/lib/zabbix/alertscripts/wecom.sh
# 修改属主为zabbix,zabbix进程需要读取执行脚本
sudo chown zabbix:zabbix /usr/lib/zabbix/alertscripts/wecom.sh
- 本地验证脚本是否可用(root 执行)
替换为你自己的 webhook 密钥
/usr/lib/zabbix/alertscripts/wecom.sh "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" "测试标题" "测试告警内容"
成功返回:{"errcode":0,"errmsg":"ok"},代表脚本本身逻辑没问题。
三、确认 Zabbix 服务端脚本路径配置
- 查看 zabbix_server 配置
grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
确保配置项:
AlertScriptsPath=/usr/lib/zabbix/alertscripts
如果修改了此配置,必须重启 zabbix-server 服务,配置不会热生效
sudo systemctl restart zabbix-server
- systemd 沙箱问题(Ubuntu 常见坑)部分 Ubuntu 系统 zabbix-server 受 systemd 沙箱隔离,root 可运行脚本,zabbix 进程调用报错 exit code6。
sudo systemctl edit zabbix-server
写入:
[Service]
PrivateTmp=no
ProtectSystem=no
ProtectHome=no
重载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart zabbix-server
四、Zabbix Web 端配置【报警媒介类型】
路径:管理 → 报警媒介类型 → 创建媒介类型
- 名称:
企业微信告警模板脚本 - 类型:
脚本 - ⚠️脚本名称:只填写脚本文件名,不要填写完整路径
wecom.sh
❌错误示例:
/usr/lib/zabbix/alertscripts/wecom.sh,会出现路径拼接重复,文件找不到。
- 脚本参数(依次添加 3 条参数)
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
- 勾选【已启用】,点击更新保存。
注意:页面的【测试】按钮经常出现
Process exited with code:6报错,该测试功能存在缺陷,不作为最终判断依据,以实际触发器事件推送为准。
五、给用户绑定告警媒介
路径:用户 → 用户 → Admin(或告警接收用户) → 报警媒介 → 添加
- 类型:选择【企业微信告警模板脚本】
- 收件人:粘贴完整企业微信机器人 webhook 地址
- 启用时间:
1-24(全天告警) - 告警级别:勾选全部需要接收的级别(至少勾选
Not classified未分类) - 勾选【已启用】,保存。
权限校验:该用户必须拥有告警主机所在主机组的读权限,否则动作不会触发。
六、配置动作(触发告警推送)
路径:配置 → 动作 → 创建动作
动作标签页
- 名称:企业微信告警动作
- 事件源:触发器
- 条件:默认不填,匹配全部触发器事件(也可按需增加过滤条件)
操作标签页(故障发生)
- 新操作:点击添加
- 操作类型:发送通知
- 发送到用户:选择接收告警用户(Admin)
- 仅使用:选择【企业微信告警模板脚本】
- 消息主题(示例)
【Zabbix告警】🔴故障发生:{TRIGGER.NAME}
- 消息内容(示例)
==========故障通知==========
告警主机:{HOST.NAME}
主机IP:{HOST.IP}
触发器名称:{TRIGGER.NAME}
告警级别:{TRIGGER.SEVERITY}
当前值:{TRIGGER.VALUE}
发生时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
===========================
恢复操作标签页(故障恢复通知)
- 勾选【恢复操作】
- 操作类型:发送通知
- 发送到用户:Admin
- 仅使用:企业微信告警模板脚本
- 消息主题
【Zabbix告警】✅故障恢复:{TRIGGER.NAME}
- 消息内容
==========恢复通知==========
告警主机:{HOST.NAME}
主机IP:{HOST.IP}
触发器名称:{TRIGGER.NAME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
故障持续时长:{EVENT.DURATION}
事件ID:{EVENT.ID}
===========================
保存动作配置。
七、验证告警效果
- 制造触发器故障,产生事件(监测 → 事件页面可以看到事件记录)
- 等待 10‑30 秒,Zabbix 动作异步执行,查看企业微信群机器人消息
- 故障恢复,验证恢复通知是否正常推送。
排错关键点:
- 监测 – 事件页面没有事件:触发器表达式不满足条件,和告警脚本无关。
- 有事件但是收不到消息:检查用户权限、动作条件、zabbix-server 是否重启、脚本权限属主。
- root 执行脚本 ok,zabbix 调用异常:重点排查 systemd 沙箱、脚本属主权限。
常见问题汇总
| 报错现象 | 原因 | 解决方案 |
|---|---|---|
No such file or directory | 媒介类型填写完整脚本绝对路径,路径重复拼接 | 脚本名称只填文件名wecom.sh |
Process exited with code:6 | 脚本权限、systemd 沙箱、换行符 CRLF | 修复脚本换行、设置 zabbix 属主、关闭 systemd 沙箱、重启 zabbix-server |
| root 执行脚本 ok,zabbix 不推送 | AlertScriptsPath 修改未重启服务 /zabbix 无脚本执行权限 | 修改配置后必须重启 zabbix-server,脚本 chown zabbix:zabbix |
| 产生事件但是没有调用脚本 | 用户没有主机组读权限 / 动作条件过滤事件 | 给用户分配主机组读权限,检查动作过滤条件 |










