Condition in Templates

Hi everyone,

one simple question and sry for my english skills :slight_smile:

I have a playbook with some templates, in one template I added a condition to write a specific IP Address in my template.
(My servers have several network ports and unfortunately they have sometimes different names. Ok, i could use different templates but i wanted to use a single file)

The code:

{% if ansible_mgt.ipv4.address is defined %}
server_address={{ansible_mgt.ipv4.address}}
{% else %}
server_address={{ansible_eth0.ipv4.address}}
{% endif %}

If I run the playbook against a server which has not the network port ansible_mgt the playbook fails because the variable ansible_mgt.ipv4.address is not defined.

What I am doing wrong? Or it is not possible to check in a template if a variable is not defined?

Thanks for your help!

Regards,
Jost

Hi,

I guess, in that case not even ansible_mgt will be defined? What is exact error message (try ansible-playbook with -vvv) ?

David

Hi David,

the error message is:

fatal: [testserver.xxx] => {‘msg’: “AnsibleUndefinedVariable: One or more undefined variables: ‘ansible_mgt’ is undefined”, ‘failed’: True}
fatal: [testserver.xxx] => {‘msg’: “AnsibleUndefinedVariable: One or more undefined variables: ‘ansible_mgt’ is undefined”, ‘failed’: True}
FATAL: all hosts have already failed – aborting

Well, that is true. On this machine I have only ansible_eth0:

“ansible_eth0”: {
“active”: true,
“device”: “eth0”,
“ipv4”: {
“address”: “10.101.10.133”,
“netmask”: “255.255.255.0”,
“network”: “10.101.10.0”
},

My idea was to use the condition, if ansible_mgt is defined → use ansible_mgt and if not → ansible_eth0

Regards,
Jost

Hi Josh,

your idea is right:

{% if ansible_mgt is defined and ansible_mgt.ipv4.address is defined %}
server_address={{ansible_mgt.ipv4.address}}
{% else %}
server_address={{ansible_eth0.ipv4.address}}
{% endif %}

you have to check ansible_mgt first.

Hi David,

of course! thank you very much!

I didn’t recognized that the error message was only saying “ansible_mgt” and not “ansible_mgt.ipv4.address”…facepalm

Regards,
Jost