Подтвердить что ты не робот

Проверьте, существует ли ключ в dict в шаблоне Jinja2 на недоступном

У меня есть host_var в недоступном с dict со всеми интерфейсами:

---
interfaces:
  vlan0:
    ip: 127.0.0.1
    mask: 255.255.255.0
    state: true

  vlan2:
    ip: 127.0.1.1
    mask: 255.255.255.0
    state: true

И я хочу проверить, имеет ли dict ключ vlan1, если ok помещен в значение шаблона vlan1.ip else put vlan2.ip.

{% if interfaces.vlan1 %} 
# and also I try {% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip }};
{% else %}
{{ interfaces.vlan2.ip|default("127.0.0.1") }};
{% endif %};

Но у меня есть ошибка:

fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True}

I нашел, что он должен работать в Jinja2, но, похоже, он не работает в недоступном. Может быть, у кого-то есть другой способ решить эту проблему?  Когда я определяю vlan1, он отлично работает. Нескончаемая версия 1.9.2

Я пытался воспроизвести его на python и не имел ошибки, если в моем словаре нет ключа vlan1. благодаря @GUIDO

>>> from jinja2 import Template
>>> b = Template("""
... {% if interfaces.vlan1 %}
... {{ interfaces.vlan1.ip }}
... {% else %}
... {{ interfaces.vlan2.ip|default("127.0.3.1") }}
... {% endif %}""")
>>> b.render(interfaces={'vlan3':{'ip':'127.0.1.1'},'vlan2':{'ip':'127.0.2.1'}})
u'\n\n127.0.2.1\n'
>>> b.render(interfaces={'vlan1':{'ip':'127.0.1.1'},'vlan2':{'ip':'127.0.2.1'}})
u'\n\n127.0.1.1\n'
4b9b3361

Ответ 1

Ответ прост, и он показал сообщение об ошибке. Прежде всего, мне нужно проверить, определен ли var.

{% if interfaces.vlan1 is defined %}
{{ interfaces.vlan1.ip }}
{% else %}
{{ interfaces.vlan2.ip|default("127.0.3.1") }}
{% endif %}

Эта комбинация работает хорошо.

Ответ 2

Лучший способ проверить, существует ли ключ в словаре (в любом контексте Jinja2, а не только с Ansible), заключается в использовании оператора in, например:

{% if 'vlan1' in interfaces %}
{{ interfaces.vlan1.ip |default(interfaces.vlan2.ip) }};
{% endif %}