Jinja2-如果条件和嵌套数组

时间:2019-08-11 11:34:12

标签: arrays if-statement ansible jinja2

我想在嵌套数组的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.addressipv4.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%}

这可能或不可能-而且我可能缺少一些愚蠢的东西。您的想法将不胜感激。

1 个答案:

答案 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 %}