如何使用ansible比较存储在寄存器中的输出



我创建了2个任务来获取以下2个输出:

第一输出:

NAME                                      STATUS    ROLES   AGE     VERSION
calico-node-432fv                         Ready    master   146d      v1.18
calico-node-24dfv                         Ready    master   146d      v1.18
calico-node-4kvnd                         Ready    master   146d      v1.18
calico-node-6dvcr                         Ready    worker   146d      v1.18
calico-node-8ldmw                         Ready    worker   146d      v1.18

第二输出:

Transaction ID: xxxx-xxxx-xxxxx-xxxxxx
bootstrap.xx.xxx.xxx.com
calico-node-432fv        
calico-node-24dfv                        
calico-node-4kvnd                         
calico-node-6dvcr                         
calico-node-8ldmw 

现在,如果NAME(来自第一个输出,意味着仅来自第一列的节点)与第二个输出匹配,我如何比较上面存储在寄存器中的2个输出并打印PASSED?注意:我们需要忽略第二个输出

中的前两行我正在考虑通过逻辑(第一个输出的长度-1 ==第二个输出的长度-2),但不确定如何将其转换为一个可见的剧本。非常感谢您的建议和意见,以实现这一目标。

给定存储在变量reg1reg2中的注册输出,拆分行reg1.splitlines()。通常,注册的输出存储在属性stdout中,属性stdout_lines保持自动分割行。

你想用什么就用什么。选择节点

- debug:
msg: "{{ l1 }}"
vars:
l1: "{{ reg1.splitlines()|
select('match', '^calico-node-.*$')|
map('regex_replace', '^(.*?) (.*)$', '\1')|
sort }}"

msg:
- calico-node-24dfv
- calico-node-432fv
- calico-node-4kvnd
- calico-node-6dvcr
- calico-node-8ldmw

相同的过滤器可用于从第二个寄存器中选择节点。当你有两个列表时,使用过滤器symmetric_difference来比较条目,例如

- debug:
msg: "{{ l1|symmetric_difference(l2) }}"
vars:
l1: "{{ reg1.splitlines()|
select('match', '^calico-node-.*$')|
map('regex_replace', '^(.*?) (.*)$', '\1')|
sort }}"
l2: "{{ reg2.splitlines()|
select('match', '^calico-node-.*$')|
map('regex_replace', '^(.*?) (.*)$', '\1')|
sort }}"

给出空列表,因为节点列表是相同的

msg: []

可以在下列条件中使用此列表的长度,例如

- debug:
msg: PASSED
when: l1|symmetric_difference(l2)|length == 0
vars:
l1: "{{ reg1.splitlines()|
select('match', '^calico-node-.*$')|
map('regex_replace', '^(.*?) (.*)$', '\1')|
sort }}"
l2: "{{ reg2.splitlines()|
select('match', '^calico-node-.*$')|
map('regex_replace', '^(.*?) (.*)$', '\1')|
sort }}"

msg: PASSED

如果您想比较只有下面的任务执行任务的行数

- debug:
msg: PASSED
when: (reg1.splitlines()|length - 1) ==
(reg2.splitlines()|length - 2)

最新更新