variable filters python templates dictionary jinja2 ansible

python - filters - Compruebe si la clave existe en un dict en la plantilla Jinja2 en ansible



filters ansible (2)

La mejor manera de verificar si existe una clave en un diccionario (en cualquier contexto Jinja2, no solo con Ansible) es usar el operador in , por ejemplo:

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

Tengo un host_var en ansible con dict con todas las interfaces:

--- 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

Y quiero comprobar si dict tiene una clave vlan1 si está bien poner el valor de plantilla vlan1.ip o poner 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 %};

Pero tengo un error:

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

found que tiene que ser un trabajo en Jinja2 pero parece que no funciona en ansible. Tal vez alguien tiene otra manera de resolver este problema? Cuando defino vlan1 funciona bien. Versión ansible 1.9.2

Estaba intentando reproducirlo en python y no tengo ningún error si mi diccionario no tiene la clave vlan1 . gracias a @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''


La respuesta es simple y se muestra en un mensaje de error ansible. En primer lugar tengo que comprobar si var está definido.

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

Esta combinación funciona bien.