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