Question:
I have a host_var in ansible with dict with all interfaces:
1 2 3 4 5 6 7 8 9 10 11 12 |
--- 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 |
And I want to check if dict has a key vlan1 if ok put to template value vlan1.ip else put vlan2.ip.
1 2 3 4 5 6 7 |
{% if interfaces.vlan1 %} # and also I try {% if 'vlan1' in interfaces %} {{ interfaces.vlan1.ip }}; {% else %} {{ interfaces.vlan2.ip|default("127.0.0.1") }}; {% endif %}; |
But i have an error:
1 2 |
fatal: [127.0.0.1] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'vlan1'", 'failed': True} |
I found that it have to re work in Jinja2 but it seems to doesn’t work in ansible. Maybe someone have another way for solving this problem?
When I define vlan1 it works fine. Ansible version 1.9.2
I was trying to reproduce it in python and have no error if my dictionary have not key vlan1. thanks to @GUIDO
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> 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' |
Answer:
The answer is simple and it showed on ansible error message. First of all I need to check if var is defined.
1 2 3 4 5 6 |
{% if interfaces.vlan1 is defined %} {{ interfaces.vlan1.ip }} {% else %} {{ interfaces.vlan2.ip|default("127.0.3.1") }} {% endif %} |
This combination works well.