Ansible 在任务中使用register命令时,我可能遇到问题

Ansible 在任务中使用register命令时,我可能遇到问题,ansible,Ansible,我在同一个剧本中有两个相同的任务: when:var==“true” when:var==“false” 两个任务都在使用寄存器:result,但第一个任务失败,第二个任务成功 我尝试使用block:而不仅仅是当:时,行为是一样的 bug-when.yml 运行它的示例: ansible-playbook bug-when.yml -e var=true PLAY [localhost] ****************************************************

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

  • when:var==“true”
  • when:var==“false”
  • 两个任务都在使用
    寄存器:result
    ,但第一个任务失败,第二个任务成功

    我尝试使用
    block:
    而不仅仅是
    当:
    时,行为是一样的

    bug-when.yml

    运行它的示例:

    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
    
    运行它的第二个示例:

    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
    

    要扩展@b.enoit.be所说的内容:

    当您有这样的任务时:

    - name: some task
      debug:
        msg: this is an example
      when: false
      register: result
    
    这将更新
    结果
    ,即使任务被跳过。这是允许您在后续任务中查看此任务是否被跳过的原因:

    - name: check if task was skipped
      debug:
        msg: previous task was skipped
      when: result is skipped
    
    考虑在每个任务中注册不同的变量,然后:

    - 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 }}"
    

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

    因此,您需要做的是使用两个不同的寄存器句柄,并根据结果和它们的
    跳过属性来正确显示消息

    这是剧本:

    ---
    -主机:本地主机
    任务:
    -名称:when true
    调试:
    味精:“这是真的”
    寄存器:结果为真
    当:var==“true”
    -名称:当为false时
    调试:
    味精:“这是假的”
    寄存器:结果为假
    当:var==“false”
    -名称:打印结果
    调试:
    msg:“{result_为真,如果跳过result_为假,则跳过result_为假,否则result_为假}”
    
    以下是
    var为true时的运行

    $ 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为false时的结果

    $ 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  
    
    不用说:我猜你简化了你的问题,但你的游戏实际上可以简单到

    ---
    -主机:本地主机
    任务:
    -名称:打印结果
    调试:
    msg:“{{'这是真的',如果var==true,否则'这是假的'}”
    
    它运行:

    $ 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表达式问题供参考:

    你说的“第一个失败”是什么意思?它是如何失败的?是否有错误消息?发生这种情况的原因是,无论任务是否通过或跳过,任务始终被注册。因此,您的第一次试用无法在跳过的任务上打印结果。啊!你的
    被跳过了
    比我的
    结果好得多。跳过了定义和结果。跳过了
    ,kuddos
    $ 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