当变量具有默认值时,Ansible 剧本条件失败
Ansible playbook condition fails when variable has a default value
给定以下剧本 (deployment.yml
):
---
- name: Debug
hosts: applicationservers
tasks:
- debug: msg="{{add_host_entries | default('false')}}"
- debug: msg="{{add_host_entries | default('false') == 'true'}}"
- debug: msg="Add host entries = {{add_host_entries | default('false') == 'true'}}"
- include: add_host_entries.yml
when: add_host_entries | default('false') == 'true'
包含 add_host_entries.yml
的条件总是失败,即使上述所有调试消息都打印某种 true
(我知道在第一条调试消息中它是一个字符串,而另一个两个结果为布尔值)。
当我省略默认值的部分时,add_host_entries.yml
会被执行:
when: add_host_entries
虽然我需要这个默认值行为,因为它是一个可选值,只在特定阶段设置。
其他尝试(未成功)
括号
when: (add_host_entries | default('false')) == 'true'
转换为布尔值
when: add_host_entries|default('false')|bool
其他来源和信息
这里是重现问题所需的所有资源。
add_host_entries.yml
---
- name: add_host_entries
hosts: applicationservers
gather_facts: false
tasks:
- debug: msg="Add Host Entries"
inventory
[applicationservers]
127.0.0.1
[all:vars]
add_host_entries=true
打电话
markus@lubuntu:~/foobar$ ansible-playbook deployment.yml -i inventory
版本
markus@lubuntu:~/foobar$ ansible --version
ansible 2.1.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
markus@lubuntu:~/foobar$ ansible-playbook --version
ansible-playbook 2.1.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
您尝试有条件地包含 剧本。请参阅我的 关于不同包含类型的回答。
事实是,这仅在定义变量时有效在 Ansible 解析您的剧本之前。
但是您尝试将 add_host_entries
定义为主机级事实(组变量)——这些变量在解析时尚未定义。
如果您使用 -e add_host_entries=true
调用您的剧本,您的条件将按预期工作,因为在解析时已知额外变量。
用bool
将add_host_entries
的字符串值转换成布尔值,条件就成立了。
---
- name: Debug
hosts: applicationservers
tasks:
- debug: msg="{{add_host_entries | default('false')}}"
- debug: msg="{{add_host_entries | default('false') == 'true'}}"
- debug: msg="Add host entries = {{add_host_entries | default('false') == 'true'}}"
- include: add_host_entries.yml
when: add_host_entries | default('false') | bool
给定以下剧本 (deployment.yml
):
---
- name: Debug
hosts: applicationservers
tasks:
- debug: msg="{{add_host_entries | default('false')}}"
- debug: msg="{{add_host_entries | default('false') == 'true'}}"
- debug: msg="Add host entries = {{add_host_entries | default('false') == 'true'}}"
- include: add_host_entries.yml
when: add_host_entries | default('false') == 'true'
包含 add_host_entries.yml
的条件总是失败,即使上述所有调试消息都打印某种 true
(我知道在第一条调试消息中它是一个字符串,而另一个两个结果为布尔值)。
当我省略默认值的部分时,add_host_entries.yml
会被执行:
when: add_host_entries
虽然我需要这个默认值行为,因为它是一个可选值,只在特定阶段设置。
其他尝试(未成功)
括号
when: (add_host_entries | default('false')) == 'true'
转换为布尔值
when: add_host_entries|default('false')|bool
其他来源和信息
这里是重现问题所需的所有资源。
add_host_entries.yml
---
- name: add_host_entries
hosts: applicationservers
gather_facts: false
tasks:
- debug: msg="Add Host Entries"
inventory
[applicationservers]
127.0.0.1
[all:vars]
add_host_entries=true
打电话
markus@lubuntu:~/foobar$ ansible-playbook deployment.yml -i inventory
版本
markus@lubuntu:~/foobar$ ansible --version
ansible 2.1.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
markus@lubuntu:~/foobar$ ansible-playbook --version
ansible-playbook 2.1.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
您尝试有条件地包含 剧本。请参阅我的
事实是,这仅在定义变量时有效在 Ansible 解析您的剧本之前。
但是您尝试将 add_host_entries
定义为主机级事实(组变量)——这些变量在解析时尚未定义。
如果您使用 -e add_host_entries=true
调用您的剧本,您的条件将按预期工作,因为在解析时已知额外变量。
用bool
将add_host_entries
的字符串值转换成布尔值,条件就成立了。
---
- name: Debug
hosts: applicationservers
tasks:
- debug: msg="{{add_host_entries | default('false')}}"
- debug: msg="{{add_host_entries | default('false') == 'true'}}"
- debug: msg="Add host entries = {{add_host_entries | default('false') == 'true'}}"
- include: add_host_entries.yml
when: add_host_entries | default('false') | bool