首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在任务中使用“时”命令时,我使用了“注册表”命令。

在任务中使用“时”命令时,我使用了“注册表”命令。
EN

Stack Overflow用户
提问于 2019-05-09 19:40:10
回答 2查看 4.2K关注 0票数 1

我在同一本剧本中有两项相同的任务:

  1. when: var == "true"
  2. when: var == "false"

这两个任务都在使用register: result,但第一个任务失败,第二个任务成功。

我试着使用block:,而不仅仅是when:,其行为也是一样的。

bug-when.yml

代码语言:javascript
复制
---

- hosts: localhost
  tasks:
    - name: when true
      debug:
        msg: "this is true"
      register: result
      when: var == "true"

     - name: when false
       debug:
         msg: "this is false"
       register: result
       when: var == "false"

     - name: print result
       debug:
         msg: "{{ result }}"

运行它的示例:

代码语言:javascript
复制
ansible-playbook bug-when.yml -e var=true


PLAY [localhost] ***************************************************************

TASK [setup] *******************************************************************
Thursday 09 May 2019  18:51:35 +0000 (0:00:02.018)       0:00:02.018 **********
ok: [localhost]

TASK [when true] ***************************************************************
Thursday 09 May 2019  18:51:35 +0000 (0:00:00.437)       0:00:02.456 **********
ok: [localhost] => {
    "msg": "this is true"
}

TASK [when false] **************************************************************
Thursday 09 May 2019  18:51:35 +0000 (0:00:00.027)       0:00:02.483 **********
skipping: [localhost]

TASK [print result] ************************************************************
Thursday 09 May 2019  18:51:36 +0000 (0:00:00.023)       0:00:02.506 **********
ok: [localhost] => {
    "msg": {
        "changed": false,
        "skip_reason": "Conditional check failed",
        "skipped": true
    }
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0

第二个运行它的示例:

代码语言:javascript
复制
ansible-playbook bug-when.yml -e var=false


PLAY [localhost] ***************************************************************

TASK [setup] *******************************************************************
Thursday 09 May 2019  18:52:01 +0000 (0:00:02.019)       0:00:02.019 **********
ok: [localhost]

TASK [when true] ***************************************************************
Thursday 09 May 2019  18:52:01 +0000 (0:00:00.453)       0:00:02.472 **********
skipping: [localhost]

TASK [when false] **************************************************************
Thursday 09 May 2019  18:52:01 +0000 (0:00:00.024)       0:00:02.497 **********
ok: [localhost] => {
    "msg": "this is false"
}

TASK [print result] ************************************************************
Thursday 09 May 2019  18:52:02 +0000 (0:00:00.028)       0:00:02.525 **********
ok: [localhost] => {
    "msg": {
        "changed": false,
        "msg": "this is false"
    }
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-09 20:30:47

为了进一步阐述@b.enoit.be所说的话:

当您有这样的任务时:

代码语言:javascript
复制
- name: some task
  debug:
    msg: this is an example
  when: false
  register: result

这将更新result ,即使该任务被跳过。这允许您在随后的任务中查看是否跳过此任务:

代码语言:javascript
复制
- name: check if task was skipped
  debug:
    msg: previous task was skipped
  when: result is skipped

考虑在每个任务中注册一个不同的变量,然后:

代码语言:javascript
复制
- name: when true
  debug:
    msg: "this is true"
  register: result1
  when: var == "true"

 - name: when false
   debug:
     msg: "this is false"
   register: result2
   when: var == "false"

 - name: print result
   debug:
     msg: "{{ result1.msg if result2 is skipped else result2.msg }}"
票数 4
EN

Stack Overflow用户

发布于 2019-05-09 20:33:06

您在这里看到的行为之所以发生,主要是因为任务总是被注册,主要是因为您可以自引用任务寄存器本身,而且如果任务本身并不总是注册任务,则此行为将失败。

因此,您需要做的是拥有两个不同的寄存器句柄,并对其结果和skipped属性进行操作,以正确地显示您的消息。

这是剧本:

代码语言:javascript
复制
---
- hosts: localhost
  tasks:
    - name: when true
      debug:
        msg: "this is true"
      register: result_is_true
      when: var == "true"

    - name: when false
      debug:
        msg: "this is false"
      register: result_is_false
      when: var == "false"

    - name: print result
      debug:
        msg: "{{ result_is_true if result_is_false is skipped else result_is_false }}"

下面是运行var is true时的运行

代码语言:javascript
复制
$ ansible-playbook so.yml -e var=true

PLAY [localhost] *******************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [host1]

TASK [when true] *******************************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": "this is true"
}

TASK [when false] ******************************************************************************************************************************************************************************************
skipping: [host1]

TASK [print result] ****************************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": {
        "changed": false,
        "failed": false,
        "msg": "this is true"
    }
}

PLAY RECAP *************************************************************************************************************************************************************************************************
host1                      : ok=3    changed=0    unreachable=0    failed=0  

下面是var is false的结果

代码语言:javascript
复制
$ ansible-playbook so.yml -e var=false

PLAY [localhost] *******************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [host1]

TASK [when true] *******************************************************************************************************************************************************************************************
skipping: [host1]

TASK [when false] ******************************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": "this is false"
}

TASK [print result] ****************************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": {
        "changed": false,
        "failed": false,
        "msg": "this is false"
    }
}

PLAY RECAP *************************************************************************************************************************************************************************************************
host1                      : ok=3    changed=0    unreachable=0    failed=0  

不用说:我猜你把你的问题简化为MCVE,但你的游戏实际上可以像

代码语言:javascript
复制
---
- hosts: localhost
  tasks:
    - name: print result
      debug:
        msg: "{{ 'this is true' if var == true else 'this is false' }}"

它的运行:

代码语言:javascript
复制
$ ansible-playbook so.yml -e var=false

PLAY [localhost] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************************
ok: [host1]


TASK [print result] ********************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": "this is false"
}

PLAY RECAP *****************************************************************************************************************************************************************************************
host1                      : ok=2    changed=0    unreachable=0    failed=0   


$ ansible-playbook so.yml -e var=true

PLAY [localhost] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************************

ok: [host1]

TASK [print result] ********************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": "this is true"
}

PLAY RECAP *****************************************************************************************************************************************************************************************
host1                      : ok=2    changed=0    unreachable=0    failed=0  

这里有一个jinja内联if-表达式问题:https://stackoverflow.com/a/14215034/2123530

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56066503

复制
相关文章

相似问题

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