我想在嵌套数组的Jinja2模板中构建简单的if
逻辑。
首先,包括我的变量以供参考。
在YML中(来自host_vars):
interfaces:
- name: ae10
ipv4:
- address: 4.4.4.4
mask: 8
在JSON中(来自Ansible调试):
"interfaces": [
{
"ipv4": [
{
"address": "4.4.4.4",
"mask": 8
}
],
"name": "ae10"
}
],
我希望if
语句确保ipv4.address
和ipv4.mask
具有值。目前,我似乎能够做到的唯一方法是先映射嵌套数组,然后运行if语句。但是我想知道if
语句是否可以更早运行?就像甚至在for
循环开始之前一样?
{%for interface in interfaces%}
{%for ip in interface.ipv4%}
{% if ip.address and ip.mask%}
matched {{ip.address}}/{{ip.mask}} on {{interface.name}}
{% else %}
nothing matched
{% endif %}
{%endfor%}
{%endfor%}
这可能或不可能-而且我可能缺少一些愚蠢的东西。您的想法将不胜感激。
答案 0 :(得分:0)
问:“ if语句可以更早运行吗?就像在for循环开始之前一样?”
A:不可以。可以省略不符合条件的项目,创建新词典,然后处理新词典。
下面的任务正在循环中测试
- debug:
msg: "matched {{ item.1.address }}/{{ item.1.mask }} on {{ item.0.name }}"
loop: "{{ interfaces|subelements('ipv4') }}"
when:
- item.1.address is defined
- item.1.mask is defined
给予
"msg": "matched 4.4.4.4/8 on ae10"
也可以使用下面的模板来实现有条件的输出
{% for item in interfaces %}
{% for ip in item.ipv4 %}
{% if ip.address and ip.mask%}
matched {{ ip.address }}/{{ ip.mask }} on {{ item.name }}
{% else %}
nothing matched
{% endif %}
{% endfor %}
{% endfor %}