1.自带告警方式

(缺点是,只能页面告警)

2.邮件

(密码就是邮件上申请的)

主题

Problem: {EVENT.NAME}:

固定前缀 “Problem:” 表示 “故障:”;

{EVENT.NAME}是 Zabbix 的宏变量,会自动替换为触发器的名称(比如 “Web 服务器 CPU 使用率过高”)。

消息内容(HTML 格式)

里面的<b>是 HTML 加粗标签,宏变量会自动替换为实际故障信息:

{EVENT.TIME}:故障发生的时间(比如 “14:30:22”);

{EVENT.DATE}:故障发生的日期(比如 “2025-11-20”);

{EVENT.NAME}:故障对应的触发器名称(同主题里的内容);

{HOST.NAME}:发生故障的主机名称(比如 “web-server-01”);

{EVENT.SEVERITY}:故障的严重级别(比如 “严重”“警告”“信息”);

{EVENT.OPDATA}:触发器中设置的 “操作数据”(通常是故障的补充说明,比如 “CPU 使用率 > 90%”);

{EVENT.ID}:该故障事件的唯一 ID(用于在 Zabbix 中定位事件);

{TRIGGER.URL}:该触发器的 Zabbix 页面链接(点击可直接跳转到触发器详情)。

主题

Resolved in {EVENT.DURATION}: {EVENT.NAME}:

固定前缀 “Resolved in”:表示 “已在 XX 时长内恢复”;

{EVENT.DURATION}:宏变量,自动替换为故障从发生到恢复的持续时长(比如 “2h 15m”);

{EVENT.NAME}:自动替换为原故障对应的触发器名称(比如 “Web 服务器 CPU 使用率过高”)。

消息内容(HTML 格式)

里面的<b>是加粗标签,宏变量会自动替换为实际恢复信息:

<b>Problem has been resolved</b>:固定文本,意为 “故障已恢复”;

at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}:

{EVENT.RECOVERY.TIME}:故障恢复的具体时间(比如 “15:20:30”);

{EVENT.RECOVERY.DATE}:故障恢复的日期(比如 “2025-11-20”);

<b>Problem name</b> {EVENT.NAME}:重复显示原故障的触发器名称;

<b>Severity</b> {EVENT.SEVERITY}:原故障的严重级别(比如 “严重”“警告”);

<b>Duration</b> {EVENT.DURATION}:故障从发生到恢复的持续时长(同主题里的宏);

<b>Host</b> {HOST.NAME}:发生故障的主机名称(比如 “web-server-01”);

<b>Original problem ID</b> {EVENT.ID}:原故障事件的唯一 ID(用于在 Zabbix 中追溯原故障);

{TRIGGER.URL}:原故障对应的触发器在 Zabbix 中的页面链接(点击可查看触发器详情)。

替换

“问题” 类型消息模板(故障触发时的通知)

消息类型:保持 “问题”

主题(替换原内容):

故障:{EVENT.NAME}

消息内容(替换原内容):

<b>故障发生</b> 于 {EVENT.TIME}({EVENT.DATE})<br> <b>故障名称</b>:{EVENT.NAME}<br> <b>主机</b>:{HOST.NAME}<br> <b>严重级别</b>:{EVENT.SEVERITY}<br> <b>故障详情</b>:{EVENT.OPDATA}<br> <b>故障事件ID</b>:{EVENT.ID}<br> 触发器链接:{TRIGGER.URL}

“问题恢复” 类型消息模板(故障修复后的通知)

消息类型:保持 “问题恢复”

主题(替换原内容):

故障已恢复(持续时长:{EVENT.DURATION}):{EVENT.NAME}

消息内容(替换原内容):

<b>故障已恢复</b> 于 {EVENT.RECOVERY.TIME}({EVENT.RECOVERY.DATE})<br> <b>故障名称</b>:{EVENT.NAME}<br> <b>严重级别</b>:{EVENT.SEVERITY}<br> <b>持续时长</b>:{EVENT.DURATION}<br> <b>主机</b>:{HOST.NAME}<br> <b>原故障事件ID</b>:{EVENT.ID}<br> 触发器链接:{TRIGGER.URL}

配置收件人

 

(对比明显区别)

配置邮件报警动作

微信方式

(页面登陆)

(创建报警机器人)

钉钉报警方式

第一种 Webhook+自定义关键词

[root@zabbix /var/lib/zabbixsrv/alertscripts]$ cat dingding1.sh
#!/bin/bash
# Zabbix 6.0 钉钉告警脚本(修复关键词不匹配+JSON格式)
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# ==================== 配置项 ====================
WEBHOOK_URL=”https://oapi.dingtalk.com/robot/send?access_token=4b070705a6fb383cdedc50603bfdc2fe0d871c7c0e99e7800679039ca9c283c3″
DING_KEYWORD=”Zabbix” # 替换为钉钉机器人的自定义关键词
LOG_FILE=”/var/log/zabbix/dingtalk.log”
# ================================================

log() {
echo “[$(date +’%F %T’)] $1″ >> ${LOG_FILE}
}

# 特殊字符转义(解决JSON格式错误)
escape_special_chars() {
local input=”$1”
echo -n “${input}” | sed -e ‘s/\\/\\\\/g’ -e ‘s/”/\\”/g’ -e ‘s/\n/\\n/g’ -e ‘s/\r/\\r/g’
}

# 校验参数
if [ $# -ne 2 ]; then
log “错误:参数数量错误!需传入标题和内容”
exit 1
fi

# 转义标题和内容
ALERT_TITLE=$(escape_special_chars “$1”)
ALERT_CONTENT=$(escape_special_chars “$2”)

# 拼接消息(强制包含钉钉关键词,放在最前面避免遗漏)
MESSAGE=$(printf ‘{
“msgtype”:”markdown”,
“markdown”:{
“title”:”%s”,
“text”:”### 🚨 %s(%s)\\n\\n%s\\n\\n> 告警时间:%s\\n> 数据来源:Zabbix 6.0″
},
“at”:{“isAtAll”:false}
}’ “${ALERT_TITLE}” “${ALERT_TITLE}” “${DING_KEYWORD}” “${ALERT_CONTENT}” “$(date +’%F %T’)”)

# 发送告警
RESPONSE=$(/usr/bin/curl -s -X POST \
-H “Content-Type: application/json;charset=utf-8” \
–data “${MESSAGE}” \
–connect-timeout 10 \
${WEBHOOK_URL})

# 记录日志
log “关键词:${DING_KEYWORD} | 原始JSON:${MESSAGE:0:150}… | 响应:${RESPONSE}”
if echo “${RESPONSE}” | grep -q ‘”errcode”:0’; then
log “告警发送成功!”
exit 0
else
log “告警发送失败!错误:${RESPONSE}”
exit 1
fi

 

第二种 Webhook+加签(不推荐)

[root@zabbix /var/lib/zabbixsrv/alertscripts]$ cat dingding.sh
#!/bin/bash
# Zabbix 6.0 钉钉加签脚本(严格匹配官方文档,解决签名不匹配)
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# ==================== 配置项(必须准确替换!)====================
WEBHOOK_URL=”https://oapi.dingtalk.com/robot/send?access_token=22b9938bd6191b8b0fbd23ebae33f4d8fb8a6e1af149b3c772995c27edfb5f36″ # 仅保留access_token部分,不要带其他参数
SECRET=”SEC18a83bb810f2a6223d5c5744ef85358f7a5d7aada3c8aeadb496e6ff4c64153f” # 复制钉钉机器人的加签密钥,无空格/截断
LOG_FILE=”/var/log/zabbix/dingtalk.log”
# ==================================================================

log() {
echo “[$(date +’%F %T.%3N’)] $1” >> ${LOG_FILE}
}

# 生成毫秒级时间戳(兼容所有Linux)
get_millisecond() {
if command -v date &> /dev/null && date +%s%3N &> /dev/null; then
echo $(date +%s%3N)
else
echo $(($(date +%s)*1000 + $(date +%N)/1000000))
fi
}

# 校验参数
if [ $# -ne 2 ]; then
log “错误:参数数量错误,需传入标题和内容”
exit 1
fi

# 1. 生成毫秒级时间戳
timestamp=$(get_millisecond)
log “毫秒级时间戳:${timestamp}”

# 2. 按官方逻辑拼接字符串(printf生成实际换行,核心修复!)
sign_raw=$(printf “%s\n%s” “${timestamp}” “${SECRET}”)
log “签名原始字符串(前20位):${sign_raw:0:20}…”

# 3. 官方标准加密流程
# Step1: HMAC-SHA256加密 → Step2: Base64编码
sign_base64=$(echo -n “${sign_raw}” | openssl dgst -sha256 -hmac “${SECRET}” -binary | base64)
log “Base64签名(前20位):${sign_base64:0:20}…”

# 4. URL编码签名(仅处理钉钉要求的特殊字符)
sign_urlencode=$(echo -n “${sign_base64}” | sed \
-e ‘s/+/%2B/g’ \
-e ‘s/\//%2F/g’ \
-e ‘s/=/%3D/g’ \
-e ‘s/%/%25/g’ \
-e ‘s/&/%26/g’ \
-e ‘s/?/%3F/g’)
log “URL编码后签名(前20位):${sign_urlencode:0:20}…”

# 5. 拼接最终URL(严格按官方格式,无多余字符)
FINAL_URL=”${WEBHOOK_URL}&timestamp=${timestamp}&sign=${sign_urlencode}”
log “最终请求URL(前100位):${FINAL_URL:0:100}…”

# 6. 拼接消息(确保JSON合法,包含关键词)
TITLE=$(echo -n “$1” | sed -e ‘s/”/\\”/g’ -e ‘s/\n/\\n/g’)
CONTENT=$(echo -n “$2” | sed -e ‘s/”/\\”/g’ -e ‘s/\n/\\n/g’)
# 强制包含关键词(若钉钉配置了)
MESSAGE=$(printf ‘{“msgtype”:”markdown”,”markdown”:{“title”:”%s”,”text”:”### 🚨 %s\\n\\n%s\\n\\n> 告警时间:%s(关键词:Zabbix)”},”at”:{“isAtAll”:false}}’ \
“$TITLE” “$TITLE” “$CONTENT” “$(date +’%F %T.%3N’)”)
log “消息JSON(前100位):${MESSAGE:0:100}…”

# 7. 发送请求(关闭curl输出,仅记录响应)
RESPONSE=$(curl -s -X POST \
-H “Content-Type: application/json;charset=utf-8” \
-d “${MESSAGE}” \
–connect-timeout 3 \
–max-time 5 \
“${FINAL_URL}”)

# 8. 校验结果
log “钉钉响应:${RESPONSE}”
if echo “${RESPONSE}” | grep -q ‘”errcode”:0’; then
log “告警发送成功!”
exit 0
else
log “告警发送失败!错误:${RESPONSE}”
exit 1
fi

添加监控

web页面 发件人:报警媒介类型

{ALERT.SUBJECT} #报警标题

{ALERT.MESSAGE} #报警内容

 

 

 

 

注意事项

端口

SMTP 服务器端口是用于邮件发送(SMTP 协议)的网络端口,不同端口对应不同的安全传输方式,Zabbix 配置中常用的 SMTP 端口有这 3 个核心选项:

25 端口是 SMTP 的传统默认端口,早期用于明文邮件传输;但现在多数邮件服务商(如腾讯、网易)会限制 25 端口(防止垃圾邮件),通常仅用于内部邮件服务器之间的传输。

465 端口对应SSL/TLS 加密(即 “SMTP over SSL”),连接建立时直接加密,是早期的安全邮件端口,部分服务商(如部分企业邮箱)仍支持。

587 端口是 IANA 标准的邮件提交端口,对应 “STARTTLS” 加密(先建立明文连接,再升级为加密),是当前主流邮件服务商(如 QQ 邮箱、网易邮箱、微软 Exchange)推荐的端口,安全性和兼容性更好。

填写注意

*SMTP 服务器

已填smtp.163.com,这是网易 163 邮箱的官方 SMTP 服务器地址,正确。

SMTP 服务器端口

当前填了465,网易 163 的 465 端口对应 SSL/TLS 加密,所以这个端口是对的。

*SMTP HELO

需填写邮箱对应的域名,这里改为163.com(因为是 163 邮箱,替换当前的example.com)。

*SMTP 电邮

需填写你的实际 163 邮箱账号(例如zabbix_notice@163.com),替换当前的zabbix@example.com(这是示例地址,无法实际使用)。

安全连接

当前选的是 “无”,但端口465对应 SSL 加密,所以必须改为SSL/TLS。

认证

当前选的是 “无”,但网易 163 的 SMTP 需要身份认证,所以必须改为用户名和密码:

用户名:就是上面 “SMTP 电邮” 填的 163 邮箱账号(例如zabbix_notice@163.com);

密码:不是邮箱的登录密码,而是网易邮箱的SMTP 授权码(需先登录 163 邮箱,在 “设置→POP3/SMTP/IMAP” 中开启 SMTP 服务,并生成授权码)。

 

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。