CactiEZ 10.1 华为/中兴/H3C 交换机监控模板与 OID 校准

发布时间:2026/11/2 20:54:36
CactiEZ 10.1 华为/中兴/H3C 交换机监控模板与 OID 校准 简介面向网络运维与机房管理人员的一套 CactiEZ 10.1 主机监控模板合集针对交换机、路由器及常见网络设备在统一纳管时手工创建模板和编写数据查询耗时且容易出错的问题整理适合具备 SNMP 与 Cacti 基础的中级运维人员套用。压缩包共 16 个文件以 15 个 XML 主机模板为主附 1 个 txt 使用说明整体约 314KB体积轻量便于分发备份。模板覆盖华为 S2300/S2700、S7703、S9000、S5700 系列交换机中兴 ZXR2609、H3C AR2811 与 S2000 系列并延伸至 APC 智能 UPS、惠普网络打印机、海康威视硬盘录像机、Windows 主机与通用 SNMP 设备等场景。导入后即可获得 CPU、内存、光功率、接口流量、打印机墨量等监控项与图形定义省去逐条编写 OID 和数据模板的重复劳动也便于按设备型号复制监控策略。目前已有 2059 人学习下载可作为中小机房设备监控快速应用的模板参考。1. 一套模板需承担三类配置CactiEZ 10.1 交换机监控模板的适用边界凌晨两点被告警叫起来核心交换机 CPU 已经打到 90%Cacti 上那条 CPU 曲线却平得像一条直线。查到最后问题不在设备而在于监控模板里 CPU 的 OID 还指着一台老型号的路径。这件事之后我对任何“现成模板”都多了个心眼。CactiEZ 10.1 这套华为、中兴、H3C 交换机主机监控模板本质是把 CPU、内存、温度、风扇、电源、端口流量与错包这些指标打包成能直接绑到设备上的主机模板省掉一台台手搓图形模板的工夫。它适合已经跑着 CactiEZ、手里有一批三家交换机的运维也适合把它当 OID 对照表反查自家设备该走哪套 MIB。但它不是免校准的导入前你得清楚设备型号和软件版本落在哪套私有 MIB 上。2. 拆开 XML 看结构主机模板、数据模板、图形模板怎么串起来2.1 三张模板的依赖链与导入顺序Cacti 的模板体系是自底向上串起来的不是平铺的一堆文件。最底层是 Data Input决定取数方式是 SNMP Get 还是 SNMP Query往上一层是 Data Template定义数据源字段名、步长、数据类型、最大最小值再往上是 Graph Template定义画几条线、用什么 CDEF、图例怎么排旁路还有 SNMP Query 的 XML负责把一张 MIB 表按索引遍历出来给 Data Template 供数最顶上的 Host Template 只是个“打包引用”把上面几类按名字挂到一起绑设备时一次性套上。这条链子最关键的一点Host Template 里存的是名字引用不是对象副本。导入时如果某张 Graph Template 缺失Cacti 不会报错中断只会静默跳过那一条最后你看到的现象就是“模板导入成功了但设备上少了两张图”。血泪经验是别信导入完成的绿条导完必须去 Host Template 详情页数一遍图形模板数量对不对。包里几类文件的角色可以直接对着看模板类型在包里的角色依赖谁缺失后的表现Data Input定义 SNMP 取数方式无数据模板无法落地Data Template数据源字段、步长、类型Data Input图形有壳无数据Graph Template曲线项、CDEF、图例Data Template主机模板少图SNMP Query XMLMIB 表遍历与索引映射无端口/实体类图全空Host Template打包以上所有全部绑定后无图可出一段典型的 Host Template XML 长这样能看出它引用的是名字host_template nameH3C_Switch_Host/name graph_templates graph_template nameH3C - CPU Usage/name /graph_template graph_template nameH3C - Entity Temperature/name /graph_template /graph_templates snmp_queries snmp_query nameH3C Entity Ext/name /snmp_query /snmp_queries /host_template这段里name必须和库里已有的图形模板名逐字一致大小写、空格、连字符都算。我一般会先把整包解压grep 一遍所有name确认没有重名和前后空格再动手导入。导入顺序按依赖走Data Input → SNMP Query → Data Template → Graph Template → Host Template。整包一次性导入时脚本会尝试排序但中途失败不会回滚所以生产库动手前必须先备份。2.2 三家设备 OID 的差异点与模板里的映射方式三家设备的私有 MIB 结构完全不同这是这套模板真正的价值所在也是它最容易翻车的地方。华为走 HUAWEI-ENTITY-EXTENT-MIB指标挂在hwEntityCpuUsage、hwEntityMemUsage、hwEntityTemperature这几张实体扩展表上索引是 entPhysicalIndex一台设备有多少块板卡就有多少行H3C 走 HH3C-ENTITY-EXTENT-MIB对应hh3cEntityExtCpuUsage、hh3cEntityExtMemUsage、hh3cEntityExtTemperature同样是按实体索引中兴走 ZXR10 私有节点不同软件版本差异更大有的版本 CPU 是标量结尾 .0有的版本是表必须先 walk 出来再定。常见路径可以先当入口用但别当成真理指标华为常见路径H3C 常见路径中兴CPU 利用率1.3.6.1.4.1.2011.5.25.31.1.1.1.1.51.3.6.1.4.1.25506.2.6.1.1.1.1.6ZXR10 私有节点需 walk 确认内存利用率1.3.6.1.4.1.2011.5.25.31.1.1.1.1.71.3.6.1.4.1.25506.2.6.1.1.1.1.8同上温度1.3.6.1.4.1.2011.5.25.31.1.1.1.1.111.3.6.1.4.1.25506.2.6.1.1.1.1.12视型号而定端口流量IF-MIB / IF-MIB HCIF-MIB / IF-MIB HCIF-MIB / IF-MIB HC模板里对这些表的处理方式是在 SNMP Query XML 中用index_order把实体名拉出来做图例。如果只按数字索引出图图例就会变成一排 “1、2、3、4”看不出哪块板卡过热。正确做法是把entPhysicalName1.3.6.1.2.1.47.1.1.1.1.7作为索引描述字段这样温度图的图例才是“MPU 0/0”“LPU 1/0”这种能直接对应槽位的名字。还有一处差异容易被忽略华为和 H3C 的实体表里包含大量非板卡实体比如风扇框、电源模块、传感器索引数量可能是实际板卡的好几倍。如果不做过滤一张 CPU 图会画出二三十条线全是 0图直接没法看。我的做法是在 SNMP Query 的 XML 里加index_order和输出字段过滤只保留 CPU/内存有值的实体对温度图则反过来保留传感器实体否则温度又是空的。这两类指标的实体范围不一样不能共用同一套过滤规则。提示模板里给的 OID 是入口不是承诺。同一厂商不同软件版本私有节点可能整体搬家导入后第一件事永远是拿实际设备 walk 一遍核对。3. 导入与绑定把模板套到设备上的完整动作3.1 导入前的版本核对与备份Cacti 的模板 XML 里带了一个cacti_version和 hash 校验版本差得太多导入会直接卡在哈希校验上。所以第一步不是导是核对版本和备份。CactiEZ 10.1 的 Web 根目录一般在/var/www/html/cacti路径不对的话先用find找一下include/global.php。# 1. 确认当前 Cacti 版本与模板目录 grep -E cacti_version|^\$version /var/www/html/cacti/include/global.php # 2. 看看现有 SNMP Query 文件避免重名覆盖 ls -lh /var/www/html/cacti/resource/snmp_queries/ # 3. 备份数据库与资源目录这一步不能省 mysqldump -u root -p cacti /root/cacti_bak_$(date %F).sql tar czf /root/cacti_tpl_bak_$(date %F).tgz \ /var/www/html/cacti/resource \ /var/www/html/cacti/templates第一条命令确认系统里的 Cacti 大版本和模板 XML 里的cacti_version对照差一个大版本就要做心理准备可能得手工改 hash 或者走导入页面的兼容选项。第二条命令是防止 SNMP Query 同名覆盖Cacti 里同名 Query 文件会直接替换替换完了原来绑定的设备索引全断。第三条是后悔药真实环境我见过模板导入到一半库锁了最后只能整库回滚。后面的准备是解压模板包把所有 XML 放在/tmp/cacti_tpl/下先做一次静态检查确认每个文件都有name标签、没有明显截断。这一步纯属玄学防御但确实救过我一次——有个 XML 下载不完整导入脚本直接把主机模板名读成了空字符串。3.2 CLI 导入与图形模板的落地界面上可以点 Import Templates但设备一多我倾向用 CLI好处是能看输出、能写进部署脚本。Cacti 自带import_template.php参数不多但坑不少。cd /var/www/html/cacti/cli # 先导 SNMP Query 与数据模板再导图形模板 php import_template.php --filename/tmp/cacti_tpl/query_h3c_entity.xml --with-history php import_template.php --filename/tmp/cacti_tpl/data_h3c_cpu.xml --with-history php import_template.php --filename/tmp/cacti_tpl/graph_h3c_cpu.xml --with-history # 最后导主机模板它只是引用放最后最安全 php import_template.php --filename/tmp/cacti_tpl/host_h3c_switch.xml --with-history--filename支持相对路径和绝对路径我一般写绝对路径避免 cd 错目录导了个空。--with-history的作用是把这次导入记进模板历史表后面出问题能查到“这批图是谁什么时候导的”。这个参数不写也能导成功但一旦模板重名覆盖你就失去了追溯依据。导入完不要立刻绑设备先查库确认关联关系齐不齐。只看界面的话主机模板页显示的图形数量可能是缓存值不准。-- 看主机模板是否落地 SELECT id, name, hash FROM host_template WHERE name LIKE %H3C%; -- 看主机模板关联了几张图缺哪张一目了然 SELECT ht.name AS host_tpl, gt.name AS graph_tpl FROM host_template ht LEFT JOIN host_template_graph htg ON htg.host_template_id ht.id LEFT JOIN graph_templates gt ON gt.id htg.graph_template_id WHERE ht.name LIKE %H3C%;第二条 SQL 的左连接很关键如果某个graph_tpl是 NULL说明主机模板里引用了这张图但库里没有也就是前面说的静默跳过。这种缺失不会报错只会在绑设备之后表现为“少一张图”非常难查。还有一种情况是图形模板落地了但 Data Template 没落地。Cacti 在创建图形时会检查数据模板缺了会让整张图创建失败日志里只有一行WARNING: Data template not found。所以导完主机模板后再去Graph Templates页面把每张图点开看一眼能省掉后面一堆排查。3.3 添加设备、绑定模板与首轮轮询验证设备绑定这套模板用 CLI 比界面快尤其是几十台的时候。核心三步加设备、按模板建图、重建 SNMP 查询索引。cd /var/www/html/cacti/cli # 1. 添加设备--template 填 host_template 的 id php add_device.php \ --descriptionSW-Core-01 \ --ip10.0.0.11 \ --template12 \ --communitypublic \ --version2 # 2. 按主机模板批量建图--host-id 填上一步返回的设备 id php add_graphs.php --host-id15 --graph-typecg --graph-template-id88 # 3. 重建该设备的 SNMP 查询索引端口多的设备这步会慢 php poller_reindex_hosts.php --id15--template和--graph-template-id都是数字 id不是名字。id 从哪来前面那条 SQL 就能查host_template表里的 id 就是。--graph-typecg表示按图形模板建图如果是数据查询类的图要用--graph-typeds并带上查询名和索引两套参数不一样混用会报参数缺失。第三步的poller_reindex_hosts.php最容易漏。SNMP Query 类的图端口流量、温度实体依赖一张索引缓存表新增设备后不重建索引图建出来了但取不到数现象就是“图例有、曲线空”。设备端口多的时候这一步可能跑几分钟别以为卡死了就 CtrlC中断了索引表会半残。首轮验证要等一个完整 poller 周期默认 5 分钟。这期间不要手动改 rrd 文件、不要手动 update 数据造出来的数据会让后面的曲线一直有毛刺。验证看三个地方Devices 列表里设备状态是不是 Up、SNMP Cache 里能不能看到实体表内容、Graphs 里第一轮之后有没有数值。三处都正常才算这套模板在这台设备上真正跑通了。如果设备是 SNMP v3add_device.php的参数完全不同要传--version3 --authproto --authpass --privproto --privpass --username团体名参数--community会失效。CactiEZ 10.1 对 v3 的支持没问题但模板里的 SNMP Query 不区分版本取数方式由设备对象决定这一点不用改模板。注意批量加设备时不要并发跑add_device.phpCacti 的设备表有唯一索引并发容易撞Duplicate entry串行加、每台之间停一秒最稳。4. OID 校准CPU、内存、温度取不到数的修法4.1 用 snmpwalk 把真实 OID 采出来模板导入只是把“取数的壳子”装好真正的数值对不对取决于 OID 在你这台设备上是不是这条路。校准唯一可靠的办法是 snmpwalk直接问设备要数据再和模板里的路径对。# 先确认 SNMP 通不通看设备运行时间 snmpget -v2c -c public -Oqv 10.0.0.11 1.3.6.1.2.1.1.3.0 # 走 H3C 实体扩展表-On 输出数字 OID方便复制 snmpwalk -v2c -c public -On 10.0.0.11 1.3.6.1.4.1.25506.2.6.1.1.1.1.6 # 把实体索引和实体名对应起来图例才看得懂 snmpwalk -v2c -c public -On 10.0.0.11 1.3.6.1.2.1.47.1.1.1.1.7-Oqv只输出值、不输出 OID适合快速确认有没有数-On强制数字化输出OID 不会被翻译成 MIB 名复制进模板不会因为 MIB 没加载而失败。这两组参数我基本是条件反射在用。walk 出来之后要做一次“对齐”CPU 那条 walk 结果里有几个索引每个索引对应的实体名是什么模板里引用的 OID 前缀和 walk 出来的是不是一模一样如果 walk 有值、模板没值八成是模板里多写了一层或者少写了一层索引。比如设备返回...1.1.1.1.6.1模板写成...1.1.1.1.6是正常的前缀匹配但写成...1.1.1.6就永远取不到。如果 walk 直接 timeout先别怀疑模板查三件事设备 ACL 有没有放行 Cacti 服务器地址、团体名对不对、SNMP 版本和设备配置是否一致。这三件事查完还是不通再去看设备有没有配置snmp-agent community read之外的限制比如某些型号默认只允许读部分 MIB 视图。4.2 改数据模板类型、步长、最大值数值取到了但图形不对问题多半在 Data Template 的数据源类型上。Cacti 的数据源类型有四类常用GAUGE 表示瞬时值COUNTER 表示只增不减的计数器DERIVE 表示可增可减的差值ABSOLUTE 表示每次轮询后归零的计数。CPU 百分比、内存百分比、温度都是瞬时值选 GAUGE端口字节数是累计值选 COUNTER错包数也是 COUNTER。-- 查数据模板的类型1GAUGE 2COUNTER 3DERIVE 4ABSOLUTE SELECT id, name, data_source_type_id FROM data_template WHERE name LIKE %CPU% OR name LIKE %Mem%;如果 CPU 图恒为 0 或者恒为 100先看类型对不对再看设备返回的值是不是放大了 100 倍。很多厂商的 CPU OID 返回的是整数百分比但有的型号返回的是“百分比 × 100”这时候模板里需要一个 CDEF 做除法CDEF: cpu_percent value, 100, /CDEF 加在图形模板的图形项上不是加在数据模板上。加完之后要重建 poller 缓存让新表达式生效cd /var/www/html/cacti/cli php rebuild_poller_cache.phprebuild_poller_cache.php会按当前的数据模板和图形模板重新生成轮询缓存改完 OID、改完类型、改完 CDEF 都要跑一次。不跑的话下一个周期还是按老缓存取数你会以为改动没生效然后反复改最后把模板改乱。步长Step和心跳Heartbeat也在这层。默认步长 300 秒、心跳 600 秒意味着两次轮询间隔超过 600 秒RRD 就会认为数据断档图上出现空白。设备响应慢、poller 排队长的环境可以把心跳调到 900 甚至 1200代价是断档判断变迟钝。这个参数没有标准答案按自己环境的轮询耗时分布来定。4.3 端口流量走 64 位计数器端口流量图是这套模板里最容易翻车的一类。32 位计数器在千兆口上5 分钟轮询间隔内就可能回绕一次Cacti 拿到的新值比旧值小算出来是负流量图上出现向下的尖峰。解决办法是换成 64 位的高容量计数器指标32 位 OID64 位 OID入向字节1.3.6.1.2.1.2.2.1.101.3.6.1.2.1.31.1.1.1.6出向字节1.3.6.1.2.1.2.2.1.161.3.6.1.2.1.31.1.1.1.10端口速率1.3.6.1.2.1.2.2.1.51.3.6.1.2.1.31.1.1.1.15换成 64 位之后数据源类型要设成 COUNTER最大值要给足比如 100G 口就设100000000000。最大值设小了超过阈值的数据会被截断曲线上会出现平台期看着像限速其实是模板参数压的。SNMP Query 的 XML 里index_order决定图例顺序按ifDescr排最直观。有的设备ifDescr是空字符串图例就退化成索引数字这时候可以按ifName或ifAlias排具体看设备返回哪张表有值。snmp_query nameGet 64bit Interface Traffic/name oid1.3.6.1.2.1.31.1.1.1.6/oid index_orderifDescr/index_order index_order_typealphabetic/index_order_type /snmp_queryindex_order_type用 alphabetic 时图例按字母排用 numeric 时按索引数字排。端口命名规范的环境用 alphabetic 更好找端口名是纯数字的环境用 numeric避免字符串排序把 10 排在 2 前面。5. 常见问题与排查五类“图有了但没数”的现场记录5.1 导入时报模板 hash 冲突现象CLI 输出里出现Duplicate hash或界面红字提示模板已存在导入中断主机模板列表里没有新条目。原因模板 XML 里的hash节点是根据模板内容算出来的同一个包导过一次之后再导或者包里两个 XML 内容高度相似hash 就会撞。Cacti 用 hash 判重撞了就拒绝。解决导入页面把“检查 hash”的选项取消或者 CLI 导入前先把 XML 里的hash节点清空。生产库操作前先备份清空 hash 后重复导入同一模板会产生两份同名模板绑设备时容易绑错导完记得去模板列表删掉旧的那份。我一般会在测试库先导一遍确认无冲突再动生产。5.2 图形创建成功但全是 NaN现象Graphs 列表里图都在点开看只有坐标轴曲线区域空白鼠标悬停显示 NaN。原因三种可能——SNMP Query 索引没建、OID 在设备上 walk 不到、设备的 SNMP 根本不通。前两种都跟模板校准有关第三种是网络或权限问题。解决先snmpget确认设备可通再snmpwalk确认 OID 有值最后跑一次poller_reindex_hosts.php --idN重建索引。三件事做完还是 NaN去看/var/www/html/cacti/log/cacti.log搜SNMP not valid或WARNING日志里会写明是哪条数据源取数失败。日志级别不够的话把 Settings 里的 Log Level 临时调到 Medium排查完再调回去。5.3 CPU 曲线恒为 0 或恒为 100现象CPU 图是一条贴底的直线或者贴顶的直线设备实际负载明显不是这个数。原因常见的是 OID 返回值被放大了 100 倍而图形模板没做除法或者取的是单核值设备多核时单核跑满就显示 100整机其实才 20%。还有一种少见情况是模板取了错误的实体索引取到的是某块空槽位。解决先用snmpwalk看返回值范围再决定加不加 CDEF 除法。多核设备要在 SNMP Query 里只保留主控板实体或者用图形模板的聚合功能取平均。取错槽位的把index_order换成实体名人工核对哪几个索引是真实板卡。5.4 端口流量图出现负值和尖峰现象流量曲线突然掉到负值区域或者每隔一段时间出现一个极高的尖峰和实际业务量对不上。原因32 位计数器回绕新值小于旧值Cacti 按差值算就出负数设备重启或端口 down/up 导致计数器归零也会产生同样的现象。解决换成 64 位 OID数据源类型设 COUNTER最大值给足。已经产生的历史尖峰可以在图形模板里加 CDEF 做上限截断但那是遮丑根治还是换 OID。设备重启导致的归零没办法完全避免Cacti 本身有异常值丢弃机制把 Data Source 的“输出类型”保持默认别改成绝对值否则归零会被当成真实流量画出来。5.5 轮询超时导致整机断图现象某台设备的所有图在同一时间点集体断档之后又恢复日志里出现 poller 超时。原因模板给这台设备挂了全量端口查询几百个端口一次遍历单次轮询时间超过 5 分钟后面的设备排队poller 进程被拖死。解决先看 Settings → Poller 的并发进程数适当调大但别超过 CPU 核数再对端口多的设备做减法SNMP Query 只勾选在用的端口不要全量。poller_reindex_hosts.php跑一次看耗时超过 60 秒的设备就值得单独优化。还有一种做法是把这类设备拆到独立的 poller 进程组Cacti 支持多 poller配置成本高一点但隔离效果好。6. 进阶批量绑定与模板长期维护的一个习惯设备上到二三十台之后逐台点界面就不现实了。我的做法是维护一张 CSV字段是设备名、IP、主机模板 id、图形模板 id然后用一段循环把添加、建图、重建索引串起来。脚本不复杂关键是每一步都要能抓到失败。#!/bin/bash # devices.csv 格式: desc,ip,host_template_id,graph_template_id CACTI_CLI/var/www/html/cacti/cli SNMP_COMMUNITYpublic while IFS, read -r desc ip htpl gtpl; do [ -z $desc ] continue # 添加设备并从输出里抓设备 id out$(php $CACTI_CLI/add_device.php \ --description$desc --ip$ip \ --template$htpl --community$SNMP_COMMUNITY --version2 21) host_id$(echo $out | grep -oP id:\s*\K\d) if [ -z $host_id ]; then echo [FAIL] $desc $ip 添加失败: $out /tmp/cacti_batch.log continue fi # 按图形模板建图并重建索引 php $CACTI_CLI/add_graphs.php --host-id$host_id \ --graph-typecg --graph-template-id$gtpl php $CACTI_CLI/poller_reindex_hosts.php --id$host_id echo [OK] $desc $ip host_id$host_id /tmp/cacti_batch.log done devices.csvgrep -oP id:\s*\K\d是从add_device.php的返回文本里抠数字 idCacti 这个脚本不会返回结构化 JSON只能这么抓。抓不到就说明添加失败直接记日志跳过不要让后面的建图步骤拿空 id 去跑否则会建出一批野图。日志统一写一个文件跑完 grep 一遍[FAIL]就知道哪几台要手工补。模板维护这块我有个坚持了很多年的习惯每次改模板先在测试库里导入、绑一台测试设备、跑满两个 poller 周期确认没有 NaN 和负值再推到生产。模板是活的设备软件一升级私有 OID 就可能挪位置去年还能用的温度图今年可能就取不到数。与其等告警来了再翻 MIB不如把“导完先看两个周期”变成固定动作。希望帮到你。本文还有配套的精品资源点击获取