简介:这份资源面向使用 Proxmox VE 做虚拟化管理的运维人员,提供用 Zabbix 监控 Proxmox 环境的配套脚本与模板,适合已具备一定 Linux 与监控基础、希望把节点、虚拟机与容器纳入统一监控体系的中级读者。压缩包共 5 个文件,约 12KB,包含 Perl 采集脚本、Zabbix 模板 XML、代理配置文件、说明文档与许可证,分别承担数据采集、监控项定义、代理参数配置和使用指引等职责,结构精简、职责清晰。目前已有 1280 人学习下载,可作为搭建监控链路的参考起点。读者可据此了解如何通过 Proxmox API 获取节点状态、虚拟机与容器运行状况、存储使用等指标,并将采集结果接入 Zabbix 模板,配合触发器与图形展示形成可视化视图,为故障排查与性能优化提供数据支撑。
1. 从一次监控盲区说起:zabbix-proxmox 到底装的是什么
去年帮某公司迁移一批虚拟化节点,Proxmox VE 集群跑得好好的,Zabbix 那边却始终只有宿主机的基础指标,虚拟机层面的状态、存储池用量、集群仲裁情况一概看不见。当时第一反应是去 Zabbix 官方模板库里翻,翻到的东西要么只覆盖半套 API,要么依赖一堆额外脚本,装完还得自己拼。后来才把目光落到 zabbix-proxmox 这个专门做 Proxmox 监控对接的项目上——它本质上是一组用 Perl 写的采集脚本加配套的 Zabbix 模板,通过 Proxmox 的 API 把节点、虚拟机、存储、集群这几层的数据拉进 Zabbix。
这类环境在中小规模的虚拟化运维里非常常见:Proxmox 便宜好用,Zabbix 又是老牌监控,两边都想用,中间缺的就是一层稳定的采集桥。装不好的典型后果不是报错,而是“看起来装上了”——主机有了、触发器没数据、图表空白,等到真出问题才发现监控是哑的。这篇笔记面向的是已经有一台能跑的 Zabbix Server、手上管着至少一个 Proxmox 节点、准备把两边接起来的开发者,从版本选择一路写到验证跑通。
2. 装前把环境列清:Perl 依赖与 Zabbix 版本怎么选
动手之前先把版本和依赖钉死,这一步省下来的时间远比后面排错多。zabbix-proxmox 的采集端是 Perl 脚本,所以 Perl 运行环境和几个核心模块是硬门槛;Zabbix 侧则涉及模板导入的兼容性,版本差一个大版本,模板里的 item 类型和预处理规则就可能对不上。
2.1 Perl 运行环境与必备模块
采集脚本跑在能访问 Proxmox API 的那台机器上,可以是 Zabbix Server 本机,也可以是一台独立的采集节点。我一般倾向后者,理由后面排错章节会讲。Perl 版本不用追新,系统自带的 5.26 及以上就够,重点是模块齐全。常见做法是先确认系统 Perl,再补装缺失模块:
# 确认 Perl 版本,5.26 以上即可 perl -v # 检查采集脚本依赖的核心模块是否齐全 perl -MJSON -e 'print "JSON ok\n"' perl -MLWP::UserAgent -e 'print "LWP ok\n"' perl -MURI::Escape -e 'print "URI ok\n"' perl -MData::Dumper -e 'print "Dumper ok\n"'这几行是自检,不是安装。JSON 负责解析 Proxmox API 返回的 JSON,LWP::UserAgent 负责发 HTTPS 请求,URI::Escape 处理 URL 里的特殊字符,Data::Dumper 在调试阶段打印结构用。哪个模块报Can't locate ... in @INC,就按发行版补:Debian/Ubuntu 系用apt install libjson-perl libwww-perl liburi-escape-perl,RHEL 系用yum install perl-JSON perl-libwww-perl perl-URI。注意模块名和包名不是一一对应,装之前用apt search或yum provides对一下,别凭记忆写包名。
提示:如果采集节点和 Zabbix Server 不是同一台,Perl 模块只需装在采集节点上,Zabbix Server 侧不需要。
2.2 Zabbix 版本与模板兼容性对照
模板导入的坑集中在版本上。Zabbix 6.0 之后 item 的预处理、值映射、低级别自动发现规则都有调整,老模板直接导进新版本,轻则部分 item 变灰,重则导入报 XML 结构错误。我一般按下面这张表先对一遍再动手:
| Zabbix 版本 | 模板可用性 | 注意事项 |
|---|---|---|
| 5.0 LTS | 基本可用 | 低级别发现规则字段较老,导入后需手动核对 |
| 6.0 LTS | 推荐 | 预处理规则完整,item 类型匹配良好 |
| 6.4 / 7.0 | 需核对 | 部分值映射和触发器表达式语法有变化,导入后逐条验证 |
选版本的原则很简单:Zabbix Server 是什么大版本,就优先用同代模板;跨代使用不是不行,但导入后必须把每个 item 的“预处理”和“触发器”页签点开看一遍,确认没有空表达式。这一步看着繁琐,实际比事后查“为什么图表没数据”快得多。
2.3 网络与权限的前置确认
采集脚本要访问 Proxmox 的 8006 端口 API,所以采集节点到 Proxmox 节点的 8006 必须通,且 Proxmox 侧要有一个专用 API 账号。常见做法是建一个只读角色加 API Token,而不是直接用 root 密码:
# 在 Proxmox 节点上创建只读监控账号与 API Token(示例) pveum user add monitor@pve --comment "zabbix readonly" pveum acl modify / --users monitor@pve --roles PVEAuditor pveum user token add monitor@pve zabbix --privsep 1PVEAuditor是内置只读角色,够采集用;--privsep 1表示 Token 权限与用户分离,更安全。Token 生成后只显示一次,记下来。这一步做完,采集脚本才有东西可拉,否则后面所有配置都是空转。
3. 落地安装:脚本部署、模板导入与主机配置
环境确认完,进入真正的安装环节。这一章分三块:采集脚本放哪、模板怎么导、Zabbix 主机和宏怎么配。三块顺序不能乱,脚本没放好就导模板,主机加进去也是红的。
3.1 采集脚本的部署位置与目录结构
脚本不要随手丢在/tmp或家目录,Zabbix 的 External Check 或 UserParameter 调用时路径写死,挪一次就得改一次配置。我一般统一放到/usr/local/bin/zabbix-proxmox/下,权限给 755,属主 root:
# 创建统一目录并放置采集脚本 mkdir -p /usr/local/bin/zabbix-proxmox cp proxmox_*.pl /usr/local/bin/zabbix-proxmox/ chmod 755 /usr/local/bin/zabbix-proxmox/*.pl chown root:root /usr/local/bin/zabbix-proxmox/*.pl # 手动跑一次,确认脚本本身能执行 /usr/local/bin/zabbix-proxmox/proxmox_node.pl --help--help能正常输出说明 Perl 解释器和模块链路是通的。如果这里就报模块缺失,回到 2.1 补模块,别往下走。脚本参数一般包括 API 地址、Token、节点名,具体以脚本自带的 usage 为准,不同分支参数名可能有差异,跑一次--help比猜靠谱。
3.2 模板导入与主机挂载
模板通过 Zabbix 前端导入:Data collection → Templates → Import,选 XML 文件。导入时注意勾选“更新已有模板”只在升级场景用,首次导入不要勾,避免覆盖同名模板。导入成功后,在 Hosts 里新建或编辑目标主机,把模板链上去。
主机配置里最关键的是宏。API 地址、Token、节点名这些不该写死在脚本里,用主机宏传进去,换节点只改宏不改脚本:
{$PROXMOX.URL} = https://10.0.0.10:8006 {$PROXMOX.TOKEN} = monitor@pve!zabbix=xxxxxxxx-xxxx-xxxx {$PROXMOX.NODE} = pve-node-01宏名以模板里实际定义的为准,上面是常见命名。Token 那串格式是用户@域!Token名=密钥,少一段都认证不过。宏配完,先别急着等数据,手动触发一次 item 的“Test”,看返回值是不是 JSON 结构,这一步能提前暴露大半认证和网络问题。
3.3 External Check 与 UserParameter 的取舍
采集方式有两种:External Check 由 Zabbix Server 直接调脚本,UserParameter 由 Zabbix Agent 调。前者配置简单但压力集中在 Server,后者分散压力但要保证 Agent 和脚本在同一台机器。我一般选 External Check 配独立采集节点,理由是可隔离、可单独扩容。
# Zabbix Server 侧确认 ExternalScripts 目录配置 grep -i ExternalScripts /etc/zabbix/zabbix_server.conf # 输出示例:ExternalScripts=/usr/lib/zabbix/externalscripts如果走 External Check,脚本要放到ExternalScripts指向的目录,或者在该目录下做软链指向/usr/local/bin/zabbix-proxmox/。软链的好处是脚本更新只改一处。改完zabbix_server.conf记得systemctl restart zabbix-server,不重启配置不生效,这个坑每年都有人踩。
4. 避坑与排查:五条装完才发现的坑
这一章是血泪经验集中区。下面五条都是“装的时候觉得没问题、跑起来才发现不对”的类型,按现象、原因、解决写,照着对号入座能省不少时间。
4.1 现象:主机绿了但 item 全灰
原因通常是宏没生效或 Token 格式错。Zabbix 宏有全局、模板、主机三层,优先级主机最高,但如果模板里宏名拼错一个字符,主机宏就匹配不上。解决:在主机配置的 Macros 页签逐条核对宏名与模板定义完全一致,Token 用用户@域!Token名=密钥完整格式,别只填密钥部分。
4.2 现象:脚本手动能跑,Zabbix 调用超时
原因是执行用户和路径环境不同。手动跑用的是登录 shell,PATH 完整;Zabbix 调用用的是服务账户,PATH 精简,脚本里如果用了相对路径或依赖某个 PATH 里的命令就会挂。解决:脚本内所有路径写绝对路径,Perl 脚本首行 shebang 写#!/usr/bin/perl而非#!/usr/bin/env perl,避免 env 找不到。
4.3 现象:虚拟机发现规则拉不到数据
原因是 API 权限不足或返回结构变化。PVEAuditor角色对部分集群级接口是只读但可见性受限,某些版本下/cluster/resources返回字段有调整。解决:先用 curl 带 Token 手动请求一次 API,确认返回 JSON 里有目标字段,再对照脚本解析逻辑。权限不够就补角色,字段变了就改脚本解析,别在 Zabbix 侧反复调。
4.4 现象:图表有数据但数值明显不对
原因是单位或预处理没配。Proxmox 返回的存储、内存单位可能是字节,模板里 item 单位若写成 KB,数值就差三个数量级。解决:打开 item 的预处理页签,确认乘除系数和单位换算,必要时加一条“自定义乘数”预处理。这类问题不会报错,只能靠对比 Proxmox 界面数值发现。
4.5 现象:采集节点重启后全部失效
原因是脚本依赖的临时文件或 Token 缓存放在/tmp,重启被清。解决:把脚本运行期需要的缓存、日志统一放到/var/lib/zabbix-proxmox/并确保目录存在、权限正确。我一般还会在 systemd 里加一条 tmpfiles 规则,或者干脆让脚本每次启动自建目录,避免依赖外部清理策略。
5. 装完怎么验证:三层校验与一个习惯
装完不等于跑通,验证要分三层:脚本层、Zabbix 层、数据层。三层都过,才算这套监控真的立住了。
第一层脚本层,直接在采集节点上跑一次完整采集,看退出码和输出:
# 带真实参数跑一次,检查退出码与输出结构 /usr/local/bin/zabbix-proxmox/proxmox_node.pl \ --url https://10.0.0.10:8006 \ --token 'monitor@pve!zabbix=xxxxxxxx' \ --node pve-node-01 > /tmp/pve_out.json 2>/tmp/pve_err.log echo "exit=$?" head -c 300 /tmp/pve_out.json退出码 0 且输出是合法 JSON 才算过。报错先看/tmp/pve_err.log,认证错、网络错、模块错在这里分得清。
第二层 Zabbix 层,在 Latest data 里筛目标主机,确认关键 item 有最近一次采集时间,且值不是空。重点看节点状态、虚拟机数量、存储用量这三类,它们分别对应不同 API 路径,能同时有数说明采集链路整体通。
第三层数据层,拿 Zabbix 里的数值和 Proxmox 界面逐项对一遍,尤其是存储和内存这类带单位的。对不上就回 4.4 查预处理。三层都过之后,再观察一个采集周期(通常 1 到 5 分钟),确认没有间歇性超时。
| 校验层 | 检查点 | 通过标准 |
|---|---|---|
| 脚本层 | 退出码、输出 JSON | 退出码 0,JSON 可解析 |
| Zabbix 层 | Latest data 时间戳 | 关键 item 有近期数据 |
| 数据层 | 与 Proxmox 界面对比 | 数值与单位一致 |
从那以后我每次接新的 Proxmox 节点进 Zabbix,都强制走一遍这三层校验,哪怕只是复制已有主机的配置——复制最容易漏宏、漏权限,而漏了不会报错,只会安静地没数据。监控这东西,装完那一刻的“看起来正常”最不可信,跑通一个完整采集周期再收工,才是真的稳。希望帮到你。
本文还有配套的精品资源,点击获取