Zabbix Community Templates 实战:用 Zimbra「zmcontrol status」模板监控邮件服务器核心服务状态

原创2026-10-15 09:42:071,709 阅读

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 监控项

整套方案由三段链路组成,缺一不可:

  1. 定时落盘:Zimbra 服务器 root crontab 每 3 分钟执行一次 zmcontrol status,把结果写入 /tmp/zmcontrol_status;
  2. 本地解析:Zabbix Agent 通过 UserParameter 调用 awk,从该文件中按服务名匹配出状态字段(Running / Stopped)并返回;
  3. 入库告警: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 模式与服务实际输出不匹配(详见下文「故障排查」)。

第三步:导入模板并绑定主机

  1. 下载与 Zabbix Server 版本对应的导出文件(见上表);
  2. 在 Zabbix Web 界面中进入 Configuration → Templates → Import,选择文件导入;
  3. 导入后可在模板列表中看到 Zimbra,它归属于 Templates 模板组;
  4. 在主机配置中把 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。

故障排查与常见问题

  1. /tmp/zmcontrol_status 文件不存在或内容为空 检查 root crontab 是否生效、sudo -u zimbra /opt/zimbra/bin/zmcontrol status 是否能手动执行成功。若手动执行报错,多半是 zimbra 用户环境变量(如 ZIMBRA_HOME)未加载,可改用 su - zimbra -c 方式并在 crontab 中显式设置 PATH 再试。

  2. Agent 返回空值 / 监控项报「Unsupported item key」 先用 zabbix_agentd -t zimbra.mta.status 在 Agent 本机自检。若返回空,说明 awk 模式没有匹配到行——可能是该服务在你这套 Zimbra 部署中未安装(输出中根本没有对应行),或 zmcontrol 输出的缩进/字段布局与模板假设不同(尤其注意 webmail、webadm 使用的 $3)。此时先人工执行对应 awk 命令,观察实际输出再微调字段序号。

  3. 状态一直显示 1(告警误报) 按上述预处理逻辑,值为 1 表示文本中不含 Running。逐一检查 /tmp/zmcontrol_status 内容,确认服务确实处于 Running;若服务正常但值仍为 1,重点核对 UserParameter 中的文件名(/tmp/zmcontrol_status)与 awk 模式拼写。

  4. 模板导入报错 务必选择与 Zabbix Server 主版本匹配的导出文件(5.0 用 XML,5.4/6.0/7.0 用对应 YAML),避免跨大版本导入导致的兼容性问题。

  5. 扩展新服务 该模板的可扩展性很好:只需在 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 模板使用,二者互为补充。

登录后查看全文
community-templates