当变量具有默认值时,Ansible playbook条件失败

时间:2016-11-29 10:42:37

标签: ansible ansible-playbook ansible-2.x

鉴于以下剧本(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

2 个答案:

答案 0 :(得分:4)

您尝试有条件地包含 playbook 。请参阅我的other答案,了解不同的包含类型。

问题是,这仅适用于变量定义之前 Ansible解析您的剧本。
但是您尝试将add_host_entries定义为主机级事实(组变量) - 这些变量在解析时尚未定义。

如果您使用-e add_host_entries=true调用您的剧本,您的情况将按预期工作,因为在分析时间内会知道额外的字符。

答案 1 :(得分:0)

使用booladd_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