如果你和我一样,每天面对几十台虚拟机、八九台ESXi宿主机,vCenter自带的性能视图其实早就看腻了——它只能在Web页面里点开看,没法在深夜把“这台宿主机CPU爆了”这件事主动推给你。把vCenter纳入Zabbix是很多虚拟化团队的刚需,但Zabbix 6.0监控vCenter 7.0这条路,我第一次走的时候也翻过车:主机加进去了,页面上显示“已启用”,等了半小时“最新数据”干干净净,什么都没有。后来才发现问题根本不在vCenter,也不在模板,而在Zabbix Server的一个默认参数。
这篇文章把我整个落地过程完整记录下来:从vCenter侧怎么创建最小权限账号、Zabbix Server侧被很多人忽略的VMware Collector机制,到Web界面里那几个容易填错的宏,再到我实际踩过的坑和排查链路。照着做基本能一次跑通,就算出了问题,也知道该往哪个方向查。适合已经装好Zabbix 6.0、准备把vCenter 7.0纳入统一监控的运维同学参考。
1. 监控方案选型:为什么我选了Zabbix原生VMware模板
先说说方案选型。vCenter 7.0的监控路子其实不少:SNMP、REST API自写脚本、Zabbix官方VMware模板。我身边很多人一上来就想着用SNMP去监控vCenter,理由是简单,但实际效果很有限。vCenter的SNMP Agent能提供的OID大多是系统基础信息,像CPU、内存这种简单指标,虚拟机级和宿主机级的性能数据很难完整拿全,更没有自动发现那套机制。另一个极端是自己写脚本调vCenter REST API,数据当然够全,但意味着你要自己维护采集频率、数据落库、告警逻辑,工作量不小,后续迭代也是负担。
Zabbix官方模板的好处是采集逻辑已经封装好了。它走的是vCenter的SOAP SDK(HTTPS/443),不需要在每台ESXi上装任何Agent,也不需要你在虚拟机里装东西。模板自带自动发现,集群、宿主机、虚拟机、数据存储都能自动找出来,性能数据、电源状态、硬件健康状态一应俱全。在大规模环境下,Zabbix的VMware Collector会把从vCenter拉回来的数据先缓存在内存里,再由其他进程写入数据库,这种设计避免了对vCenter API造成太大压力。从长期维护角度看,这是性价比最高的路线。
方案对比大概是这样的,方便你根据自己环境判断:
| 方案 | 数据完整度 | 维护成本 | 自动发现 | 我的建议 |
|---|---|---|---|---|
| Zabbix官方VMware模板 | 高 | 低 | 支持 | 首选,本文就是这个方案 |
| SNMP直接监控vCenter | 低 | 低 | 不支持 | 不推荐做主监控 |
| 自写脚本调REST API | 高 | 高 | 需自己实现 | 特殊需求才考虑 |
Zabbix监控vCenter实际有两条数据通道:第一条是HTTPS SOAP API,负责拉性能数据和状态信息,这也是日常监控的主力;第二条是vCenter的SNMP Trap,负责把vCenter里的告警事件主动推给Zabbix,这个属于锦上添花,可以后续再搞。搞清楚这两条通道,后面配置时你就不容易糊涂。
2. 环境准备:vCenter侧账号与Zabbix Server侧配置
这节是返工率最高的地方。很多人配置步骤全对了,最后卡在账号权限和Zabbix Server的VMware模块没启用上。
2.1 vCenter侧创建只读监控账号
千万不要直接用administrator@vsphere.local当监控账号。维护规范是一方面,更重要的是避免权限过大。我习惯在vCenter里创建一个专用账号,比如zabbix-mon@vsphere.local,然后给它分配“只读”角色。
具体操作路径是:在vCenter Web Client里,选中根对象(例如vCenter Server的FQDN),右键“添加权限”,添加用户zabbix-mon,角色选择“只读”,并勾选“传播到子对象”。这样Zabbix就能通过API读取整个vCenter树下的集群、宿主机、虚拟机、数据存储信息。
有个小细节:vCenter 7.0的权限分为“SSO用户”和“vCenter权限”两层。你光在SSO里创建用户还不够,必须到vCenter对象上授权。如果你建完账号后Zabbix那边报权限不足,优先检查是不是漏了授权这一步。
2.2 检查Zabbix Server的VMware编译依赖
Zabbix的VMware监控能力依赖libcurl和libxml2库。如果你是拿发行版仓库装的zabbix-server,一般没这个问题。但如果你像我一样是从源码编译的,配置的时候一定要带上这两个依赖:
./configure --with-libcurl --with-libxml2缺少依赖时,Zabbix Server能正常启动,但VMware相关功能不工作,日志里会提示VMware monitoring不可用。这个错很隐蔽,排查半天往往才发现编译参数就不对。
确认编译是否支持有一个简单方法。Zabbix Server启动后,用ps看一眼进程:
ps -ef | grep vmware如果看到类似zabbix_server: vmware collector的进程,说明VMware相关组件已经起来了。没看到,就要回到前面的步骤去查。
2.3 必须调整的zabbix_server.conf参数
这是整篇文章里最重要的一个坑。Zabbix默认配置下,VMware Collector进程不会启动,即使你在Web界面添加了VMware类型主机,也不会去采集任何数据。
打开zabbix_server.conf,确认以下参数:
### Option: StartVMwareCollectors # Number of pre-forked vmware collector instances. StartVMwareCollectors=2 ### Option: VMwareCacheSize VMwareCacheSize=32M ### Option: VMwareFrequency VMwareFrequency=60 ### Option: VMwareTimeout VMwareTimeout=20StartVMwareCollectors:默认是0,必须改成至少1。我这里设置2,监控规模不大够用了。VMwareCacheSize:默认8M,如果监控几百台虚拟机可能不够,日志里会报缓存不足,建议直接给到32M或更大。VMwareFrequency:Zabbix每隔多少秒去vCenter拉一次数据,默认60秒。因为vCenter本身的性能数据就有5分钟周期,这个值保持默认就行,不用调太快。VMwareTimeout:默认10秒。vCenter 7.0在负载高的时候API响应会变慢,10秒容易超时,我一般调到20秒。
改完配置文件后,重启zabbix-server。注意别改完不重启就跑去Web界面折腾,我见过不少同事栽在这一步。
3. Zabbix Web界面添加vCenter主机的完整步骤
配置好Server后,接下来就是Web界面的操作。
3.1 创建VMware类型主机时最容易搞错的三个地方
在Zabbix Web界面,进入“数据采集”->“主机”,点击“创建主机”,有三个地方特别容易出错:
第一,类型必须选择“VMware”。很多人习惯性选成Zabbix agent,结果数据永远不来。VMware类型意味着Zabbix会通过vCenter SDK去拉数据,而不是在目标上装Agent。
第二,接口可以留空。Agent类型主机要填IP和端口,但VMware类型主机的连接信息完全由宏{$VMWARE.URL}决定,接口区域不需要填写,直接留空保存即可。这一点和大多数人的直觉不一样。
第三,链接模板选“VMware”。模板在模板组“Virtual machines”下面,名字就叫VMware。链接之后会自动带出一堆应用集、监控项和自动发现规则。
3.2 宏参数详解与常见填写错误
主机创建后,在“宏”标签页配置以下宏:
| 宏 | 示例值 | 说明 |
|---|---|---|
| {$VMWARE.URL} | https://vcsa.example.com/sdk | vCenter SDK地址,必须以/sdk结尾 |
| {$VMWARE.USERNAME} | zabbix-mon@vsphere.local | SSO账号,不能漏@后面的域名 |
| {$VMWARE.PASSWORD} | 你的密码 | 密码含$或\时要注意转义 |
| {$VMWARE.NAME} | vCenter-Prod | 连接别名,多vCenter环境务必设置 |
{$VMWARE.URL}是你需要格外小心的。vCenter 7.0的SDK服务地址是https://<FQDN或IP>/sdk,不是根路径,也不是/vsphere-client。如果你填错了路径,Zabbix会报连接失败。
另一个容易忽略的是{$VMWARE.USERNAME}。vCenter 7.0默认SSO域是vsphere.local,所以用户要写成zabbix-mon@vsphere.local或者administrator@vsphere.local,不要只写zabbix-mon。
{$VMWARE.NAME}在单vCenter环境下可填可不填,但我建议还是设置一个有意义的名字。后面监控项、触发器里区分来源都靠它,尤其当你有多套vCenter时,不设置会非常痛苦。
3.3 宏密码的特殊字符转义问题
如果你用模板宏直接填密码,密码里含有$、\、'这些字符时,Zabbix在解析宏的时候会有特殊规则。表现往往是:界面保存成功,但采集数据报Login failed或者认证失败,日志里看不到明确原因。
最简单粗暴的处理方式:在vCenter里把监控账号的密码改成纯字母数字组合。监控账号本来就不需要高复杂密码,这个策略能省掉很多不必要的排障时间。如果你确实不能改密码,那就需要注意宏值里特殊字符的转义方式,在Zabbix官方文档里有详细说明,这里不展开。
4. 连接验证与首屏数据检查
很多人在配置完主机后,立刻去“最新数据”里刷,发现一片空白,就开始怀疑人生。其实这里有一个正常的等待期,但同时也要掌握验证连通性的方法。
4.1 先用curl验证vCenter SDK是否可达
在Zabbix Server上直接用curl测试一下SDK地址:
curl -k -i https://vcsa.example.com/sdk如果vCenter SDK服务正常,即使没有携带认证信息,服务端也会返回HTTP 200和一个SOAP格式的XML响应,比如类似<soapenv:Envelope>的内容。如果这里都访问不通,说明是网络、DNS或证书层面的问题。注意-k参数是跳过证书验证,因为vCenter 7.0默认是自签名证书或内部CA,Zabbix一般能处理,但curl测试时跳过更方便。
4.2 查看Zabbix Server日志和进程状态
配置完并重启服务后,重点看日志:
grep -i vmware /var/log/zabbix/zabbix_server.log正常情况下能看到VMware monitor启动相关的字样。再看一眼进程:
ps -ef | grep vmware看到vmware collector进程,说明采集器起来了。之后去“最新数据”页面,筛选刚才创建的vCenter主机,搜索vmware,就能看到监控项开始陆续出现数据。
4.3 为什么前15分钟数据可能是空的
vCenter 7.0本身的性能数据不是实时的,默认5分钟一个采集周期。Zabbix的VMwareFrequency虽然设的是60秒,但它每次去拉取时拿到的可能是上一轮性能数据。所以刚添加主机的前5到15分钟,某些监控项没数据或数据稀疏,都是正常现象。
判断一个监控项是否正常,不是看有没有点,而是看状态是不是“已启用”。只要状态正常,数据点是早晚的事。千万别因为前15分钟没出数据就反复重启服务、删主机重加,那样只会让问题更乱。
4.4 常见监控项错误信息对照
把最常见的几类错误整理一下,方便你对照排查:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 全部vmware.*监控项状态为“不支持” | StartVMwareCollectors为0 | 修改conf并重启zabbix-server |
| 报错Cannot connect to VMware | URL错误或网络不通 | curl测试SDK地址,检查宏{$VMWARE.URL} |
| 报错Login failed | 账号密码错误或特殊字符问题 | 核对宏,必要时改用纯数字字母密码 |
| 报错Permission denied | 用户未在vCenter授权 | 检查全局只读权限是否传播到子对象 |
| 数据不更新但状态正常 | vCenter性能周期未到 | 等待5-15分钟再观察 |
| 日志提示VMware cache size too small | VMwareCacheSize不足 | 调大VMwareCacheSize并重启 |
5. 实际踩坑记录:从“没有数据”到“刷出几百个VM”的排查链路
下面这些坑是我实际过程中踩过的,每一个都花了不少时间。写出来不是为了列问题,而是让你知道排查时该按照什么思路走。
5.1 场景一:配置全部正确,但数据死活不来
第一次配置时,我自认为所有步骤都做对了:vCenter账号建了、主机也加了、宏填了,但“最新数据”就是空的。查日志,没有报错;查Web界面,主机状态“已启用”。这个现象像极了Zabbix的“薛定谔式故障”。
排查链路是这样的:先想到去确认采集器进程,执行ps -ef | grep vmware,果然没有vmware collector进程。再回看zabbix_server.conf,发现StartVMwareCollectors是默认的0,注释都没取消。改配置、重启,大概半分钟后进程起来了,数据也逐渐出来了。
这个坑的本质是:Zabbix默认不启用任何VMware采集能力,但Web界面不会给你任何提示。所以以后配置VMware主机之前,第一件事就是确认这个参数。
5.2 场景二:密码里的特殊字符导致Login failed
账号、网络、URL全查了一遍,都没有问题,但日志就是报Login failed。后来我是在Zabbix Web界面里把密码重新填了一遍,还是不行;最后在vCenter里把密码改简单,问题立刻消失。
原因就是宏值里的特殊字符被解析出了问题。这类错误在日志里不会说“密码格式有误”,只会在vCenter侧记录认证失败。类似的坑还包括用户名里的@被错误转义。建议监控账号密码一律用字母加数字,规避这个坑。
5.3 场景三:vCenter 7.0的vCLS虚拟机刷屏
Zabbix的VMware模板会自动发现集群里的所有虚拟机,vCenter 7.0每个启用了vSphere功能集群会有几台名称以vCLS开头的虚拟机,用来跑集群服务。这些虚拟机会被Zabbix当作普通虚拟机发现出来,导致监控项列表里多出一堆看似无意义的条目。
处理方式是在模板的虚拟机发现规则里配置过滤器,将名称匹配vCLS.*的虚拟机排除。Zabbix 6.0的VMware模板支持通过泛型宏来设置排除规则,具体的宏名和过滤器条件可以在模板的发现规则里查看。我当时是在模板里改了过滤器,匹配模式填^(?!vCLS).*$,让发现规则只采集不以vCLS开头的主机。改完模板后,需要等下一个发现周期生效,或者手动执行一次发现。
5.4 场景四:多vCenter环境下同名虚拟机数据混乱
后来我管理第二个vCenter时,发现两个数据中心里存在同名虚拟机,导致Zabbix里监控项名称重复,图表数据串了。
排查到最后,问题出在模板的监控项命名上。发现规则生成监控项时用的是虚拟机名称,一旦两个vCenter的虚拟机重名,就分不清谁是谁。解决方案就是给每套vCenter设置不同的{$VMWARE.NAME}宏,并在模板的监控项名称或发现规则中带上这个宏作为前缀。这也印证了前面为什么要劝你设置{$VMWARE.NAME}。
5.5 场景五:缓存不足导致采集不稳定
虚拟机数量过了几百台之后,日志里开始出现VMware cache size too small的提示,随后数据更新开始不稳定,有些宿主机监控项会间歇性无数据。
原因很好理解,Zabbix把从vCenter拉回来的数据先放在内存缓存里,默认8M不够用了。我把VMwareCacheSize调到64M之后,问题消失。如果你的虚拟机总量上千台,建议直接给128M以上,同时留意Zabbix Server所在物理内存是否充足。
6. 告警规则设计与后续优化
数据上来了,监控的最终目的是告警。Zabbix自带的VMware模板有部分触发器,但默认阈值不一定适合你的业务。我给你一套经过实践检验的基础告警建议。
6.1 适合大多数环境的告警阈值
| 监控项 | 建议阈值 | 说明 |
|---|---|---|
| vmware.hv.cpu.usage | 85%警告,95%严重 | 宿主机CPU使用率 |
| vmware.hv.memory.used | 90%警告,95%严重 | 宿主机内存使用率 |
| vmware.vm.cpu.ready | 10%警告,20%严重 | CPU就绪时间,高说明资源竞争严重 |
| vmware.datastore.size | 80%警告,90%严重 | 数据存储空间使用率 |
| vmware.hv.power.state | 非正常状态告警 | 宿主机掉线或维护状态时通知 |
CPU Ready这个指标我要多说一句。很多人只看虚拟机内部的CPU使用率,忽略了宿主机的资源竞争。当宿主机CPU资源紧张时,虚拟机内部CPU使用率不见得高,但CPU Ready会明显上涨。这个指标在Zabbix的VMware模板里有单独的监控项,建议重点盯。
6.2 扩展思路:利用SNMP Trap接收vCenter告警事件
性能监控搞定之后,如果你还想进一步把vCenter里的告警事件(比如HA切换、存储掉线)也汇总到Zabbix,可以走SNMP Trap通道。大致流程是:在vCenter 7.0的告警设置里配置SNMP陷阱接收器,指向Zabbix Server的162端口;Zabbix侧安装并配置snmptrapd,启用StartSNMPTrapper=1,然后用SNMP trap类型的监控项接收。
按我的经验,这个方案的投入产出比不如性能监控。vCenter的SNMP Trap内容格式比较固定,但字段解析和自定义正则都需要花时间维护。如果你对vCenter告警没有强制统一归档的要求,建议先把性能监控跑扎实,事件告警后续按需再做。
6.3 版本更新与兼容性建议
Zabbix 6.0是LTS版本,官方对vCenter 7.0是支持的。但如果你用的是6.0.0、6.0.1这些早期补丁版本,遇到一些vCenter 7.0更新版本后的API兼容问题,建议升级到6.0.x最新的补丁版本。社区里反馈过一些VMware Collector内存增长的问题,也是在后来的补丁里修复的。
多vCenter环境建议每套vCenter单独创建一个VMware类型主机,并设置不同的{$VMWARE.NAME}宏。这样监控项清晰、告警规则可以按环境差异化配置,后续排查问题也方便。
最后再分享一点个人体会:这套监控折腾完之后,最值钱的不是那个“vCenter监控面板”,而是你在搭的过程中把Zabbix的VMware采集机制摸透了——以后遇到什么“主机已添加但没数据”的问题,几分钟就能定位到StartVMwareCollectors或宏配置上。如果你也刚准备配,别急着搜各种“一键脚本”,花半小时把原理和参数搞清楚,比什么脚本都管用。