先来看一段ansible代码:
- name: test
hosts: localhost
gather_facts: no
vars:
test_name: 'real_name'
flag: false
tasks:
- name: retrieve node's hostname
shell: "hostname"
register: test_name
when: flag | bool
- debug:
var: test_name
正常来说,我们认为会输出结果会是’real_name’,因为第一个任务因为when的条件判断并没有执行
但是,结果是什么呢?
ansible-playbook 1.yaml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [test] *************************************************************************************************************************************************************************
TASK [retrieve node's hostname] *****************************************************************************************************************************************************
skipping: [localhost]
TASK [debug] ************************************************************************************************************************************************************************
ok: [localhost] => {
"test_name": {
"changed": false,
"skip_reason": "Conditional result was False",
"skipped": true
}
}
PLAY RECAP **************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
并没有,难道是skip了?其实并没有skip, 而是第一个task的register讲test_name的值赋值成了如下三行:
“changed”: false,
“skip_reason”: “Conditional result was False”,
“skipped”: true
也就是说,尽快when的条件没有判断成功,但是register还会工作
具体的变通办法参见