Vérifier si une clé existe dans un dict en Jinja2 modèle sur ansible
J'ai un host_var dans ansible avec dict avec toutes les 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
Et je veux vérifier si dict a une clé vlan1 si ok mettre à valeur de modèle vlan1.ip autre mis 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 %};
Mais j'ai une erreur:
fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True}
Je trouvé qu'il faut être travailler dans Jinja2 mais il semble qu'il ne fonctionne pas dans l'ansible. Peut-être que quelqu'un ait une autre façon de résoudre ce problème?
Quand je définis vlan1 il fonctionne très bien. Ansible la version 1.9.2
J'ai essayé de le reproduire en python et n'ont pas d'erreur si mon dictionnaire n'ont pas de clé vlan1. grâce à @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'
OriginalL'auteur Alex | 2015-10-28
Vous devez vous connecter pour publier un commentaire.
La réponse est simple et elle a montré sur ansible message d'erreur. Tout d'abord j'ai besoin de vérifier si var est définie.
Cette combinaison fonctionne bien.
is defined
partie est cruciale. je n'ai pas été en mesure de faire laif
logique de travail avec l'aide de{% if item.var %}
Le {% si l'élément.var %} vérifie uniquement si var n'est pas Null, et si elle n'est pas définie, qui génèrent une erreur. Si vous avez besoin de toutes les vérifications de l'utiliser conjointement {% si l'élément.var est définie et l'élément.var %}
OriginalL'auteur
La meilleure façon de vérifier si une clé existe dans un dictionnaire (en tout Jinja2 contexte, et pas seulement avec Ansible) est d'utiliser la
in
de l'opérateur, par exemple:fatal: [127.0.0.1] => {'msg': 'AnsibleUndefinedVariable: One or more undefined variables: float object has no element 0', 'failed': True}
Peut-être
vlan2
est pas disponible? Je pourrais aider plus si vous pouviez poster un playbook qui reproduit le problème spécifique.host_var vous pouvez le voir dans la question. playbook est simple rôle:
- name: Configure named.conf.options template: src=named.conf.options.j2 dest=/etc/bind/named.conf.options backup=yes owner=root group=bind mode=0644 become: yes tags: bind notify: restart bind
Dans le nom.conf.des options.j2-je utiliser jinja modèle comme décrit ci-dessus.OriginalL'auteur