Ansible / Jinja2-如何编写jinja if语句来查询是否定义了变量?

时间:2019-04-16 18:48:42

标签: ansible jinja2

我试图根据另一个文件中变量的存在将某些变量写入配置文件。

本质上,我有以下内容:

[servers]
server-0 ansible_host=192.168.1.11 zone=0 sriov=true
server-1 ansible_host=192.168.1.12 zone=1 sriov=true

我正在尝试以下操作:

{% if groups['servers'] | map('extract', hostvars) | selectattr('sriov', 'defined') %}
[pci]
....
{% endif %}

这在sriov=true时工作正常,但在以下情况下也可以添加变量:

[servers]
server-0 ansible_host=192.168.1.11 zone=0
server-1 ansible_host=192.168.1.12 zone=1

什么是正确的语法,以确保仅在定义sriov变量时才写入这些变量。

1 个答案:

答案 0 :(得分:1)

下面的表达式返回要在map()中使用的选择器列表

msg: groups['servers'] | map('extract', hostvars) | selectattr('sriov', 'defined')

不进行评估,该表达式将返回类似

的内容
"msg": "<generator object select_or_reject at 0x7f52f65cfe60>"

我不知道如何将其转换为布尔值。

如果使用map()

msg: "{{ groups['test_jails']|map('extract', hostvars)|selectattr('sriov', 'defined')|map(attribute='inventory_hostname')|list }}"

缺少“ sriov ”属性会给出:

"msg": []

如果定义了“ sriov ”属性

[test_jails]
test_01 sriov=true
test_02 sriov=false
test_03 sriov=true

结果是

"msg": [
    "test_01", 
    "test_02", 
    "test_03"
]

Ansible: filter a list by its attributes中有很多提示。