我试图根据另一个文件中变量的存在将某些变量写入配置文件。
本质上,我有以下内容:
[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变量时才写入这些变量。
答案 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"
]