更新时间:2026-11-06 适用:Zabbix 7.4.x(已在 7.4.16 + MySQL 8.0.43 验证) 模块目录:
web-modules/WecomCenter(manifest2.0.1)
一个不修改 Zabbix 源码、以 custom module 方式挂载的运维定制中心:把企业微信告警、模板调优、日常告警等级维护,以及 L2 物理拓扑集中在一个页面里。所有配置写 Zabbix 数据库,重建容器/升级镜像后仍在。
{$WECOM_KEY} 宏;已存在则复用。.env / compose 片段,不落地)。Huawei VRP by SNMP walk,并按旧模板→新模板批量切换设备(保留其它模板链接)。ifAlias 猜关系。防火墙 → 行为管理 → 总核心 → 分核心(监控核心/办公核心/未来生产核心);角色留空则完全不显示、不占位;空的未来生产核心保留一行但不激活。full_interval_min(默认 5 分钟)gzip 写 l2_topology_history,按 history_days(默认 7 天)清理;refresh_alarms.sh 只刷新实时 JSON,不写历史。cy.png() 导出)。| 需求 | 状态 | 落点 |
|---|---|---|
| 增加 L2 物理拓扑,只读展示 | 完成 | actions/L2TopologyView.php、views/topology.view.php、assets/l2topology/ |
| 7 天历史、按天/时间回看 | 完成 | l2_topology_history、L2Store、app.js |
| 配置页命名 ROMAN 定制中心 / ROMAN Custom Center | 完成 | 菜单、page.title、locale |
| 拓扑层级:总核心/分核心/防火墙/行为管理 | 完成 | L2Store::defaults() 的 core_hierarchy、配置页 |
| 留空角色不显示、不占空间 | 完成 | 拓扑布局按实际匹配节点生成 |
| 时间选择器:选日期后时间不能灰 | 完成 | 单面板 popover,日期与时间联动 |
| 不要两个选择框,要美观 | 完成 | .l2-ts-picker 单按钮 + 单面板 |
| 图例进 PNG 导出 | 完成 | app.js 导出逻辑追加 canvas 图例 |
| 移除“鼠标移到交换机上…”提示 | 完成 | 已删除 |
| 告警块上移 | 完成 | 布局调整 |
| 不破坏 Zabbix、不创建用户、协议真相只来自 STP/MAC | 遵守 | L2 无写交换机、无新用户;关系仅 STP/MAC |
| 检查 git 是否上传、新 Zabbix 能否安装、compose 是否默认有功能、拓扑是否有初始化 | 完成/已修 | 见第 5、6 节 |
l2_topology_config:单行 id=1,config LONGTEXT,updated DATETIME。l2_topology_history:ts、captured_at、stats、gzip snapshot MEDIUMBLOB。\DBselect() + \DBfetch(),写入/DDL 用 \DBexecute();不能用 DB::select()(它不是裸 SQL,且会查 Zabbix schema 缓存)。L2Store::ensureSchema() 在页面加载时幂等建表;L2Store::initialize() 额外在配置行缺失时写入默认配置(绝不覆盖已有配置)。/opt/zabbix/l2collector/,cron:
*/5 * * * * /bin/bash /opt/zabbix/l2collector/run_full.sh* * * * * /bin/bash /opt/zabbix/l2collector/refresh_alarms.shl2_due.py 按 full_interval_min 控制全量采集频率;L2_FORCE_FULL=1 可强制一次。snapshot.json 和一份历史;历史行实测约 33–36 KB gzip,7 天 @5 分钟约 65–75 MB。仓库 docker-compose.yaml 已包含:
web-modules/ 挂载到 /usr/share/zabbix/modules;wecom-module-init 一次性侧车:等待 MySQL 和 Zabbix module 表就绪(最多 300 秒)→ 幂等登记 wecom_center(status=1)→ 创建 L2 两张表。docker compose up -d 后模块已启用,无需手工点启用;打开页面后默认配置自动生效。cd web-modules
./install.sh # 自动探测 web/mysql 容器
# 或:./install.sh /opt/zabbix/zabbix-server/web-modules
install.sh 会复制模块、设置权限、建 L2 表、在 module 表已就绪时自动登记/启用模块、把 collector 安装到 /opt/zabbix/l2collector 并安装 cron(INSTALL_CRON=0 可跳过)。若 MySQL/module 表尚未就绪,会提示到 UI 启用。
L2Store::initialize()(拓扑表/配置)。docs/使用说明.md 10.4 在宿主机安装;这是“页面初始化”不会替用户做的部分。L2Store.php、WecomCenterSave.php、topology.view.php、wecom.center.view.php、locale/en.php、locale/zh_CN.php 全部通过。◷ 实时(最新) ▾、❚❚、+、− 均正常显示,没有 鈼? / 鉂氣潥 / 锛? 乱码;topology.view.php 的图标已改用 HTML 数字实体,install.sh 已增加 mojibake 源文件阻断检查。["实时(最新)","2026-11-06 (15)","2026-11-05 (60)"];2026-11-06 · 选择时间,时间列表 15 项;01:42:01 后 URL 带 ts=...,label 正确显示;pageerror / console.error 为空。docker compose config -q:仓库 compose 与生产 /opt/zabbix/docker-compose.yaml 均通过。[wecom-init] waiting for MySQL... → waiting for Zabbix schema (module table)... → module 'wecom_center' ensured (enabled) + L2 tables ensured.install.sh 在临时目录实测:复制模块、建表、幂等登记模块、安装 collector 均成功。wecom_center moduleid=1001,status=1;l2_topology_history 行数持续增长;l2_topology_config 行存在。snmpwalk 等工具;容器默认不跑采集器。full_interval_min 缩短迅速增长;1 分钟 @7 天约 300 MB 级,默认 5 分钟更稳妥。/opt/zabbix/docker-compose.yaml 已加入侧车并留备份 docker-compose.yaml.bak_wecom-init_*;下次 docker compose up -d 会自动保持模块启用。wecomrobot 用户(原有行为);L2 单独初始化不会创建任何用户。masterorigin/masterweb-modules/WecomCenter/{actions,lib,views,locale,assets/l2topology}、web-modules/install.sh、docker-compose.yaml、README.md、docs/使用说明.mdgit log --oneline;关键提交:
ce6d849:L2 初始化、单面板时间选择器、compose 首装时序修复、安装器自动启用模块;26a9dbe:修复拓扑工具栏 mojibake,install.sh 增加编码守卫,模块版本升至 2.0.1;60aad88:文档统一为 ROMAN 定制中心与四标签页。