🚀 Zabbix 企业级实战:自定义监控取值与值映射 (Value Mapping) 配置指南
导读:
在企业日常运维中,我们经常需要监控特定业务系统的运行状态。业务脚本通常返回离散的数字状态码(如 0、1、2),但纯数字在监控大盘中不够直观。
本文将通过一个真实的企业级实战案例,演示如何编写严谨的 Zabbix 自定义监控脚本,并通过 Zabbix Web 前端的值映射 (Value Mapping) 功能,将数字状态码转换为直观的文字描述(如“业务正常”、“业务宕机”)。
🛠️ 第一阶段:被监控端 (Zabbix Agent) 配置
1. 编写业务系统状态监控脚本
我们首先在被监控端编写一个健壮的 Shell 脚本,用于读取业务状态文件并输出对应的状态码。
创建并编辑脚本:
vi /etc/zabbix/scripts/check_biz_status.sh
脚本内容(包含严格的防御性容错机制):
#!/bin/bash
set -euo pipefail
# ==================== 脚本说明 ====================
# 功能:业务系统状态监控脚本(Zabbix自定义监控)
# 状态码定义(必须严格对应):
# 0 = 业务异常(非OK/WARN/文件异常/内容非法)
# 1 = 业务正常
# 2 = 业务降级/高负载/警告
# ================================================
# 固定配置
STATUS_FILE="/tmp/biz_status.txt"
# ==================== 1. 仅允许 root 和 zabbix 用户执行 ====================
current_user=$(id -un)
if [[ "${current_user}" != "zabbix" && "${current_user}" != "root" ]]; then
echo "错误:仅允许 zabbix 和 root 用户执行此脚本" >&2
exit 1
fi
# ==================== 2. 文件不存在:输出错误提示并退出 ====================
if [ ! -e "${STATUS_FILE}" ]; then
echo "错误:状态文件 ${STATUS_FILE} 不存在" >&2
exit 1
fi
# ==================== 3. 不是普通文件(如目录/软链接):报错退出 ====================
if [ ! -f "${STATUS_FILE}" ]; then
echo "错误:${STATUS_FILE} 不是有效普通文件" >&2
exit 1
fi
# ==================== 4. 读取并清洗内容 ====================
# 去空格 + 转大写(严格匹配)
STATE=$(sed -n '1p' "${STATUS_FILE}" | xargs | tr '[:lower:]' '[:upper:]')
# ==================== 5. 严格状态判断 ====================
case "${STATE}" in
OK)
echo "1" # 业务正常
;;
WARN)
echo "2" # 业务降级/警告
;;
*)
echo "0" # 业务异常
;;
esac
exit 0
2. 赋予脚本执行权限及属主
为了确保 Zabbix Agent 进程有权限执行该脚本,需修改属主并赋予执行权限:
chmod +x /etc/zabbix/scripts/check_biz_status.sh
chown zabbix:zabbix /etc/zabbix/scripts/check_biz_status.sh
3. 本地模拟测试脚本捕获逻辑
在配置 Zabbix Agent 之前,先在本地模拟业务状态的变化,验证脚本逻辑是否符合预期:
# 测试异常状态 (DOWN)
[root@zabbix-agent scripts]# echo "DOWN" > /tmp/biz_status.txt
[root@zabbix-agent scripts]# /etc/zabbix/scripts/check_biz_status.sh
0
# 测试正常状态 (OK)
[root@zabbix-agent scripts]# echo "OK" > /tmp/biz_status.txt
[root@zabbix-agent scripts]# /etc/zabbix/scripts/check_biz_status.sh
1
# 测试告警状态 (WARN)
[root@zabbix-agent scripts]# echo "WARN" > /tmp/biz_status.txt
[root@zabbix-agent scripts]# /etc/zabbix/scripts/check_biz_status.sh
2
(测试通过,脚本能够精准处理不同输入并转换为数字状态码。)
4. 配置 Zabbix Agent 自定义键值 (UserParameter)
在被监控端定义 Zabbix 的监控键值映射,将键值 biz.status 与我们编写的脚本绑定。
[root@zabbix-agent scripts]# cat /etc/zabbix/zabbix_agentd.d/userparameter_biz.conf
UserParameter=biz.status,/etc/zabbix/scripts/check_biz_status.sh
5. 重启服务并使用 Zabbix 工具验证
重启 Agent 生效配置,并使用自带的 zabbix_agentd -t 工具模拟服务端进行数据抓取测试:
[root@zabbix-agent scripts]# systemctl restart zabbix-agent
# 模拟 WARN 状态抓取
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|2]
# 模拟 OK 状态抓取
[root@zabbix-agent scripts]# echo "OK" > /tmp/biz_status.txt
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|1]
# 再次模拟 WARN 状态抓取
[root@zabbix-agent scripts]# echo "WARN" > /tmp/biz_status.txt
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|2]
# 模拟 DOWN 状态抓取
[root@zabbix-agent scripts]# echo "DOWN" > /tmp/biz_status.txt
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|0]
(看到 [t|X] 证明 Zabbix Agent 已经完美注册并能够返回数据。)
🖥️ 第二阶段:服务端 (Zabbix Web) 模板与值映射配置
💡 注意事项 (Zabbix 6.0+):
从 Zabbix 6.0 开始,“值映射”不再是全局配置,而是与主机 (Host) 或 模板 (Template) 强绑定的。最佳实践是将其写在自定义模板中。
6.1 创建自定义模板并配置“值映射”
- 登录 Zabbix Web 前端,导航至 配置 (Configuration) -> 模板 (Templates/Applications),点击右上角 创建模板 (Create template)。
- 模板名称:
Template_Biz_Status - 模板群组:选择
Templates
- 模板名称:
- 点击顶部的 值映射 (Value mapping) 标签页,点击 添加 (Add):
- 名称:
业务状态值映射 - 映射规则配置如下:
- 等于
1➔ 映射为:业务正常 (OK) - 等于
2➔ 映射为:业务降级/高负载 (WARN) - 等于
0➔ 映射为:业务异常/宕机 (DOWN)
- 等于
- 名称:
- 点击 更新/添加 保存模板配置。

6.2 在模板中提前创建好值映射

6.3 创建监控项 (Item) 关联值映射
- 在刚刚创建的模板中,进入 监控项 (Items) 标签页,点击 创建监控项 (Create item)。
- 填写以下核心参数:
- 名称:业务系统运行状态
- 类型:Zabbix 客户端(主动式) (或被动式,取决于你的 Agent 模式)
- 键值:
biz.status(必须与 UserParameter 中定义的完全一致) - 信息类型:数字 (无符号)
- 更新间隔:
3s(按需调整) - 值映射:下拉选择刚才创建的
业务状态值映射
- 保存监控项。

6.4 创建2条触发器,模拟的业务指标键值为0代表业务异常,业务指标键值为2代表业务告警,并且已经将值映射好状态


6.5 创建图形

6.6 将创建好的监控项模板Template_Biz_Status关联给主机,这样主机就拥有了这一块完整的监控项模板和触发器

6.7 配置告警媒介-以qq邮箱告警为例
1.新建qq邮箱告警媒介,配置好smtp服务端口、发件人邮箱、用户名和密码,其中注意的是密码是邮箱里面的授权码


2.测试qq邮箱是否能正常接收邮件


3.配置问题 以及 问题恢复发送的邮箱消息模板
【Zabbix告警】[{HOST.NAME}] {TRIGGER.NAME}
==================================================<br>
⚠️ ZABBIX 告警通知<br>
==================================================<br>
告警主机:{HOST.NAME} ({HOST.IP})<br>
告警时间:{EVENT.DATE} {EVENT.TIME}<br>
告警级别:{TRIGGER.SEVERITY}<br>
告警状态:{TRIGGER.STATUS}<br>
告警内容:{TRIGGER.NAME}<br>
问题监控项:{ITEM.NAME}<br>
问题键值:{ITEM.KEY}<br>
当前状态值:{ITEM.LASTVALUE}<br>
触发器URL:{TRIGGER.URL}<br>
==================================================<br>
请尽快处理问题!<br>
==================================================

【Zabbix恢复】[{HOST.NAME}] {TRIGGER.NAME} 已恢复
==================================================<br>
✅ ZABBIX 恢复通知<br>
==================================================<br>
恢复主机:{HOST.NAME} ({HOST.IP})<br>
恢复时间:{EVENT.DATE} {EVENT.TIME}<br>
恢复内容:{TRIGGER.NAME}<br>
问题监控项:{ITEM.NAME}<br>
恢复前状态值:{ITEM.LASTVALUE}<br>
==================================================<br>
问题已自动恢复,请确认业务状态!<br>
==================================================

4.配置zabbix管理用户告警媒介
这里配置的是「用户报警媒介」,它的作用是:
告诉 Zabbix:告警要发给谁(收件人邮箱)
用什么方式发(你选的qq邮箱媒介)
什么时候发(你设置的时间范围)
哪些级别的告警要发(你勾选的严重性)


6.8 配置触发器动作



6.9 模拟正常业务发生故障的完整流程
1.模拟监控指标发生异常
[root@zabbix-agent scripts]# echo "WARN" > /tmp/biz_status.txt
[root@zabbix-agent scripts]#
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|2]
[root@zabbix-agent scripts]# echo "DOWN" > /tmp/biz_status.txt
[root@zabbix-agent scripts]#
[root@zabbix-agent scripts]#
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|0]
2.zabbix页面监控告警通知

3.qq邮箱查看是否已经接收到业务异常告警通知


4.模拟业务系统恢复正常
[root@zabbix-agent scripts]# echo "OK" > /tmp/biz_status.txt
[root@zabbix-agent scripts]#
[root@zabbix-agent scripts]# zabbix_agentd -t biz.status
biz.status [t|1]
zabbix界面没有告警事件

qq邮箱有业务恢复正常的告警通知


浙公网安备 33010602011771号