如何在YANG中建模无键嵌套列表配置数据
解决YANG中无键列表嵌套的问题
我完全懂你的困扰——YANG的规则就是这么“死板”,配置列表必须指定键,但你的原配置里的ACL规则就是无键的有序列表,直接建模的话总会多出不必要的字段。结合你的ACL场景,给你几个实用的解决方案:
1. 用隐式位置索引作为键(最适配复杂规则场景)
既然YANG必须要键,那我们可以加一个自动生成的位置索引作为规则列表的键,同时通过工具层的转换让用户完全感知不到它的存在。
比如你的YANG模型可以这么写:
module acl-config { namespace "urn:example:acl"; prefix acl; import inet { prefix inet; } container acls { // 顶层ACL列表,用名称作为键(匹配你的用户命名ACL) list acl { key "name"; leaf name { type string; description "User-defined ACL name (e.g., acl1, acl2)"; } // 规则列表,用位置索引作为隐式键 list rule { key "position"; ordered-by user; // 强制保持用户配置的规则顺序,不自动排序 leaf position { type uint32; description "Auto-generated index for rule ordering (hidden from user)"; } // 你的规则字段,比如源地址、动作 leaf source { type inet:ip-prefix; description "Source IP prefix for the rule"; } leaf action { type enumeration { enum permit; enum deny; } description "Action to take for matching traffic"; } } } } }
怎么落地?
- 导入原配置时,让工具自动给每个规则分配递增的
position值(比如第一个规则是1,第二个是2),用户不需要手动输入。 - 导出配置时,过滤掉
position字段,让用户看到的还是无键的规则列表。 ordered-by user保证规则的顺序和用户配置的完全一致,不会被YANG工具重新排序。
2. 用leaf-list(适合简单规则场景)
如果你的ACL规则只是单一值(比如一串规则字符串、单个IP),完全可以用leaf-list替代list——它天生就是有序的无键列表,不需要指定键,完美匹配你的需求。
示例模型:
module acl-config { namespace "urn:example:acl"; prefix acl; container acls { list acl { key "name"; leaf name { type string; } // 用leaf-list代替无键list,适合简单规则 leaf-list rule { type string; ordered-by user; description "Simple ACL rule strings"; } } } }
这种方案不需要任何额外的键字段,直接就能映射你的无键规则列表,缺点是只能支持单一值的规则,没法处理复杂结构的规则(比如同时有源地址和动作的情况)。
为什么会出现额外字段?
你提到的“有效数据文件有YANG要求但原配置没有的额外字段”,本质就是YANG强制列表必须有键,而你的原配置没有对应字段,所以模型生成的数据会自动补上这个键字段。用上面的两种方案,要么用不需要键的leaf-list,要么把键字段做成自动生成且隐藏的,就能解决这个问题。
内容的提问来源于stack exchange,提问作者alshaboti




