我创建了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),但不确定如何将其转换为一个可见的剧本。非常感谢您的建议和意见,以实现这一目标。
给定存储在变量reg1和reg2中的注册输出,拆分行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)