首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较存储在寄存器中的输出

如何比较存储在寄存器中的输出
EN

Stack Overflow用户
提问于 2021-08-10 08:20:57
回答 1查看 299关注 0票数 0

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

第一输出:

代码语言:javascript
复制
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

第二输出:

代码语言:javascript
复制
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 

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

我正在考虑通过逻辑(第一个输出的长度-第二个输出的1 ==长度-2)来完成这个任务,但是我不确定如何将它转换成一个ansible剧本。非常感谢您的建议和意见,以实现这一目标。

EN

回答 1

Stack Overflow用户

发布于 2021-08-10 09:16:16

给定分别存储在变量reg1和reg2中的已注册输出,将reg1.splitlines()行拆分。通常,注册的输出存储在属性stdout中,属性stdout_lines保持自动拆分行。用任何对你更方便的东西。

选择节点

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

给出

代码语言:javascript
复制
  msg:
  - calico-node-24dfv
  - calico-node-432fv
  - calico-node-4kvnd
  - calico-node-6dvcr
  - calico-node-8ldmw

可以使用相同的过滤器从第二寄存器中选择节点。当您有两个列表时,请使用筛选器差异来比较这些项。

代码语言:javascript
复制
    - 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 }}"

提供空列表,因为节点列表是相同的。

代码语言:javascript
复制
  msg: []

您可以在此条件下使用此列表的长度。

代码语言:javascript
复制
    - 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 }}"

给出

代码语言:javascript
复制
  msg: PASSED

如果您想要比较行数,那么只有下面的任务才能完成任务。

代码语言:javascript
复制
    - debug:
        msg: PASSED
      when: (reg1.splitlines()|length - 1) ==
            (reg2.splitlines()|length - 2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68723289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档