klucz istnieje Mam host_var w ansibla z dict ze wszystkimi interfejsami:Sprawdź, czy w dict w Jinja2 szablonu na ansibla
---
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
I chcę, aby sprawdzić, czy DICT odgrywa kluczową VLAN1 jeśli ok put do wartości szablonu vlan1.ip jeszcze raz wstawiono 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 %};
ale mam błąd:
fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True}
I found że to musi być praca w Jinja2 ale wydaje się, nie działa w ansibla. Może ktoś ma inny sposób na rozwiązanie tego problemu? Po zdefiniowaniu vlan1 działa poprawnie. Answer version 1.9.2
Próbowałem odtworzyć go w python i nie mam błędu, jeśli mój słownik nie ma klucza vlan1. Dzięki @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'
wydaje się, że część "jest zdefiniowana" ma kluczowe znaczenie. nie byłem w stanie zrobić logiki 'if' przy użyciu' {% if item.var%} ' –
@RyanTuck {% if item.var%} sprawdza tylko jeśli var nie ma wartości Null i jeśli jest nie zdefiniowany, który powoduje błąd. Jeśli potrzebujesz wszystkich kontroli, użyj go razem {% jeśli zdefiniowano item.var i item.var%} – Alex