CactiEZ 10.1国产交换机SNMP模板适配与流量图排障 简介这份模板合集面向使用 CactiEZ 10.1 做网络设备监控的运维人员汇集华为 S2300/S2700/S3700、S7703、S9000、S5700中兴 ZXR2609H3C AR2811、S2000 系列等交换机与路由器主机模板并补充 APC UPS、惠普网络打印机、海康威视硬盘录像机、Windows 主机及非 SNMP 设备等场景导入后即可快速生成监控项减少逐台手工配置。压缩包共 16 个文件以 15 个 xml 模板文件和 1 个 txt 说明为主整体约 314KB体积轻便、结构直接。上述模板可覆盖 CPU、内存、光功率、流量及打印机墨量等常用指标适合园区网、机房与中小型企业网络做设备上线和监控补全。已有 2059 人学习下载便于参考现成模板快速搭建较完整的监控体系。1. 从一台“图是平的”交换机说起CactiEZ 10.1 模板没对上的代价上周又被拉去看一台交换机的流量图接口列表全都齐了但曲线永远是零偶尔冒出一段 NaN。设备本身很健康SNMP 也能 walk 通。问题出在监控端CactiEZ 10.1 装好之后自带的是通用 SNMP 模板拿它去套华为、中兴、H3C 的接入层交换机接口索引、描述字段、计数器位宽经常对不上出的图要么空白要么把 1000M 口画成 100M 的刻度。CactiEZ 这类一体化镜像的好处是装完就能用坏处也在这很多人以为装完就等于监控跑起来了。这套环境最适合手里有几十台到几百台国产交换机、又不想自己从零编译 Cacti 的运维。装不好不会报错只会安静地出一堆废图等到真出事要回溯流量时才发现黑匣子是空的。下面从镜像落盘讲到出图验证中间该备份的备份、该改的参数一个不省。2. 装前把环境钉死CactiEZ 10.1 的镜像与设备侧前提装 CactiEZ 之前先想清楚一件事这是一台专门跑轮询的机器不是通用服务器。它的负载模型很固定每 5 分钟一轮所有工作压在磁盘 IO 和 PHP 进程上一旦磁盘慢、时钟飘图就会断断续续。所以环境清点不是走形式是决定后面出图质量的地基。2.1 镜像落盘与首次开机要清点的四件事CactiEZ 10.1 是整盘镜像不是安装包写入方式决定了它能不能起来。常见做法是用 dd 或者镜像写入工具直接写到 U 盘或系统盘写完之后目标盘的原有分区会被完全覆盖所以别拿一块还有数据的盘去试。我这边的习惯是单独找一块小容量 SSD写之前先拔掉机器上其他业务盘的数据线避免手滑选错设备名。写盘命令在 Linux 下就三行设备名一定要自己确认过再敲# 确认目标盘输出里能看到 U 盘容量和设备名比如 /dev/sdb lsblk -d -o NAME,SIZE,MODEL # 写入镜像of 必须是你确认过的目标设备写错就是整盘报废 sudo dd ifCactiEZ-10.1.iso of/dev/sdb bs4M statusprogress convfsync # 写完强制刷新缓存看到 sync 返回再拔盘 syncbs4M是块大小设太小写盘慢、太大对某些 U 盘反而掉速4M 是我在多数设备上验证过的稳妥值statusprogress让你能看见写入进度不然几十分钟的黑屏容易让人以为卡死convfsync保证 dd 结束后数据真正落到介质上跳过这一步经常出现写完拔盘起不来的情况。首次开机之后屏幕上会打印出管理地址和默认登录方式先别急着点下一步把这四件事清点一遍管理口 IP 是不是你要的网段、系统时区是不是 Asia/Shanghai、磁盘剩余空间够不够放几年 RRD 文件、以及能不能从监控服务器反向 ping 通所有待监控设备。第三项特别容易忽略一台交换机按 48 个口算每口两张图几百台设备的 RRD 目录很快就上到几十 G分区给小了后面迁移很麻烦。2.2 设备侧 SNMP 先打通再谈模板模板只是“怎么画”SNMP 才是“能不能画”。我见过太多人先在 Web 界面里加主机加完发现采集超时然后回头去查设备配置来回折腾半天。正确的顺序是先在被监控设备上把只读 SNMP 配好用 snmpwalk 在监控机上确认能取到接口表再去碰模板。监控机侧先装客户端工具验证命令长这样# 取接口描述表1.3.6.1.2.1.2.2.1.2 是标准 MIB-II 的 ifDescr snmpwalk -v2c -c monitor_ro 10.10.10.1 1.3.6.1.2.1.2.2.1.2 # 取接口别名很多国产设备把业务描述写在这里 snmpwalk -v2c -c monitor_ro 10.10.10.1 1.3.6.1.2.1.31.1.1.1.18 # 取 64 位高速计数器判断千兆口有没有走对 OID snmpwalk -v2c -c monitor_ro 10.10.10.1 1.3.6.1.2.1.31.1.1.1.6 | head -5-v2c指 SNMP 版本模板一般按 v2c 设计用 v1 会取不到 64 位计数器-c后面跟只读社区名建议不要用 public用带业务含义的名字方便日后审计最后那个数字 OID 比 MIB 名字可靠设备侧 MIB 不全会导致按名字 walk 直接报错。三条命令都返回数据才说明网络路径、访问控制、社区名三关都过了。提示先只在一台设备上打通把社区名、版本、访问控制列表确认好再批量下发到其余设备。一次改几十台出问题时很难定位是哪一层拦住了。2.3 模板文件怎么辨认主机模板、图模板、数据查询三件套拿到手的模板包通常是一堆 XML名字起得五花八门。真正决定能不能出图的是三件套数据查询Data Query负责把设备上的接口清单抓回来主机模板Host Template负责把一组图模板打包成“新建主机时勾一下就行”图模板Graph Template负责定义坐标轴、数据源和图例长什么样。三者缺一个导入过程可能不报错但加主机时你会发现根本挂不上。打开一个 XML 用编辑器看头部能快速判断类型# 只看前 40 行data_query、host_template、graph_template 三个标签是判型关键 head -40 huawei_switch_host_template.xml # 统计一个模板包里各类模板的数量心里先有数 grep -c host_template *.xml grep -c data_query *.xml grep -c graph_template *.xmlhash标签里的值决定 Cacti 认为它是不是“同一个模板”同名不同 hash 会被当成新模板重复导入这是后面出现一堆重名模板的根源。华为、中兴、H3C 三家的接口命名差别很大华为常见 GigabitEthernet0/0/1中兴可能带槽位号H3C 是 GigabitEthernet1/0/1 这种模板里的正则匹配如果写死了一种格式另外两家就抓不到接口。导入前先粗看一遍 XML 里的匹配规则比导完再改省事得多。2.4 时区、时间同步与轮询器Cacti 的图是按时间轴画的机器时间一飘数据点就会落在错误的槽位里表现出来就是图上出现断口或者台阶。装完第一件事是把时区和对时配好别指望它自己准。# 设置时区容器和物理机都适用 timedatectl set-timezone Asia/Shanghai # 开启对时并立即同步一次 timedatectl set-ntp true chronyc makestep # 确认偏差在秒级以内偏差大的话后面所有图都会错位 timedatectl status | grep -E Time zone|synchronizedset-ntp true只是打开服务开关真正让时间立刻对齐的是makestep它会强制把系统时间跳到正确值而不是慢慢校准。这一步在刚装完的机器上很关键因为镜像出厂时间可能偏差好几天不校准就直接开始采集第一批数据点会全部落在过去。轮询器选 spine 还是 cmd.php我的建议是设备超过 50 台就用 spine它是 C 写的多线程采集器同样一轮能把耗时压到 cmd.php 的三分之一以下。切换位置在控制台的设置里选完记得手动跑一次轮询确认新轮询器能正常退出# 手动触发一次轮询看退出码和耗时就够了 time php -q /var/www/html/cacti/poller.php --force # 轮询器日志在 cacti.log末尾几十行能看出有没有设备超时 tail -50 /var/www/html/cacti/log/cacti.log--force作用是忽略“还没到下一个 5 分钟”的判断强制跑一轮装机阶段用它验证配置很顺手time包一层是为了看耗时正常一轮几十台设备应该在十几秒内跑完跑到几分钟说明有设备在超时重试得先去处理那几台。3. 导入模板从 XML 到主机模板的三步落地模板导入本身不复杂复杂的是导入顺序和导入之后的绑定关系。很多人一次把十几个 XML 全丢进去界面刷刷刷提示成功回头加主机时却发现模板列表里只有一半或者图模板挂上去了但数据源全是“未采集”。原因基本都出在依赖关系和刷新机制上。3.1 导入前先给数据库留一颗后悔药Cacti 的导入操作是直接写数据库的没有撤销按钮。模板重复导入会生成一堆同名条目清理起来要一条条删关联比重新装还烦。所以每次导入前先做一次全库备份这是我最坚持的一个习惯。# 备份整库到带日期的文件路径选空间充足的分区 mysqldump -u root -p --single-transaction --routines cacti \ /root/backup/cacti_$(date %Y%m%d_%H%M).sql # 顺手记一下当前模板数量导入后对比就知道多了什么 mysql -u root -p -N -e \ select host_template, count(*) from cacti.host_template union all select graph_template, count(*) from cacti.graph_templates union all select data_query, count(*) from cacti.snmp_query;--single-transaction让备份在一个事务快照里完成不用锁表对还在跑轮询的生产机友好--routines把存储过程一起带上虽然 Cacti 用得不多但漏了恢复时会报错。第二条命令是个小技巧导入前后各跑一次数字对不上就知道哪类模板没进去比在界面里翻列表快得多。注意备份文件别放在系统盘根目录。模板导入失败时人容易慌一慌就容易在根分区上反复生成大文件最后把 Cacti 自己的 RRD 目录挤爆。3.2 用 Web 界面导入 XML 模板少量模板用界面导入最直观能看清每一步的提示。路径在控制台的导入导出菜单下选择模板导入上传文件后会先给你一个预览页列出这次会新增哪些、覆盖哪些、跳过哪些。这个预览页千万别一路点到底它是唯一能在写库之前发现问题的机会。界面导入有几个固定套路按顺序来基本不踩坑先导数据查询再导图模板最后导主机模板。原因是主机模板里引用了图模板的哈希图模板又引用了数据查询的哈希顺序反了会出现“引用的模板不存在”的提示。预览页如果显示某个模板状态是跳过多半是库里已经有同 hash 的条目先确认是不是之前导过。导入完成后立刻做一次数据查询刷新否则新主机加进来也拿不到接口列表# 列出所有数据查询及其最近一次执行状态 mysql -u root -p -e \ select id, name, last_run, next_run from cacti.snmp_query order by id; # last_run 为空说明从未执行过需要在界面里手动跑一次或等下一轮轮询last_run这个字段是最直接的判断依据为空就代表从没跑过。有些模板导入后默认把数据查询设成“手动执行”需要到设备主机页面里点一次刷新才会填充接口列表这一步漏掉的话图模板挂上去也是空图。3.3 命令行批量导入与预览模板多的时候用命令行更稳妥Cacti 自带导入脚本支持先预览再落库还能一次处理整个目录。我一般在界面导入失败、或者要把同一套模板铺到多台 Cacti 上时用这条路。# 先预览只解析不写库输出会列出将新增/跳过的条目 php -q /var/www/html/cacti/cli/import_package.php \ --filename/root/templates/huawei_host_template.xml --preview # 确认无误后正式导入去掉 --preview 即可 php -q /var/www/html/cacti/cli/import_package.php \ --filename/root/templates/huawei_host_template.xml # 批量导入整个目录脚本会按文件名顺序处理 for f in /root/templates/*.xml; do echo $f php -q /var/www/html/cacti/cli/import_package.php --filename$f done--preview是这条命令最值钱的参数它把解析结果打印出来但不落库能提前看到哈希冲突和缺失依赖--filename必须写绝对路径相对路径在不同工作目录下会解析失败。循环那段加 echo 是为了知道卡在哪个文件脚本对单个文件报错时不会中断整个循环日志里挨个对更清楚。导入完成后清一次 Cacti 的缓存让新模板在界面里立刻可见不然要等下一次页面缓存过期# 清理编译缓存和轮询器缓存不影响历史数据 rm -rf /var/www/html/cacti/include/themes/*/cache/* php -q /var/www/html/cacti/cli/rebuild_poller_cache.phprebuild_poller_cache.php会按当前所有数据源重建采集缓存导入新模板后跑一次能避免“图模板有了但采集项没注册”的错位。3.4 主机模板与数据查询的绑定检查导入成功不等于能用。主机模板里必须明确关联了数据查询并且勾上“更新 RRD 文件”否则新建主机时只会建出一堆空图。检查方法是在控制台的主机模板页面逐个打开看也可以在数据库里直接查关联表快得多。# 查主机模板关联了哪些数据查询以及是否开启 RRD 更新 mysql -u root -p -e \ select ht.id, ht.name, sq.name as data_query, htsq.data_query_id from cacti.host_template ht left join cacti.host_template_snmp_query htsq on htsq.host_template_id ht.id left join cacti.snmp_query sq on sq.id htsq.snmp_query_id order by ht.id;结果里data_query为空的行就是没绑数据查询的主机模板加进去的主机不会有接口级监控。这种模板通常只带 CPU、内存这类标量指标如果你要的是接口流量得手动在模板里勾上 SNMP 接口统计那一项。绑好之后还有一步新建主机时“创建图”的选项要选“按主机模板创建”勾选对应的图模板条目。见过不少人新建主机时选了空白模板然后抱怨没图实际上是创建阶段就没生成数据源。4. 按厂商配参数华为、中兴、H3C 的 SNMP 差异国产交换机的 SNMP 实现大体遵循标准 MIB-II但细节差异足够让模板失效。接口描述字段放的内容不一样、64 位计数器的支持程度不一样、有的把业务信息写在 ifAlias有的写在自定义 OID 里。模板是死的设备是活的中间这层对齐只能手工做。4.1 华为 VRP 的社区名与 trap 目标华为设备的 SNMP 配置在系统视图下v2c 只需要三行。社区名建议带业务前缀方便日后轮换时精确替换不要所有设备共用一个。system-view snmp-agent snmp-agent sys-info version v2c snmp-agent community read cipher Mon_ro_2024 acl 2000 snmp-agent target-host trap address udp-domain 10.10.10.100 params securityname Mon_ro_2024 v2c snmp-agent trap enablecommunity read表示只读权限后面跟cipher表示社区名以密文存储明文不会出现在配置文件里acl 2000是访问控制列表编号限制只有监控服务器能来取数据这条不加等于把设备暴露给整个网段。target-host那一行是给 trap 用的如果你只用轮询取数、不接收告警这行可以省掉。华为的接口描述在 ifAlias 里但接入层经常是空的模板里如果拿 ifAlias 当图例出来全是一串编号。我的做法是模板里优先用 ifDescr回退到 ifAlias两边都没有就用索引号图例丑一点但至少能对上人。4.2 中兴 ZXR10 的视图与 community 写法中兴的写法跟华为接近但关键字不同最容易被忽略的是视图那一层。社区名必须绑定到一个 MIB 视图没绑视图的话默认只能读到极少数节点表现出来就是 snmpwalk 有返回值但接口表空空如也。configure terminal snmp-server view AllView 1.3.6.1 included snmp-server community Mon_ro_2024 view AllView ro snmp-server host 10.10.10.100 version 2c Mon_ro_2024 snmp-server enable trapsnmp-server view AllView 1.3.6.1 included这行是核心1.3.6.1覆盖了整个 MIB 树included表示包含而不是排除。少这一行后面 community 绑不到视图取数范围就被限制在默认视图里了。ro就是只读别写成rw监控账号不需要写权限。中兴设备的接口索引在板卡插拔后可能重排这会导致历史图和新数据对不上图上表现为曲线中段突然跳到另一个量级。应对办法是在模板里给数据源加索引稳定性判断或者干脆按 ifName 做映射再出图。4.3 H3C Comware 的 v2c 配置与接口描述H3C 的配置习惯跟华为很像差异在 trap 那行的参数顺序上写错不会报错只是 trap 发不出来靠轮询又发现不了属于典型的静默失败。system-view snmp-agent snmp-agent sys-info version v2c snmp-agent community read Mon_ro_2024 acl 2000 snmp-agent target-host trap address udp-domain 10.10.10.100 udp-port 162 v2c securityname Mon_ro_2024 snmp-agent trap enable standardudp-port 162显式写出端口虽然默认就是 162但写出来能避免和其他配置混淆securityname要和前面 community 的名字完全一致大小写都算差一个字母 trap 就静默丢弃trap enable standard只开标准告警私有告警另开不开的话接口 up/down 这类关键事件收不到。H3C 的接口描述通常走 ifAlias配合description命令写入模板里读 1.3.6.1.2.1.31.1.1.1.18 就能拿到。如果设备上压根没配描述这个字段返回空字符串图例就会变成空白模板里得做兜底。4.4 三厂商参数对照表与 OID 取舍把三家的关键差异整理成一张表配模板的时候对着看比翻各家手册快。项目华为 VRP中兴 ZXR10H3C Comware社区名命令snmp-agent community read ciphersnmp-server community ... view ... rosnmp-agent community read是否必须绑视图否靠 ACL 控制是不绑视图取数受限否靠 ACL 控制接口描述主字段ifDescr 优先ifDescr 为主ifAlias 为主64 位计数器支持完整部分型号需确认支持完整trap 目标命令target-host ... params securitynamesnmp-server host ... version 2ctarget-host ... v2c securityname采集速率的 OID 也要挑对。标准接口表里的 32 位计数器在千兆及以上链路上会很快回绕一轮 5 分钟就可能溢出算出来的速率完全是错的。所以模板里统一指向 64 位那一组ifHCInOctets 1.3.6.1.2.1.31.1.1.1.6 入方向字节数64 位 ifHCOutOctets 1.3.6.1.2.1.31.1.1.1.10 出方向字节数64 位 ifHighSpeed 1.3.6.1.2.1.31.1.1.1.15 接口速率单位 Mbps ifAlias 1.3.6.1.2.1.31.1.1.1.18 接口描述 ifDescr 1.3.6.1.2.1.2.2.1.2 接口名称ifHighSpeed的单位是 Mbps而ifSpeed是 bps模板里算百分比的时候用错单位千兆口会被算成 1% 的利用率。这个坑我踩过一次图上曲线永远贴着底部查了半天以为是采集问题最后发现是除以了一个大了一千倍的数。5. 避坑与排查导进去不出图的六种情况模板相关的故障有个共同点界面几乎不报错。导入提示成功、主机添加成功、图也生成了就是不涨数。下面这些是我在几十台设备上反复遇到的按现象、原因、解决三段的顺序记下来下次遇到直接对号。5.1 六条踩坑记录现象一导入时提示哈希重复模板列表里出现两个同名项。原因多半是同一个模板导了两遍或者模板包里的 hash 与库里已有的某条记录撞了。解决办法是先在导入预览页确认哪些会被跳过已经重复的到模板列表里逐条核对引用关系保留引用多的那个另一个删掉之前先解绑主机。别直接删删了会导致引用它的主机数据源失效。现象二主机加进去图也出来了但图例全是“Interface - 1”“Interface - 2”。原因是模板里取描述用的 OID 与设备实际写入的字段不一致华为可能把业务名写在 ifDescrH3C 写在 ifAlias。解决方式是先 snmpwalk 两个 OID 各看一遍确认哪个有内容再在数据查询的模板里调整取值顺序或者用 Cacti 的字段重写规则做 fallback。现象三图上有线但一直是 NaN 或者直接空白。常见原因是轮询器权限不足spine 或 apache 用户对 RRD 目录没有写权限采集到了数据写不进文件。检查方式很简单跑一次手动轮询然后看日志里有没有 permission denied。解决是给 RRD 目录补齐属主和属组重启轮询器之后再跑一轮。现象四一台设备的图正常同类设备全是平的。这通常是那台“正常”的设备恰好支持模板里写的 OID其余型号不支持比如老款只实现了 32 位计数器。排查办法是拿 snmpwalk 单独取 64 位那几个 OID返回空就说明不支持得改回 32 位并接受回绕风险或者干脆只监控 up/down 状态。现象五接口拔插或者板卡重启之后历史图断成两截。原因是接口索引变了Cacti 按索引存数据源索引一变就被当作新接口。缓解办法是把数据源的重索引检测打开让 Cacti 定期比对接口列表根治要靠设备侧固定索引或者用接口名而不是索引做映射。现象六trap 收不到但轮询一切正常。十有八九是设备侧 trap 目标配置里的社区名和监控侧不一致或者中间有防火墙拦了 UDP 162。先在设备上看 trap 配置有没有生效再在监控机上抓包确认有没有包进来最后才对 Cacti 侧的接收配置顺序别乱。5.2 用 snmpwalk 和 cacti.log 定位排查时最有效的两个工具一个在外面一个在里面。外面用 snmpwalk 确认设备到底给不给数据里面用 cacti.log 确认 Cacti 到底有没有去取、取回来什么。两边的结论一对问题基本就锁定了。# 看 Cacti 里这台主机对应的采集项有没有超时记录 grep -i 10.10.10.1 /var/www/html/cacti/log/cacti.log | tail -30 # 手动跑一轮并把输出打到屏幕能直接看到每台设备的耗时和返回 php -q /var/www/html/cacti/poller.php --force --debug 21 | head -80 # 确认 RRD 文件最近一次写入时间时间不对说明采集根本没落到文件 rrdtool last /var/www/html/cacti/rra/设备名_traffic_in_id.rrd第一条命令里的 IP 换成你在查的设备日志里出现 timeout 或者 SNMP error 就说明卡在采集层跟模板无关第二条的--debug会打印每个数据源的取值过程比看汇总日志细得多第三条的rrdtool last返回的是 Unix 时间戳和当前时间差超过十分钟就说明这台设备的数据源没有在更新。还有一个小技巧用rrdtool fetch看最近几个数据点的实际数值比看图更准# 取最近 20 个数据点的平均值全是 NaN 就是采集没通 rrdtool fetch /var/www/html/cacti/rra/设备名_traffic_in_id.rrd AVERAGE -s -20min6. 验证跑通三台设备各出一张能看的流量图模板导完、主机加完最后一步是把“看起来有图”变成“确认图是对的”。我的验证顺序是固定三步先手工跑一轮轮询看耗时再用 rrdtool 看原始数据点最后拿设备侧的实际流量做一次交叉核对。跳过任何一步都可能把一张画得很好看但数值全错的图交上去。第一步手动跑轮询重点看耗时和错误数# 强制跑一轮记录总耗时同时统计日志里本轮的错误条数 time php -q /var/www/html/cacti/poller.php --force grep -c ERROR /var/www/html/cacti/log/cacti.log # 换 spine 再跑一次做对比正常情况下应该明显更快 time /usr/local/spine/bin/spine --conf/etc/spine.conf几十台设备一轮在十几秒内完成是正常区间跑过一分钟就要去查是哪几台在超时重试。错误条数为零不代表万事大吉但非零一定要逐条看多数是社区名或 ACL 的问题。第二步看 RRD 文件里是不是真的写进了有效数值。这一步比看网页图表可靠因为网页有缓存# 取最近 10 分钟的平均值输出里应该能看到具体的速率数字而不是全 NaN rrdtool fetch /var/www/html/cacti/rra/huawei_sw01_traffic_in_1234.rrd AVERAGE -s -10min # 顺便确认文件修改时间在最近五分钟内说明还在持续写入 stat -c %y %n /var/www/html/cacti/rra/huawei_sw01_traffic_in_1234.rrd第三步交叉核对。挑一台设备用设备侧的命令看接口计数隔三十秒再看一次两次差值除以时间就是真实速率和图上同一时间段的读数比一下数量级一致就算通过。三家设备的接口统计命令略有差别但都支持查看接口收发字节数这一步必须登设备做不能拿另一套监控系统的数据糊弄自己。验证通过的标准我总结成一张小表三个厂商各挑一台跑一遍全部满足再批量铺开验证项通过标准不通过时先查轮询耗时单轮在预期区间内无持续超时设备可达性、ACL、社区名RRD 时间戳最近五分钟内有更新目录权限、轮询器配置数据点数值非 NaN与设备实测量级一致OID 选型、速率单位图例可读能看出接口名称或业务描述ifDescr / ifAlias 取值规则断点情况连续三段无断口时钟同步、超时重试有一次我图省事只看了网页上曲线在动就认为成了第二天业务反馈某条链路的峰值被削平了一大截回头一查是模板里用了 32 位计数器千兆口在两轮之间已经回绕了两次。从那以后我每次上完新模板都强制走一遍 rrdtool 取值加设备侧差值的交叉核对宁可多花二十分钟也不给后面留一个查不出来的坑。希望帮到你。本文还有配套的精品资源点击获取