Zabbix 监控 Zimbra 服务状态:基于 zmcontrol status 输出与 UserParameter 的模板部署指南
Zabbix 监控 Zimbra 服务状态:基于 zmcontrol status 输出与 UserParameter 的模板部署指南
导读
Zimbra 邮件系统由 mailbox、MTA、antispam、antivirus、proxy、logger 等多个独立组件构成,任何一个组件异常都可能导致邮件收发中断或管理功能失效。Zabbix 官方社区模板仓库 community-templates 中提供了名为 Zimbra(template_zimbra_zmcontrol_status)的模板,它借助定时快照 zmcontrol status 输出 + Zabbix Agent 自定义 UserParameter 的方式,每 3 分钟巡检一次 Zimbra 服务器全部核心组件的运行状态,并在关键服务(Mailbox、MTA、Webmail 等)停止时触发 DISASTER 级告警。阅读本文后,你将掌握该模板的完整部署步骤(root crontab + UserParameter + 模板导入)、17 条监控键的 awk 解析原理、16 个监控项与触发器的对应关系,以及基于模板 YAML 源码理解其数据预处理与告警优先级设计。
模板核心能力:监控 Zimbra 各组件运行状态
该模板的定位非常聚焦:监控 Zimbra 服务器上 zmcontrol status 输出中的若干关键参数,即各组件进程的 Running / Stopped 状态。与 Zabbix 社区仓库中的其他 Zimbra 模板(如 template_zimbra_collaboration)不同,本模板不采集性能计数器,只做"服务存活"层面的监控,因此部署成本极低——不需要安装额外脚本或开放端口,只依赖:
- Zimbra 服务器上的一条 root crontab(每 3 分钟把状态写入 /tmp 文件);
- Zabbix Agent 的 17 条 UserParameter(用 awk 从快照文件提取各组件状态);
- 一个官方 Zabbix 模板(定义监控项、数据预处理与告警触发器)。
从模板 YAML 的 tags 字段可以看到,所有监控项都带有 Application: Zimbra 标签(见 template_zimbra_zmcontrol_status.yaml),便于在 Zabbix 的标签过滤、权限控制与仪表盘中统一归类。
工作原理:zmcontrol status 输出与 awk 解析
zmcontrol status 是 Zimbra 自带的命令行工具,以 zimbra 用户执行后会输出类似下面这种逐行文本(实际行数取决于 Zimbra 版本与已安装组件):
antispam Running
antivirus Running
mailbox Running
memcached Running
mta Running
opendkim Running
proxy Running
service webapp Running
snmp Running
spell Running
stats Running
zimbraAdmin webapp Running
zmconfigd Running
模板中的每条 UserParameter 本质都是一个 awk 单行命令,其通用格式为:
awk '/<组件关键字>/{print $N}' /tmp/zmcontrol_status
其中:
/关键字/:对每一行做正则匹配,命中包含该关键字的行才处理;$N:打印该行第 N 个字段(默认以空白字符为分隔符);/tmp/zmcontrol_status:由 crontab 定时生成的快照文件。
由此可以推断出两条解析规则(与模板源码一一对应):
- 两字段行(如
antispam Running):关键字在第 1 列,状态在第 2 列,用{print $2}提取; - 三字段行(如
service webapp Running、zimbraAdmin webapp Running):服务名由两个词组成,状态在第 3 列,因此 webmail 与 admin console 两条监控键使用{print $3}。
部署步骤一:通过 root crontab 周期性生成状态快照
模板要求先在 Zimbra 服务器上准备快照源。将下面这一行加入 root 用户的 crontab(README 原文见 7.0/README.md):
*/3 * * * * sudo -u zimbra /opt/zimbra/bin/zmcontrol status > /tmp/zmcontrol_status
该命令的含义与要点:
| 片段 | 说明 |
|---|---|
*/3 * * * * |
每 3 分钟执行一次,与模板监控项的更新间隔(delay: 3m)保持一致 |
sudo -u zimbra |
以 zimbra 用户身份运行(zmcontrol 需要 zimbra 用户权限),因此 crontab 必须挂在 root 下才能 sudo |
/opt/zimbra/bin/zmcontrol status |
Zimbra 状态查询命令的默认安装路径,如为自定义安装路径请相应调整 |
> /tmp/zmcontrol_status |
每次覆盖写入快照文件,保证 Agent 读取到的是最新状态 |
两点注意事项:
- 快照文件由 root 的 shell 重定向创建,属主通常是 root;请确认
zabbix用户对/tmp/zmcontrol_status有读权限(可chmod 644或调整 umask),否则 Agent 取不到值; - 若 Zimbra 服务器配置了
Defaults requiretty等 sudo 限制,需要为sudo -u zimbra放开无 TTY 执行限制,否则定时任务会静默失败。
部署步骤二:为 Zabbix Agent 定义 UserParameter
将以下 17 条 UserParameter 追加到 Zabbix Agent 主配置 zabbix_agentd.conf,或放入 conf.d 目录下的独立文件(例如 /etc/zabbix/zabbix_agentd.conf.d/zimbra_template.conf,此示例路径来自模板 YAML 的 description 字段)。修改后需重启 Zabbix Agent 使其生效。
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
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
各监控键对应的组件说明如下:
| 监控键(key) | 匹配关键字 | 提取字段 | 对应 Zimbra 组件 |
|---|---|---|---|
| zimbra.amavis.status | amavis | 第 2 列 | 邮件内容过滤引擎 Amavis |
| zimbra.antispam.status | antispam | 第 2 列 | 反垃圾邮件模块 |
| zimbra.antivirus.status | antivirus | 第 2 列 | 反病毒模块 |
| zimbra.mailbox.status | mailbox | 第 2 列 | 核心 Mailbox 存储/应用服务 |
| zimbra.mta.status | mta | 第 2 列 | 邮件传输代理(Postfix) |
| zimbra.zmconfigd.status | zmconfigd | 第 2 列 | 配置守护进程 |
| zimbra.webmail.status | service webapp | 第 3 列 | Webmail 前端服务 |
| zimbra.webadm.status | zimbraAdmin | 第 3 列 | 管理后台(Admin Console) |
| zimbra.proxy.status | proxy | 第 2 列 | 反向代理/负载均衡 |
| zimbra.logger.status | logger | 第 2 列 | 日志服务 |
| zimbra.snmp.status | snmp | 第 2 列 | SNMP 服务 |
| zimbra.cbpolicyd.status | cbpolicyd | 第 2 列 | 策略守护进程 |
| zimbra.spell.status | spell | 第 2 列 | 拼写检查服务 |
| zimbra.opendkim.status | opendkim | 第 2 列 | DKIM 签名服务 |
| zimbra.apache.status | apache | 第 2 列 | Apache 服务 |
| zimbra.memcached.status | memcached | 第 2 列 | 缓存服务 |
| zimbra.stats.status | stats | 第 2 列 | 统计采集服务 |
值得注意:
zimbra.apache.status这条 UserParameter 在 README 与 YAML 描述中都有定义,但模板的监控项清单中并未包含对应的 apache 监控项(README 的 Items collected 表中同样没有)。如果你需要监控 Apache 组件,可以在导入模板后手动补充一个使用该 key 的监控项。
部署完成后,推荐用 zabbix_get(在 Zabbix Server 或 Proxy 上)验证 Agent 端是否能正确返回:
zabbix_get -s <zimbra服务器IP> -k zimbra.mailbox.status
# 预期输出: Running
部署步骤三:导入模板并关联主机
仓库在 Applications/Mail_servers/template_zimbra_zmcontrol_status/ 下按 Zabbix 版本分目录维护了多个版本:
| 目录 | 文件格式 | 适用 Zabbix 版本 |
|---|---|---|
| 5.0 | template_zimbra_zmcontrol_status.xml | Zabbix 5.0 |
| 5.4 | template_zimbra_zmcontrol_status.yaml | Zabbix 5.4 |
| 6.0 | template_zimbra_zmcontrol_status.yaml | Zabbix 6.0 |
| 7.0 | template_zimbra_zmcontrol_status.yaml | Zabbix 7.0 |
请选择与你的 Zabbix Server 大版本匹配的文件下载导入:
- 打开 Zabbix Web 界面,进入 Data collection → Templates → Import(不同版本菜单位置略有差异,也可能在 Configuration → Templates → Import);
- 选择对应版本的 YAML/XML 文件,勾选 Update existing(如重复导入)并点击 Import;
- 导入成功后,在主机配置中把名为
Zimbra的模板链接到目标 Zimbra 服务器主机上。
模板名为 Zimbra,所属模板组为 Templates(见 7.0 模板 YAML 中的 template_groups 与 groups 字段)。模板不依赖任何宏、不链接其他模板、不包含发现规则(Discovery rules),属于零依赖的独立模板,直接导入即可使用。
模板内部结构解析:监控项、数据预处理与触发器
在 README 的 Items collected 表格之外,模板 YAML 还携带了 README 未展开的实现细节。以 7.0/template_zimbra_zmcontrol_status.yaml 为例,每个监控项的完整定义包含:
- uuid: e57decaaef38485a896e341d52321d1e
name: 'Status Amavis Zimbra'
key: zimbra.amavis.status
delay: 3m
history: 180d
value_type: TEXT
trends: '0'
preprocessing:
- type: REGEX
parameters:
- Running
- '0'
error_handler: CUSTOM_VALUE
error_handler_params: '1'
tags:
- tag: Application
value: Zimbra
triggers:
- uuid: 1dd027eb616f42c88ce480cc65c6c1a9
expression: last(/Zimbra/zimbra.amavis.status)<>0
name: 'Service Amavis Stopped'
priority: HIGH
各字段含义:
- delay: 3m:每 3 分钟采集一次,与 crontab 快照频率一致;
- history: 180d:保留 180 天历史数据;
- value_type: TEXT / trends: '0':监控值为文本类型(Running/Stopped),且不存储趋势数据(TEXT 类型无法做数值趋势聚合);
- preprocessing(REGEX 预处理):这是模板的"状态数字化"关键设计。REGEX 预处理将命中
Running的文本替换为0;当文本不匹配Running(即组件处于 Stopped 或其他异常状态)时,触发error_handler: CUSTOM_VALUE,将值替换为1。于是 Agent 原始返回的文本被统一映射为数值:0 = 正常运行,1 = 异常停止; - tags:统一打上
Application: Zimbra标签; - triggers:每个监控项绑定一条触发器,表达式
last(/Zimbra/<key>)<>0表示"最近一次值不为 0"即触发告警——由于预处理已将状态数字化,触发器无需处理文本,逻辑非常简洁。
监控项与触发器完整清单
模板共包含 16 个监控项,全部为 Zabbix agent 类型、更新间隔 3m,对应 16 条触发器。以下清单合并自 README 的 Items collected 表与 7.0 YAML 源码:
| 监控项名称 | key | 触发器名称 | 触发器优先级 |
|---|---|---|---|
| Status Zmconfigd Zimbra | zimbra.zmconfigd.status | Service Zmconfigd Stopped | HIGH |
| Status MTA Zimbra | zimbra.mta.status | Service MTA Stopped | DISASTER |
| Status Proxy Zimbra | zimbra.proxy.status | Service Proxy Stopped | DISASTER |
| Status Antivírus Zimbra | zimbra.antivirus.status | Service Antivírus Stopped | HIGH |
| Status Amavis Zimbra | zimbra.amavis.status | Service Amavis Stopped | HIGH |
| Status Admin Console Zimbra | zimbra.webadm.status | Service Admin Console Stopped | HIGH |
| Status Webmail Zimbra Service | zimbra.webmail.status | Service Webmail Stopped | DISASTER |
| Status Mailbox Zimbra | zimbra.mailbox.status | Service Mailbox Stopped | DISASTER |
| Status AntiSpam Zimbra | zimbra.antispam.status | Service AntiSpam Stopped | HIGH |
| Status Memcached Zimbra | zimbra.memcached.status | Service Memcached Stopped | DISASTER |
| Status Logger Zimbra | zimbra.logger.status | Service Logger Stopped | HIGH |
| Status SNMP Zimbra | zimbra.snmp.status | Service SNMP Stopped | HIGH |
| Status OpenDKIM Zimbra | zimbra.opendkim.status | Service OpenDKIM Stopped | DISASTER |
| Status CBPolicyD Zimbra | zimbra.cbpolicyd.status | Service CBPolicyD Stopped | HIGH |
| Status Stats Zimbra | zimbra.stats.status | Service Stats Stopped | HIGH |
| Status Spell Zimbra | zimbra.spell.status | Service Spell Stopped | HIGH |
告警优先级设计逻辑
从 YAML 源码(7.0/template_zimbra_zmcontrol_status.yaml)可以看出模板作者对优先级做了业务影响分级:
- DISASTER(灾难级,6 条):
mailbox(核心邮箱存储,停止即邮件服务整体不可用)、mta(邮件收发的咽喉,停止则收发中断)、webmail(用户 Web 入口)、proxy(前端代理,多组件依赖其路由)、memcached(缓存,停止会拖垮 mailbox 性能甚至影响可用性)、opendkim(DKIM 签名,停止会导致对外邮件验签失败、信誉受损); - HIGH(高,10 条):
zmconfigd、antivirus、amavis、webadm(管理后台)、antispam、logger、snmp、cbpolicyd、spell、stats——这些组件异常通常不会立即阻断核心收发,但会影响安全防护、管理运维与数据统计。
这套分级逻辑可直接复用,也可以按你的业务重要度在导入后调整。
注意事项与故障排查
- Agent 读取权限:快照文件
/tmp/zmcontrol_status由 root crontab 创建,务必保证 Zabbix Agent(通常以zabbix用户运行)可读;否则所有监控键都会返回 "Cannot read file",触发误告警。 - 组件缺失导致的误报:某些 Zimbra 版本或精简安装可能不包含
cbpolicyd、opendkim、spell等组件,对应行不存在时 awk 无输出,预处理会因正则不匹配走 CUSTOM_VALUE 分支得到1,从而触发"服务停止"告警。若你的环境未启用这些组件,应在导入模板后禁用对应监控项或触发器。 - 模板已定义的 apache 参数无对应监控项:
zimbra.apache.status在部署文档中给出,但模板监控项表中没有 apache 项,需要自行补充(见上文表格说明)。 - 文本型数据的限制:所有监控值均为 TEXT 类型且关闭 trends,Zabbix 无法对其做数值型趋势图/基线分析,本模板定位就是"状态开关"而非性能监控。
- sudo 配置:crontab 中
sudo -u zimbra依赖 root 的 sudo 权限,注意requiretty、NOPASSWD 等配置;也可以改用su - zimbra -c '...'或直接以 zimbra 用户挂 crontab(但输出重定向路径与权限需相应调整)。 - /tmp 文件生命周期:/tmp 在部分发行版上由 systemd-tmpfiles 定期清理,若文件被删除且 crontab 尚未到点重建,会出现短暂取数失败;如需更稳妥,可将输出路径改为
/var/tmp/zmcontrol_status并同步修改所有 UserParameter 的路径。
仓库中的相关文件
本文内容对应的仓库文件(均可直接查阅):
- 关联文档:7.0/README.md(含部署步骤与监控项清单,也是本模板的用户手册)
- 7.0 模板定义:7.0/template_zimbra_zmcontrol_status.yaml
- 其他版本:5.0/README.md(XML 格式)、5.4 目录、6.0/README.md(早期 YAML 版本,仅含 9 个监控项,7.0 版扩展至 16 项)
- 相关模板:template_zimbra_collaboration(Zimbra 协作套件的其他监控维度)
整体来看,template_zimbra_zmcontrol_status 是一个"轻量、零依赖、聚焦服务存活"的典型 Zabbix 社区模板:用一条 crontab 加 17 条 UserParameter 打通数据采集,用 REGEX 预处理把文本状态数字化,再用分级触发器实现差异化告警。对于已有 Zabbix 环境的 Zimbra 运维团队,这是一套开箱即用、可快速落地的基础监控方案。