适用版本:Zabbix 7.4.x(已在 7.4.16 / MySQL 8.0.43 验证)。 一个自包含、多语言的 Zabbix 前端模块(custom module / plugin)。加载后会在 Administration → WeCom Center 增加一个定制页面,分 告警 / 优化 / 日常维护 三个标签页。
| 标签页 | 关键能力 |
|---|---|
| 告警 Alert | 企业微信群机器人 key 设置与测试;5 套告警策略预设(先预览 → 再应用);手动勾选会通知的严重度;一键刷新(写入模板触发器 / 触发器原型 / 已发现触发器,全部节点生效)。 |
| 优化 Optimization | 服务端调优参数生成(只生成 .env/compose 片段与重建命令,不落地,运维自行重建);真实华为模板 →「导入」→「切换」迁移设备;Geomap 单点标记。 |
| 日常维护 Maintenance | 按类别批量改告警等级;按单个触发器精确调整:勾选开关告警 + 行尾下拉改严重度;保存后页面自动刷新。 |
所有改动都走 Zabbix 官方 API / 受控 SQL 写进数据库,所以换机器、重建容器、升级镜像,配置都在——只要「加载插件」即可复用。
仓库自带的 docker-compose.yaml 已经把「插件随仓库走 + 自动启用」做好:
git clone <本仓库地址> zabbix-deploy
cd zabbix-deploy
# (可选)已有环境的模块目录在别处时,用环境变量覆盖,默认是仓库同级的 ./web-modules
# export WEB_MODULES_DIR=/opt/zabbix/zabbix-server/web-modules
docker compose up -d
启动后:
./web-modules/WecomCenter 被挂到容器 /usr/share/zabbix/modules/WecomCenter。wecom-module-init 会等 MySQL 就绪后,把 module 表里的 wecom_center 登记为 已启用(status=1)。脚本是幂等的:已存在就不动,重复 up 也安全。也就是说:全新环境
up -d完,什么都不用点,插件已经在了。
确认 web 容器挂载了持久化的 modules 目录(否则重建容器文件会丢):
zabbix-web-nginx-mysql:
volumes:
- /opt/zabbix/zabbix-server/web-modules:/usr/share/zabbix/modules
把 web-modules/WecomCenter 整个目录拷到宿主那台目录下(即 .../web-modules/WecomCenter/)。
cd web-modules && ./install.sh(自动探测运行中的 zabbix-* web 容器并复制进去;或 ./install.sh /usr/share/zabbix/modules)。docker compose up -d 重建 web 容器使挂载生效(只重启 web,数据不动)。
启用模块(写 module 表,status=1 为启用;moduleid 不是自增列,需显式给值):
SET @nid := (SELECT COALESCE(MAX(moduleid),0)+1 FROM module);
INSERT INTO module(moduleid,id,relative_path,status,config)
SELECT @nid,'wecom_center','modules/WecomCenter',1,'[]'
WHERE NOT EXISTS (SELECT 1 FROM module WHERE id='wecom_center');
也可以进 Administration → General → Modules → Scan directory → 启用 WecomCenter。
web-modules/)拉过去,按 2.1 或 2.2 重来即可;数据库卷保留则配置不丢。ubuntu-7.4.16),up -d 重建后插件仍在(文件在挂载目录、启用记录在 DB)。/opt/zabbix/zabbix-server/web-modules/WecomCenter/manifest.json 与 DB 的 module 行(id=wecom_center,status=1)。安装后第一次打开 WeCom Center → 告警 页,会显示 First-time setup / 首次配置:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=... 里 key= 后面那串)。| 对象 | 作用 |
|---|---|
全局宏 {$WECOM_KEY} |
存放机器人 key(换机器人只改这一格) |
媒体类型 WeCom Group Robot |
type=4 webhook,内置发送脚本(markdown,失败回退 text) |
机器人用户 wecomrobot |
挂上面这个媒体类型,severity = High + Disaster |
触发器动作 Send alarm by Wecom Robot |
告警发红字、恢复发绿字,均带 {$ZBX_URL} 直达详情链接 |
群机器人就是「往群里发一条消息」,没有收件人账号/接收目标的概念,所以这里不设真人接收者,只维护一个机器人账号承载媒介。
{$WECOM_KEY};点 发送测试 会直接打企微接口,返回 errcode:0 即通。severity 位掩码 / active)。StartSNMPPollers 等 .env/compose 参数与重建命令。只生成、不落地,由运维复制到主机自行 docker compose up -d 重建 server(零风险、零特权)。Huawei VRP by SNMP walk(导出文件在 templates/),点「导入」即导入 Zabbix(已存在则就地更新,新模板则新建)。A. 按类别批量改告警等级
other 不参与)。B. 按单个触发器精确调整
Temperature)→ 点 Search(最多显示 200 条;全库可能有数万个触发器)。trigger.status,0 启用 / 1 停用);所有调整只改
triggers.priority/triggers.status,不删除任何对象。对「已发现(LLD)触发器」因 Zabbix API 不允许改其 priority,改用受控 SQL 精确更新,可逆。
| 等级 | priority | 媒介位掩码 |
|---|---|---|
| 未分类 Not classified | 0 | 1 |
| 信息 Information | 1 | 2 |
| 警告 Warning | 2 | 4 |
| 一般严重 Average | 3 | 8 |
| 严重 High | 4 | 16 |
| 灾难 Disaster | 5 | 32 |
trigger.status(0 启用 / 1 停用)。media.active(0 启用 / 1 停用),严重度用位掩码。en_GB/en_US 共用英文),与 Zabbix 语言数量一致。zh_CN、zh_TW、ja_JP、ko_KR、ru_RU、de_DE、fr_FR、es_ES、pt_BR、it_IT、pl_PL、tr_TR。locale/en.php 为 locale/<lang>.php,只改 value、键名不变即可。Q:改完严重度,为什么告警没立刻变?
A:页面(读数据库)会立刻显示新值;Zabbix server 的「配置缓存」约 60 秒(CacheUpdateFrequency)刷新后才作用于告警判定。这是 Zabbix 机制,不是插件问题。
Q:地图是空白的? A:Geomap 底图依赖浏览器访问外网 OSM 瓦片;纯内网会空白,但标记点逻辑正确。
Q:会不会误伤生产触发器?
A:不会。所有操作都要你主动点 Apply / Save 才写库;「预览」不写库;改动仅限 priority / status,不删对象,且可用备份回滚。
Q:换机器人 key 要改哪里?
A:只改页面「机器人 key」一处(即全局宏 {$WECOM_KEY}),或 Administration → Macros。
Q:能在非 docker 的 Zabbix 上用吗?
A:可以。把 WecomCenter/ 放到 modules 目录、启用模块即可(见 2.2)。
Q:升级 Zabbix 会丢插件吗? A:不会。插件文件在宿主持久化目录、启用记录在数据库;只要目录与数据库卷保留,升级镜像后仍在。
zabbix-deploy/
├── docker-compose.yaml # 带插件:挂载 ./web-modules + wecom-module-init 自动启用
├── web-modules/
│ ├── install.sh # 一步搬运脚本(docker 自动探测 / 指定目录)
│ ├── README.md # 开发者向说明
│ └── WecomCenter/ # 插件本体
│ ├── manifest.json # v2.0,注册 2 个 action
│ ├── Module.php # 入口:注册视图、i18n、注入左侧菜单
│ ├── actions/ # View(GET) / Save(POST) 控制器
│ ├── views/ # 页面模板
│ ├── lib/ # I18n.php / Helper.php(业务逻辑)
│ ├── locale/ # 35 个语言文件
│ ├── templates/ # 内置真实华为模板
│ └── assets/ # wecom.center.css
└── docs/使用说明.md # 本文档
动手批量改前,建议先导出相关对象做备份(媒介类型、动作、全局宏、触发器 priority 快照)。示例(API 导出):
# 用 API token 导出媒介/动作/宏,保存为 JSON,需要时用对应 API 还原
页面「预览」永远是 dry-run,先看影响面再应用,是最稳的做法。
http://192.168.87.20:8080/zabbix.php?action=l2.topology.view#F39C12,1G = 绿色 #2ECC71,10G = 蓝色 #3498DB,
20G+ = 紫色 #9B59B6,未知 = 红色 #E74C3C,中断 = 红色虚线 #C0392B。COBCO 大框,内部按配置规则的「车间/DataCenter/Core」子框;
规则按顺序匹配(contains / regex),可用 $1..$9 反向引用;未命中归入 Other。车间 · 区域 · 楼层机柜U + 角色 · IP 两行,宽度加大、对比度提高,便于快速找设备
(原名鼠标悬停显示;双击节点跳转该主机的问题页)。实时 或历史某分钟快照(保存 7 天,5 分钟一个点)。assets/l2topology/snapshot.json(展示页实时读取)。l2_topology_history
(字段 ts、captured_at、stats、snapshot),并自动清理超过 history_days(默认7) 天的旧数据。l2_topology_config(单行 id=1),并镜像到 assets/l2topology/config.json 供采集脚本读取。L2Store::ensureSchema() 在页面加载时自动 CREATE TABLE IF NOT EXISTS;
docker-compose.yaml 的 wecom-module-init 一次性容器也会在 up 时建表,全新环境零手工。采集器代码位于仓库 collector/,安装到 /opt/zabbix/l2collector/:
stp_collect.py # STP 指定桥 + MAC 学习 -> 交换机级联关系
fdb_collect.py # ARP + BRIDGE-MIB FDB + ifName -> 终端/链路
fdb_analyze3.py # 归并出链路与终端清单
port_status.py # IF-MIB 端口 up/down/速率/每口 MAC 数
latency_collect.py # 并发 ping 交换机管理 IP -> /tmp/latency.tsv
l2_snapshot.py # 合成 snapshot.json + 写历史库(仅全量时)
l2cfg.py # 读取 config.json,按模板过滤要采集的主机
run_full.sh # 全量:stp->fdb->analyze->port->latency->snapshot(写历史)
refresh_alarms.sh # 仅刷新告警(每分钟,不写历史)
Huawei VRP by SNMP (walk),id 10962)的主机,避免误采其它设备。安装(一次性,幂等):
cd /opt/zabbix/l2collector && chmod +x run_full.sh refresh_alarms.sh
{ crontab -l 2>/dev/null | grep -v l2collector || true
echo '*/5 * * * * /bin/bash /opt/zabbix/l2collector/run_full.sh >/dev/null 2>&1'
echo '* * * * * /bin/bash /opt/zabbix/l2collector/refresh_alarms.sh >/dev/null 2>&1'
} | crontab -
手动跑一次全量:bash /opt/zabbix/l2collector/run_full.sh,日志 /var/log/l2collector.log。
docker-compose.yaml 已把 web-modules/ 挂进 zabbix-web 容器,
并由 wecom-module-init 一次性容器自动登记(启用)模块、创建 L2 两张表。
全新机器 docker compose up -d 后插件即已启用,无需手工去「Administration → Modules」点启用。web-modules 目录不在 compose 同级,用 .env 的 WEB_MODULES_DIR 指向绝对路径。assets/l2topology/snapshot.json 存在(跑一次 run_full.sh)。l2_topology_history 行数在增长。config.json 会同步;采集侧下个周期生效。