如何将SNMP视图配置数据格式化为指定YAML结构?
通用SNMP View配置转YAML的格式化思路
这里给你一套通用的转换方法,不管配置条目数量、对象名是否带特殊格式都能适用:
1. 先拆解每条配置的固定结构
所有snmp-server view开头的配置,都遵循固定前缀 + 视图名 + 配置内容的统一结构:
- 固定前缀:
snmp-server view(注意末尾有个空格,别漏了) - 视图名:前缀之后的第一个连续字符串(直到遇到第一个空格为止)
- 配置内容:视图名之后的所有剩余文本(也就是
<OID/对象名> <included/excluded>的完整内容,哪怕对象名带空格也没关系)
举个例子:
- 原配置行:
snmp-server view DenyAll iso excluded→ 去掉前缀后是DenyAll iso excluded→ 视图名DenyAll,配置内容iso excluded - 如果遇到带空格的对象名:
snmp-server view MyView "System Description" included→ 去掉前缀后是MyView "System Description" included→ 视图名MyView,配置内容"System Description" included
2. 按视图名聚合配置项
遍历所有配置行,把同一个视图名对应的所有配置内容收集到一个列表里:
- 像你的示例里
Cust_View有两条配置,就收集成["interfaces included", "ifMIB included"] - 哪怕某个视图只有一条配置,也建议统一用列表存储(比单独用字符串更通用,后续新增配置直接追加就行,不用改格式)
3. 逐层构建YAML嵌套结构
按照YAML的层级规则从顶往下搭建:
- 最外层根键是
snmp-server - 根键下嵌套
view子键,用来存放所有视图的配置集合 - 每个视图名作为
view下的子键,对应的值就是刚才聚合好的配置内容列表
用你的示例按这个思路转换,最终的YAML会是:
snmp-server: view: Cust_View: - "interfaces included" - "ifMIB included" DenyAll: - "iso excluded" iso_view: - "iso included"
(如果一定要和你给出的示例一样,单条配置用字符串而非列表,可以加个小判断:当聚合的列表长度为1时,把列表转为字符串;但统一用列表的方式更通用,不用额外做判断逻辑)
4. 特殊场景的处理技巧
如果遇到对象名包含空格、引号这类特殊格式的配置,绝对不要用"按空格拆分所有元素"的方法,而是用截断固定前缀的方式来拆分:
- 先把每条配置的固定前缀
snmp-server view完整去掉 - 找到剩余文本里的第一个空格位置,把空格前的内容作为视图名,空格后的所有内容直接作为配置内容(保留原有的格式,比如引号)
这样就能完美适配各种复杂的对象名格式。
内容的提问来源于stack exchange,提问作者Ryan




