Zabbix Community Templates 实战:用 Zimbra「zmcontrol status」模板监控邮件服务器核心服务状态
Zabbix Community Templates 实战:用 Zimbra「zmcontrol status」模板监控邮件服务器核心服务状态
本篇文章基于 Zabbix Community Templates 仓库中的 Zimbra 模板(5.4 版 README),讲解如何在不引入额外 Agent 插件的前提下,仅凭 crontab + awk + Zabbix 原生 UserParameter 三条链路,将 Zimbra 邮件服务器 zmcontrol status 输出的各服务状态(amavis、antispam、antivirus、mailbox、mta、proxy、webmail、admin console、zmconfigd 等)纳入 Zabbix 监控。读完本文,你将掌握该模板的完整部署步骤、每个监控项 key 的解析原理、模板导出文件(YAML)背后的告警与预处理设计,以及版本差异与常见故障排查方法。
模板定位:监控 Zimbra 服务健康度的轻量方案
模板名为 Zimbra,归属于 Templates 模板组,作者为 LeleKimi(7.0 版起由 LeleKimi 与 Anfossi Dennis 共同维护)。它的定位非常聚焦:监控 Zimbra 服务器上若干核心服务的运行状态,数据来源是 Zimbra 自带的 zmcontrol status 命令输出,而不是通过 SOAP API、JMX 或 SNMP 采集。
仓库中同时提供多个 Zabbix 版本的导出文件,可按服务器版本选择导入:
| Zabbix 版本 | 导出文件格式 | 相对路径 |
|---|---|---|
| 5.0 | XML | template_zimbra_zmcontrol_status.xml |
| 5.4 | YAML | template_zimbra_zmcontrol_status.yaml |
| 6.0 | YAML | template_zimbra_zmcontrol_status.yaml |
| 7.0 | YAML | template_zimbra_zmcontrol_status.yaml |
仓库根目录的 README.md 在 Applications → Mail_servers 分类下列出了该模板(与之并列的还有另一款基于 Zabbix Agent 采集更多指标的 template_zimbra_collaboration 模板,二者互补)。
从模板结构上看,它不使用宏(Macros)、不链接其他模板(Template links)、也没有发现规则(Discovery rules)——是一个完全自包含、结构极简的静态模板,非常适合作为理解 Zabbix 模板导出文件与 UserParameter 工作流的入门范本。
工作原理:从 zmcontrol status 到 Zabbix 监控项
整套方案由三段链路组成,缺一不可:
- 定时落盘:Zimbra 服务器 root crontab 每 3 分钟执行一次
zmcontrol status,把结果写入/tmp/zmcontrol_status; - 本地解析:Zabbix Agent 通过 UserParameter 调用
awk,从该文件中按服务名匹配出状态字段(Running/Stopped)并返回; - 入库告警:Zabbix Server 按模板中定义的 item 周期性(
delay: 3m)拉取这些值,经预处理转换为 0/1 数字后,由触发器判断服务是否停止。
zmcontrol status 的原始输出是文本表格,每一行包含服务名与状态。例如典型的输出片段如下(示意格式,实际缩进以空格/Tab 混合):
Host mail.example.com
amavis Running
antispam Running
antivirus Running
mailbox Running
mta Running
proxy Running
service webapp Running
zimbraAdmin Running
zmconfigd Running
模板中的 awk 表达式正是针对这种「服务名 + 状态」的格式设计的:
- 对
amavis、mta这类单单词服务名,状态位于行内第 2 个字段,用awk '/服务名/{print $2}'; - 对
service webapp、zimbraAdmin这类多单词服务名,状态位于第 3 个字段,因此改用awk '/service webapp/{print $3}'、awk '/zimbraAdmin/{print $3}'。
从 7.0 版模板的描述文本可以看到,UserParameter 建议直接放到 conf.d 目录,例如 /etc/zabbix/zabbix_agentd.conf.d/zimbra_template.conf,这样升级与卸载都更干净。
第一步:Zimbra 侧准备——crontab 定时落盘
在 Zimbra 服务器的 root crontab 中加入下面这一行(模板原文给出的配置):
*/3 * * * * sudo -u zimbra /opt/zimbra/bin/zmcontrol status > /tmp/zmcontrol_status
该行含义:
*/3 * * * *:每 3 分钟执行一次,与模板中 item 的更新间隔3m保持一致;sudo -u zimbra:以zimbra系统用户身份运行(zmcontrol命令通常要求 zimbra 用户权限);> /tmp/zmcontrol_status:把标准输出重定向到/tmp/zmcontrol_status文件。
部署完成后,建议先手动验证文件内容是否正确生成,再继续配置 Agent:
cat /tmp/zmcontrol_status
确认文件里能看到各服务的 Running/Stopped 状态行后,再进行下一步。注意模板 5.4 版 README 中该文件名写作 zmcontrol\_status(Markdown 下划线转义),实际落盘文件名是 /tmp/zmcontrol_status,UserParameter 与 awk 表达式均引用后者。
第二步:配置 Zabbix Agent 的 UserParameter
将以下 UserParameter 添加到 zabbix_agentd.conf 或 conf.d 目录下的独立配置文件中(如 /etc/zabbix/zabbix_agentd.conf.d/zimbra_template.conf)。5.0/5.4/6.0 版本模板对应 9 个基础 key:
UserParameter=zimbra.amavis.status,awk '/amavis/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.antispam.status,awk '/antispam/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.antivirus.status,awk '/antivirus/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.mailbox.status,awk '/mailbox/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.mta.status,awk '/mta/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.zmconfigd.status,awk '/zmconfigd/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.webmail.status,awk '/service webapp/{print $3}' /tmp/zmcontrol_status
UserParameter=zimbra.webadm.status,awk '/zimbraAdmin/{print $3}' /tmp/zmcontrol_status
UserParameter=zimbra.proxy.status,awk '/proxy/{print $2}' /tmp/zmcontrol_status
7.0 版模板扩展到了 17 个 key,在上述基础上追加了 logger、snmp、cbpolicyd、spell、opendkim、apache、memcached、stats 等服务的采集(详见 7.0 版模板 的描述文本):
UserParameter=zimbra.logger.status,awk '/logger/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.snmp.status,awk '/snmp/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.cbpolicyd.status,awk '/cbpolicyd/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.spell.status,awk '/spell/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.opendkim.status,awk '/opendkim/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.apache.status,awk '/apache/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.memcached.status,awk '/memcached/{print $2}' /tmp/zmcontrol_status
UserParameter=zimbra.stats.status,awk '/stats/{print $2}' /tmp/zmcontrol_status
配置完成后重启 Zabbix Agent,并在 Agent 本机或 Zabbix Server 上做一次快速自检:
zabbix_agentd -t zimbra.mta.status
# 或在 Server 端用 zabbix_get 验证:
# zabbix_get -s <zimbra-ip> -k zimbra.mta.status
正常时应返回 Running(或 Stopped)。如果返回空,多半是 /tmp/zmcontrol_status 尚未生成或 awk 模式与服务实际输出不匹配(详见下文「故障排查」)。
第三步:导入模板并绑定主机
- 下载与 Zabbix Server 版本对应的导出文件(见上表);
- 在 Zabbix Web 界面中进入 Configuration → Templates → Import,选择文件导入;
- 导入后可在模板列表中看到
Zimbra,它归属于Templates模板组; - 在主机配置中把
Zimbra模板链接到 Zabbix Agent 所监控的 Zimbra 服务器主机上。
需要注意:模板所有监控项的类型均为 Zabbix agent(被动检查),因此 Zabbix Server 必须能访问该主机的 Agent 端口(默认 10050),且 Agent 上必须已经完成第二步的 UserParameter 配置。导入成功后,主机会自动创建模板中定义的 9 个(5.0/5.4/6.0)或 16 个(7.0,详见下文说明)监控项,并每 3 分钟采集一次。
模板内部结构源码级剖析:YAML 导出文件
README 只展示了采集清单,而模板真正的工作逻辑藏在导出文件里。以 5.4 版 YAML 为例,每个 item 的结构如下(以 zimbra.mta.status 为代表):
- uuid: ba02f873bd3040b299caac81e4933b9c
name: 'Status MTA Zimbra'
key: zimbra.mta.status
delay: 3m
history: 180d
trends: '0'
value_type: TEXT
preprocessing:
- type: REGEX
parameters:
- Running
- '0'
error_handler: CUSTOM_VALUE
error_handler_params: '1'
tags:
- tag: Application
value: Zimbra
triggers:
- uuid: 3876287ec8ce412b96911b850f8290cd
expression: last(/Zimbra/zimbra.mta.status)<>0
name: 'Service MTA Stopped'
priority: DISASTER
各字段含义与设计意图:
| 字段 | 取值 | 说明 |
|---|---|---|
key |
zimbra.<服务>.status |
与 Agent 侧 UserParameter 一一对应 |
delay |
3m |
每 3 分钟采集一次,与 crontab 执行周期同步 |
value_type |
TEXT |
awk 返回的是字符串状态,原始值按文本存储 |
history |
180d |
历史数据保留 180 天 |
trends |
'0' |
关闭趋势存储(TEXT 类型本身也不参与趋势聚合) |
tags |
Application: Zimbra |
打上应用标签,便于在最新数据页面过滤筛选 |
预处理:把文本状态变成可告警的数字
这是整个模板最巧妙的一环。由于 value_type 是 TEXT,直接用 <> 比较文本并不方便,模板通过 REGEX 预处理 把状态归一化为 0/1:
- 正则参数
[Running, 0]:将文本中的Running替换为0; error_handler: CUSTOM_VALUE+error_handler_params: '1':当文本不包含Running(即服务处于Stopped或输出缺失)时,正则匹配失败,此时按错误处理策略将值置为1。
于是最终语义非常清晰:0 = 服务运行中,1 = 服务未运行。所有触发器都基于这一归一化结果判断,表达式统一为:
last(/Zimbra/zimbra.<服务>.status)<>0
即值不等于 0(服务不在 Running 状态)时触发告警。该设计同时具备容错性:即使 awk 因服务未安装而匹配不到任何行,错误处理器也会兜底返回 1,避免出现「无数据」而漏报。
触发器与告警优先级
README 中「Triggers」一节标注为 "There are no triggers in this template.",但查看实际的 YAML/XML 导出文件可以发现,模板内置了与监控项一一对应的触发器——README 相对导出文件已过时,实际以导出文件为准。5.4 版共 9 个触发器,按服务重要程度分为两档优先级:
| 监控项 key | 触发器名称 | 优先级 | 触发条件 |
|---|---|---|---|
zimbra.mailbox.status |
Service Mailbox Stopped | DISASTER | last(...)<>0 |
zimbra.mta.status |
Service MTA Stopped | DISASTER | last(...)<>0 |
zimbra.proxy.status |
Service Proxy Stopped | DISASTER | last(...)<>0 |
zimbra.webmail.status |
Service Webmail Stopped | DISASTER | last(...)<>0 |
zimbra.amavis.status |
Service Amavis Stopped | HIGH | last(...)<>0 |
zimbra.antispam.status |
Service AntiSpam Stopped | HIGH | last(...)<>0 |
zimbra.antivirus.status |
Service Antivírus Stopped | HIGH | last(...)<>0 |
zimbra.webadm.status |
Service Admin Console Stopped | HIGH | last(...)<>0 |
zimbra.zmconfigd.status |
Service Zmconfigd Stopped | HIGH | last(...)<>0 |
优先级设计意图非常明确:mailbox(邮箱存储)、mta(邮件传输)、proxy(代理/反代)、webmail(网页邮箱)直接决定用户能否收发邮件与访问 Web 界面,一旦停止即视为**灾难级(DISASTER)告警;而 amavis(病毒内容过滤)、antispam(反垃圾)、antivirus(反病毒)、admin console(管理控制台)、zmconfigd(配置守护进程)相对次要,采用高(HIGH)**优先级。7.0 版在此基础上新增的触发器中,memcached 与 opendkim 被划为 DISASTER,logger、snmp、cbpolicyd、spell、stats 则为 HIGH。
7.0 版的差异
7.0 版(YAML 文件)相比早期版本:
- 描述文本中明确给出了 conf.d 目录的推荐放置路径;
- UserParameter 清单扩展到 17 个(新增 logger、snmp、cbpolicyd、spell、opendkim、apache、memcached、stats);
- 模板中实际定义了 16 个监控项与对应触发器。其中
zimbra.apache.status虽然提供了 UserParameter 定义,但模板中并没有对应的 item——从源码结构看,这属于作者预留的扩展项,若你的 Zimbra 部署启用了 Apache 服务,可以自行在模板中补齐同名 item 与触发器,或直接沿用现有监控项的风格扩展新的 key。
故障排查与常见问题
-
/tmp/zmcontrol_status文件不存在或内容为空 检查 root crontab 是否生效、sudo -u zimbra /opt/zimbra/bin/zmcontrol status是否能手动执行成功。若手动执行报错,多半是 zimbra 用户环境变量(如ZIMBRA_HOME)未加载,可改用su - zimbra -c方式并在 crontab 中显式设置 PATH 再试。 -
Agent 返回空值 / 监控项报「Unsupported item key」 先用
zabbix_agentd -t zimbra.mta.status在 Agent 本机自检。若返回空,说明 awk 模式没有匹配到行——可能是该服务在你这套 Zimbra 部署中未安装(输出中根本没有对应行),或zmcontrol输出的缩进/字段布局与模板假设不同(尤其注意webmail、webadm使用的$3)。此时先人工执行对应 awk 命令,观察实际输出再微调字段序号。 -
状态一直显示 1(告警误报) 按上述预处理逻辑,值为
1表示文本中不含Running。逐一检查/tmp/zmcontrol_status内容,确认服务确实处于 Running;若服务正常但值仍为 1,重点核对 UserParameter 中的文件名(/tmp/zmcontrol_status)与 awk 模式拼写。 -
模板导入报错 务必选择与 Zabbix Server 主版本匹配的导出文件(5.0 用 XML,5.4/6.0/7.0 用对应 YAML),避免跨大版本导入导致的兼容性问题。
-
扩展新服务 该模板的可扩展性很好:只需在 crontab 落盘文件存在的前提下,仿照现有条目为新增服务(如
ldap)添加 UserParameter、在模板中添加同 key item(value_type: TEXT+ REGEX 预处理 + 触发器),即可无缝纳入监控。
版本演进与维护信息
- 作者:5.0/5.4/6.0 版为 LeleKimi;7.0 版起为 LeleKimi、Anfossi Dennis。
- 演进方向:监控面从最初 9 个核心服务逐步扩展到 16~17 个(覆盖 logger、snmp、cbpolicyd、spell、opendkim、memcached、stats 等),说明该模板在社区中持续演进;5.4 与 6.0 的导出文件
date字段均为 2021-11-21,内容一致。 - 模板元数据:无宏、无模板链接、无发现规则,属于静态全量采集型模板;监控项统一 3 分钟更新、历史保留 180 天、文本值经 REGEX 预处理后驱动 DISASTER/HIGH 两级触发器。
如果你还需要更全面的 Zimbra 指标(如队列长度、磁盘用量、数据库连接等),可以结合仓库中同目录下的 template_zimbra_collaboration 模板使用,二者互为补充。