如何在Ansible Playbook中用关键链路列表过滤源链路列表?
Ansible过滤包含关键节点-接口对的链路条目
实现步骤
- 加载链路文件:将源链路和关键链路的YAML文件加载为Ansible变量
- 提取关键节点-接口配对:把关键链路中的每个节点与对应接口组合成元组,形成需要排查的集合
- 过滤源链路:遍历源链路列表,移除包含任意一个关键节点-接口对的条目
完整Playbook示例
--- - name: 过滤非关键链路 hosts: localhost gather_facts: false tasks: # 加载源链路文件(替换为你的源文件路径) - name: 加载源链路数据 include_vars: file: source_links.yaml name: source_links # 加载关键链路文件(替换为你的关键文件路径) - name: 加载关键链路数据 include_vars: file: essential_links.yaml name: essential_links # 提取所有关键节点与接口的配对元组 - name: 生成关键节点-接口对集合 set_fact: critical_pairs: > {{ essential_links.key2 | map('extract', ['nodes', 'interfaces']) | map('zip') | flatten | map('tuple') | list | unique }} # 过滤源链路,移除包含关键节点-接口对的条目 - name: 过滤非关键链路 set_fact: filtered_links: > {{ source_links.key2 | reject( lambda link: zip(link.nodes, link.interfaces) | map('tuple') | intersect(critical_pairs) | length > 0 ) | list }} # 验证过滤结果(可选) - name: 打印过滤后的链路 debug: var: filtered_links
代码解释
- 加载文件:使用
include_vars将YAML文件内容读取为变量,source_links和essential_links分别对应源链路和关键链路数据 - 生成关键配对:
map('extract', ['nodes', 'interfaces']):从每个关键链路条目中提取nodes和interfaces两个列表map('zip'):将每个链路的节点列表与接口列表一一配对,生成元组迭代器flatten:将所有链路的配对元组合并为一个列表map('tuple'):确保配对为不可变元组,方便后续集合操作unique:去重,避免重复检查相同的节点-接口对
- 过滤逻辑:
reject过滤器用于剔除符合条件的条目- 对于每个源链路条目,将其
nodes和interfaces配对后,与critical_pairs求交集;如果交集长度大于0,说明该条目包含关键节点-接口对,予以剔除
匹配规则说明
此逻辑会过滤掉任何包含至少一个关键节点-接口配对的源链路条目,完全匹配你给出的示例场景:只要源链路里存在ESSENTIAL_NODE + ESSENTIAL_interface这个组合,就会被过滤。
内容的提问来源于stack exchange,提问作者karl mueller
相关产品推荐
相关产品推荐

