Zabbix监控H3C交换机:通用模板设计与落地实践
简介面向使用Zabbix监控H3C交换机的运维工程师这套通用模板直接解决了设备CPU、内存利用率及端口状态等核心指标的快速接入问题。压缩包内共1个文件为zbx_export_templates.yaml格式的模板导出文件大小仅7KB导入Zabbix Web界面后即可关联至交换机主机省去手工创建监控项与图形的工作量。模板内置CPU、内存利用率监控项以及端口在线状态、速率、双工模式等配置并提供触发器阈值和可视化图形可对超阈值情况实时告警且触发器阈值可自定义图形可灵活配置。借助该模板管理员能快速建立H3C交换机的标准化监控基线结合触发器设置与历史趋势分析及时定位潜在性能瓶颈与链路异常。资源已有8243人浏览学习适合希望以轻量方式完善网络监控体系的Zabbix使用者。1. Zabbix 监控 H3C 交换机为什么不能一台台手工配监控项某公司机房里六十多台 H3C 交换机接入层、汇聚层、核心框式混在一起系统版本从老平台到新平台差了整整一代。新运维接手后第一件事就是「把交换机全部接进 Zabbix」一开始老老实实给每台设备手工加 CPU、内存、端口流量监控项加到第三台就崩溃了。真正的问题不是 Zabbix 不会用而是缺少一份能覆盖全型号的 H3C 交换机通用模板用 SNMP 统一采集指标靠自动发现把端口、温度、电源、风扇全部拉进来新交换机上线只需要建主机、绑模板、改 community 三步。这篇把模板思路、OID 选型、LLD 设计和落地坑一次讲透。2. 先把底子打好SNMP 配置与 OID 梳理2.1 H3C 交换机侧的 SNMP 配置v2c 够用v3 要配三处先把交换机上的 SNMP 开起来。Comware V7 平台常见的配置如下V5 平台语法略有差异但思路一致system-view snmp-agent snmp-agent sys-info version v2c snmp-agent community read simple ZbxRead2024 snmp-agent sys-info contact NetOps snmp-agent sys-info location IDC-A-03 quit save force说明snmp-agent打开 SNMP 服务sys-info version v2c限定协议版本别图省事写all少一个版本就少一类攻击面community read后面跟的就是 Zabbix 主机要填的读团体名simple表示明文配置生产环境建议改用cipher存储再配合交换机的 ACL 把 SNMP 访问源限制在 Zabbix server 所在网段。最后save force保存配置不然设备一重启辛苦配的东西全部还原。如果内网安全策略不允许明文团体名就得用 SNMPv3。v3 的配置比表面上麻烦不是开一个开关就能用的snmp-agent sys-info version v3 snmp-agent group v3 zbgroup read zbview snmp-agent usm-user v3 zbuser zbgroup simple authentication-mode md5 ZbxAuth2024 privacy-mode aes128 ZbxPriv2024注意v3 要同时配好 group、user 和视图权限Zabbix 主机的 SNMP 接口里要填安全名、认证密码、加密密码这三处任何一处对不上结果就是设备在 Zabbix 里一直显示红色不可达。我日常维护的机房绝大多数走的是 v2c 加交换机 ACL 限制源 IP只有跨公网管理段或者合规要求高的场景才上 v3。这个取舍不是能力问题是维护成本问题。2.2 OID 选型标准 MIB 优先H3C 私有 MIB 兜底通用模板能不能成立先看 OID 选型。H3C 交换机的监控 OID 大致分两类标准 MIB 和 H3C 私有 MIB。标准 MIB 是所有网络设备都遵守的跨品牌跨型号行为一致私有 MIB 才能取到 CPU、内存这些标准里没有的指标但不同软件版本的分支位置经常变。监控对象OID选型说明端口描述 ifDescr1.3.6.1.2.1.2.2.1.2标准 IF-MIBLLD 发现依赖端口状态 ifOperStatus1.3.6.1.2.1.2.2.1.8标准 IF-MIB配合 admin status 用端口管理状态 ifAdminStatus1.3.6.1.2.1.2.2.1.7标准 IF-MIB流量计数器 ifHCIn/OutOctets1.3.6.1.2.1.31.1.1.1.6 / .1064 位计数器优先用端口线速 ifHighSpeed1.3.6.1.2.1.31.1.1.1.15标准 IF-MIB算利用率用端口别名 ifAlias1.3.6.1.2.1.31.1.1.1.18对应端口 Description 字段CPU 使用率1.3.6.1.4.1.25506.2.6.1.1.1.1.6.0H3C 私有参考值内存使用率1.3.6.1.4.1.25506.2.6.1.1.1.1.8.0H3C 私有参考值温度/风扇/电源1.3.6.1.4.1.25506.2.6 分支下的实体状态表按型号实测不要写死我选 OID 的原则很明确端口、流量、状态这些指标一律走标准 IF-MIB只有 CPU、内存这种标准 MIB 覆盖不了的东西才碰私有 OID。理由不复杂通用模板的价值就是「新设备接进来不用改」而私有 OID 在低端接入盒子和核心框式上的表现经常不一样选标准 OID 是让模板活得更久的基础。1.3.6.1.4.1.25506是 H3C 的企业分支实体 MIB 普遍挂在25506.2.6下面。但不同型号、不同软件版本对「CPU 使用率」这个节点到底放在哪个位置没有绝对的保证所以我在模板里把 CPU、内存的 OID 做成了宏后面第三章会说具体做法。2.3 用 snmpwalk 验证 OID导入模板前省掉一半排错时间模板做得再漂亮OID 取不到数也是白搭。导入 Zabbix 之前先在 Zabbix server 上用 snmpwalk 把目标设备扫一遍这一步能挡掉后续一大半的排错时间snmpwalk -v2c -c ZbxRead2024 192.0.2.10 1.3.6.1.2.1.2.2.1.2 snmpwalk -v2c -c ZbxRead2024 192.0.2.10 1.3.6.1.4.1.25506.2.6.1.1.1.1 snmpget -v2c -c ZbxRead2024 192.0.2.10 1.3.6.1.2.1.1.2.0第一条拿端口描述表看 ifDescr 是不是GigabitEthernet1/0/1这种格式这决定 LLD 过滤正则是排除虚拟口还是保留物理口第二条试探 H3C 私有实体 MIB确认 CPU、内存的 OID 在这台设备上真实存在第三条取 sysObjectID用来判断设备属于哪个平台分支老平台和新平台的实体 MIB 布局差别很大。如果第二条返回的是No Such Instance就说明这个私有 OID 在这台设备上不存在别再硬编码后面用宏覆盖处理。3. 搭建模板正文宏、端口 LLD 与设备级监控项3.1 宏设计把 community、阈值、私有 OID 全部参数化有的人拿到 H3C 官方 MIB 就急着用 mib2zabbix 转模板转出来上百个 OID 堆在一起没有发现规则、没有过滤、没有触发器监控项全凭 OID 名称猜根本不实用。通用模板的正确做法是先把「会变的参数」全部抽成宏。宏默认值作用{$SNMP_COMMUNITY}publicSNMP 团体名主机上线时按设备覆盖{$CPU_OID}1.3.6.1.4.1.25506.2.6.1.1.1.1.6.0CPU 使用率 OID兼容差异兜底{$MEM_OID}1.3.6.1.4.1.25506.2.6.1.1.1.1.8.0内存使用率 OID{$CPU_CRIT}90CPU 告警阈值核心设备可单独调低{$MEM_CRIT}85内存告警阈值{$IF_UTIL_CRIT}90端口带宽利用率告警阈值{$PHYS_IF_FILTER}^(NULL|InLoopBack|Vlan-interface|MEth|M-GE|Register|Stack-Port|IRF-Port)端口发现排除正则宏的价值在于覆盖机制模板上定义的宏是默认值主机组可以覆盖单台主机还可以再覆盖。这样一份模板管几十台设备每台只需要在主机宏里改 community 和特殊阈值模板本身不用动。Zabbix 的宏优先级从低到高是模板宏、主机组宏、主机宏覆盖关系要记清楚否则改了半天没生效玄学问题就来了。3.2 端口自动发现LLD与监控项原型端口是交换机监控数量最大的对象不可能手工一条条加必须用 LLD。在模板的 Discovery rules 里新建规则名称Discover H3C Physical Interfaces类型SNMP agentSNMP OID1.3.6.1.2.1.2.2.1.2ifDescr 表Keyh3c.net.if.discovery然后加过滤器排除虚拟接口和管理口{#IFDESCR} not matches ^(NULL|InLoopBack|Vlan-interface|MEth|M-GE|Register|Stack-Port|IRF-Port)这条正则的意思很直白H3C 交换机上默认存在 NULL0、InLoopBack0、Vlan-interface 这些虚拟接口以及 MEth 管理口、IRF 堆叠口它们不是业务端口不应该出现在监控列表里。如果你需要监控 IRF 物理口就把对应的正则项从排除名单里拿掉。LLD 发现会为每个接口生成{#IFDESCR}和{#SNMPINDEX}两个宏{#SNMPINDEX}就是 ifIndex后面所有监控项原型的 OID 都靠它拼。监控项原型需要建这几个监控项原型OID 模板Key预处理Operational status1.3.6.1.2.1.2.2.1.8.{#SNMPINDEX}net.if.status[{#SNMPINDEX}]值映射 up1, down2Admin status1.3.6.1.2.1.2.2.1.7.{#SNMPINDEX}net.if.admin[{#SNMPINDEX}]值映射 up1, down2Incoming traffic1.3.6.1.2.1.31.1.1.1.6.{#SNMPINDEX}net.if.in.bps[{#SNMPINDEX}]Change per second 再乘 8Outgoing traffic1.3.6.1.2.1.31.1.1.1.10.{#SNMPINDEX}net.if.out.bps[{#SNMPINDEX}]Change per second 再乘 8Link speed1.3.6.1.2.1.31.1.1.1.15.{#SNMPINDEX}net.if.speed[{#SNMPINDEX}]无In utilization计算项见下net.if.in.util[{#SNMPINDEX}]计算表达式流量监控项的预处理是关键。SNMP 返回的是字节计数器不是速率必须先「Change per second」换算成每秒字节数再乘 8 得到 bps。如果不做预处理Zabbix 存储的就是计数器原值图形毫无意义。端口利用率用计算型监控项实现last(/Template Net H3C Switch/net.if.in.bps[{#SNMPINDEX}]) / (last(/Template Net H3C Switch/net.if.speed[{#SNMPINDEX}]) * 1000000) * 100注意ifHighSpeed的单位是 Mbps所以乘1000000转成 bps。全双工端口一般分别看入方向和出方向的利用率别把 in 和 out 加起来否则双工口超过 50% 就误报带宽跑满。3.3 设备级 CPU、内存、温度、电源监控项的兼容写法设备级指标最怕型号差异。CPU 和内存的 OID 我直接填宏CPU 使用率SNMP OID 填{$CPU_OID}Key 用system.cpu.usage内存使用率SNMP OID 填{$MEM_OID}Key 用system.mem.usage把 OID 写进宏之后遇到某台设备私有 OID 不兼容只需要在主机宏里覆盖{$CPU_OID}为新值模板和其余设备完全不受影响。这是我做通用模板最看重的一点不是所有设备都兼容同一套 OID而是所有设备都兼容同一套「宏 默认值」的机制。预处理也要留意。有的 H3C 设备 CPU 使用率返回0~100的整数有的返回0~1000的千分比个别型号还会带上百分号。先用snmpget看一次真实返回值再给监控项加Custom multiplier预处理千分比就乘 0.1。这个差异如果不处理CPU 显示永远只有真实值的十分之一阈值告警形同虚设。温度、电源、风扇这类实体状态我的做法是「通用模板里先不写死」。H3C 实体状态数据一般挂在1.3.6.1.4.1.25506.2.6分支下但实体索引在不同型号上差异很大有的按槽位编号有的按传感器编号写死 LLD 后换型号必翻车。稳妥路线是通用模板只做 CPU、内存、端口三项温度电源单独建一个实体状态模板只在核心设备上关联。这样通用模板保持轻实体模板可以慢慢打磨。3.4 触发器设计端口 Down 告警要收敛别自己炸自己触发器是模板里最容易失控的地方。端口 down 的触发器如果只判断ifOperStatus2那么发现规则扫出来的几百个未启用端口全部会告警上线第一天告警风暴就把人淹了。正确写法要同时判断管理状态last(/Template Net H3C Switch/net.if.status[{#SNMPINDEX}])2 and last(/Template Net H3C Switch/net.if.admin[{#SNMPINDEX}])1意思是端口管理状态是 up但实际链路状态是 down这才是真正的故障。被管理员 shutdown 的口admin status 本来就是 down链路 down 是正常现象不该告警。带宽利用率触发器基于计算项last(/Template Net H3C Switch/net.if.in.util[{#SNMPINDEX}]) {$IF_UTIL_CRIT}节点用 LLD 宏进出的 item key 保持一致不然新发现的端口不会自动带触发器。CPU 和内存告警建议用 5 分钟平均值避免瞬时尖峰误报avg(/Template Net H3C Switch/system.cpu.usage, 5m) {$CPU_CRIT}Templates 更新时还会遇到一个隐蔽问题如果直接在每台主机的 item 上改阈值模板一升级这些手工改动全部被覆盖。阈值必须放在宏里改这是模板维护的血泪经验。4. 导入与落地关联主机、覆盖宏、验证数据4.1 模板导入与主机关联三步把交换机接入 Zabbix模板在前端页面按Data collection → Templates → Import导入文件可以是 YAML 或 XMLZabbix 6 之后默认 YAML。导入后先确认模板出现在 Template groups 里再开始关联主机。第一步在Hosts → Create host建主机填设备名和可见名第二步在 Interfaces 区域加一个 SNMP 接口IP 填交换机管理地址端口 161版本 v2ccommunity 临时填一个占位值第三步在 Templates 区域关联刚导入的 H3C 通用模板。注意 Zabbix 的 SNMP 接口和 Zabbix agent 接口是两个独立的会话别把 community 填到 agent 的 PSK 字段里这个错一犯就是「设备不可达」红一整排。关联完成后等 3 到 5 分钟让 LLD 跑完一轮然后去Latest data页面过滤这个主机看端口监控项有没有批量出现。正常情况下每个物理端口都会展开成一组 in、out、status、util 监控项数量应该和交换机上display interface brief看到的端口数相当。4.2 宏覆盖同一模板管不同型号的三种手法模板关联只是开始真正的适配靠宏覆盖。第一种是社区名覆盖。每台交换机在设备侧配置的 community 可能都不同在主机宏里写{$SNMP_COMMUNITY}: ZbxRead2024这一台设备就用自己的 community其余设备不受影响。第二种是 OID 兼容覆盖。某台设备的私有 OID 和模板默认值不一致snmpwalk找到正确 OID 后在主机宏里写{$CPU_OID}: 1.3.6.1.4.1.25506.2.6.1.1.1.1.6.1CPU 监控项立刻恢复数据不需要给这台设备单独复制模板。第三种是阈值覆盖。核心交换机想更敏感监控项不想动直接在主机宏写{$CPU_CRIT}: 80。同型号的一批设备想统一改就用主机组宏。记住优先级模板宏 主机组宏 主机宏越具体越优先。凡是模板里定义过的参数都不要在 item 上硬改。4.3 落地验证清单哪些指标没数、哪些数不对模板上线后的验证不能只看「有数据」要看「数据对不对」。我一般按下面这张清单过一遍检查项验证方法正常标准LLD 端口数量Latest data 里按 net.if.status 过滤统计接口数与 show interface brief 基本一致端口速率找一个已知千兆上联口看 in/out bps空闲时接近 0大流量时到 Gbps 量级CPU 使用率登录设备执行 display cpu对比 Zabbix 数值相差不超过 5 个百分点内存使用率display memory 对比相差不超过 5 个百分点数据新鲜度Latest data 里看每项数据的采集时间不应出现超过 2 分钟的陈旧数据触发器灵敏度手动 shutdown 一个测试口再 undo1 分钟内出现端口 down 告警如果发现端口数量少了很多多半是 LLD 过滤正则在排除名单里误伤了物理口如果流量是负数或者高得离谱去看计数器类型八成是 32 位计数器翻转问题。下面专门讲这几个高频坑。5. H3C 交换机通用模板避坑指南5 个高发翻车点5.1 空端口和虚拟接口刷屏告警风暴把机房群炸了现象模板关联后半小时内告警平台涌进来几百条端口 down点开全是 NULL0、Vlan-interface、未接线的空口。原因LLD 没有过滤虚拟接口同时触发器只判断了ifOperStatus2。H3C 交换机即使端口没接线只要不 shutdownOID 也会正常响应LLD 全部扫进来空口本来就应该 down于是告警雪崩。解决过滤器加上排除正则把NULL|InLoopBack|Vlan-interface|MEth|M-GE|Register|Stack-Port|IRF-Port全部排除触发器必须同时判断 admin status只对「管理状态 up 但链路 down」的端口告警。5.2 32 位计数器翻转导致流量变负数现象某台老型号交换机的端口速率图形上出现一个巨大的负尖峰或者从 1.2Tbps 突然跳回 0。原因老型号不支持ifHCInOctets只能取ifInOctets。这是 32 位计数器最大计到 4.29GB超过就翻转归零。Zabbix 的 Change per second 预处理把翻转当成了一次负增长于是出现负速率。解决优先使用 64 位计数器ifHCInOctets和ifHCOutOctets也就是 OID1.3.6.1.2.1.31.1.1.1.6和.10模板里默认就用这两个。只有确认设备不支持 HC 系 OID 时才退回 32 位同时要知道翻转点会失真一次阈值告警别设得太敏感。5.3 CPU 使用率返回千分比模板阈值形同虚设现象Zabbix 里 CPU 一直显示 3%、4%但登录设备执行display cpu看到的是 35%。原因这台设备 CPU 使用率 OID 返回的是0~1000的千分比数值35 代表 3.5%Zabbix 原样存储看起来就差了十倍。解决先用snmpget确认返回值类型然后在 CPU 监控项上加预处理Custom multiplier参数填0.1把千分比还原成百分比。加了之后再和display cpu对比一次误差在 5 个百分点以内就说明处理对了。以后模板里有设备 CPU 数值明显偏离直觉第一反应就是查这个。5.4 私有 OID 在部分型号上报 No Such Instance现象同一份模板接入层设备 CPU 有数据汇聚层设备 CPU 和内存一直红色Latest data 里报No Such Instance。原因H3C 私有实体 MIB 的 CPU 节点在不同平台版本上位置不同模板默认 OID 只覆盖了其中一部分设备。这不是模板写错了是设备差异。解决在 Zabbix server 上snmpwalk -c community 设备IP 1.3.6.1.4.1.25506.2.6.1.1.1.1找到该设备真实的 CPU 节点然后主机宏覆盖{$CPU_OID}。同时把这次适配的 OID 记到模板 description 里下次再遇到同型号可以直接套用。5.5 交换机 SNMP 配置没问题Zabbix 里还是没数据现象在交换机上dis snmp-agent看配置一切正常Zabbix 主机却一直红色设备不可达。原因最常见的是 Zabbix server 到交换机的网络路径不通或者防火墙挡了 UDP 161其次是主机 SNMP 接口里填的 community 和交换机上不一致。很多人只在交换机上验证了 SNMP 配置忽略了从 Zabbix server 侧发起的整条链路。解决在 Zabbix server 上手动执行一次snmpwalk -v2c -c community 设备IP sysDescr能返回就说明网络和认证都通问题在 Zabbix 主机配置不返回就逐段排查网络。再看Administration → Audit log确认主机有没有被正确读取和关联模板。这条排查路径比在模板里反复折腾 OID 有效得多。6. 把模板做成越用越顺手的资产两个必须养成的习惯第一个习惯是「新设备上线三步法」。任何一台新的 H3C 交换机接入 Zabbix固定执行三步先在 Zabbix server 上snmpwalk验证 OID再建主机绑模板最后检查{$CPU_OID}、{$MEM_OID}是否需要覆盖。这样做的价值是把「适配」从每次重构模板变成偶尔覆盖一两个宏。模板的通用性不是一次写完的是靠着每次适配积累出来的每覆盖一个宏就在模板描述里补一行注明型号、平台版本和实际 OID。半年后回头看这份描述就是最值钱的兼容性文档。第二个习惯是「只改模板不改主机」。任何阈值调整、预处理调整都回模板里改主机只保留宏覆盖。Zabbix 的模板链接机制允许模板更新后自动同步到所有关联主机这是天然的后悔药反过来如果每台主机上都手工改过监控项模板一更新这些改动就会被覆盖成模板默认值到时候说不清是模板错了还是手工改坏了。我自己的前车之鉴刚开始做温度模板时总想把所有型号的实体索引都收进一个模板里结果每台设备的传感器索引都不一致维护量比维护监控本身还大。后来把温度、电源从通用模板里拆出去只给核心框式设备单独挂实体状态模板通用模板只保留 CPU、内存、端口和 LLD反而再没出过兼容性事故。通用模板的边界不是「什么都能监控」而是「接入新设备时改的东西最少」。希望这篇能帮你在 H3C 交换机的 Zabbix 监控上少走一段弯路少踩几个我已经踩过的坑。本文还有配套的精品资源点击获取