如何在Ansible中对比register存储的输出并校验节点名一致性
Ansible 校验两类calico节点列表匹配方案
前置假设
你执行的两个采集任务已经分别将输出注册到对应变量:
- 第一类calico节点列表输出存储在变量
calico_node_raw - 第二类基线节点列表输出存储在变量
baseline_node_raw
完整playbook实现
--- - name: 校验calico节点列表与基线一致 hosts: localhost gather_facts: no vars: # 此处变量值可替换为你实际任务register的输出 calico_node_raw: "{{ lookup('file', 'calico_output.txt') }}" baseline_node_raw: "{{ lookup('file', 'baseline_output.txt') }}" tasks: # 处理第一类输出:提取NAME列节点名 - name: 解析calico节点列表 set_fact: calico_nodes: "{{ calico_node_raw.splitlines()[1:] | map('split') | map('first') | map('trim') | sort }}" # 处理第二类输出:跳过前两行提取节点名 - name: 解析基线节点列表 set_fact: baseline_nodes: "{{ baseline_node_raw.splitlines()[2:] | map('trim') | select('string') | sort }}" # 校验匹配性 - name: 校验节点列表完全匹配 assert: that: - calico_nodes | length == baseline_nodes | length - calico_nodes == baseline_nodes success_msg: "PASSED" fail_msg: "FAILED: 节点列表长度不一致或内容不匹配"
核心逻辑说明
- 第一类输出处理:
- 用
splitlines()将多行字符串转换为行列表 - 下标
[1:]跳过第一行表头 - 逐行按空白分割后取第一个元素,得到NAME列的节点名,去除首尾空白后排序
- 用
- 第二类输出处理:
- 用
splitlines()转换为行列表后下标[2:]跳过前两行无用内容 - 逐行去除首尾空白,过滤空行后排序
- 用
- 校验逻辑同时包含了你原本设想的行数校验,以及节点名内容的精确匹配,排序处理可以避免两类输出节点顺序不一致导致的误判。
内容的提问来源于stack exchange,提问作者devops
相关产品推荐
相关产品推荐

