Excerpts from Matt Coddington's message of 2014-03-25 14:15:18 -0400:
> > > {% for host in groups['uat4-webapp']|sort %}
> > > BalancerMember ajp://{{ hostvars[host].webapp_ip }}:8009 loadfactor=20
> > > {% endfor %}
> > >
> > > The "webapp_ip" variable is calculated like this in a group_vars file:
> > >
> > > webapp_ip: "{{ ansible_eth0.ipv4.address }}"
> > {{ hostvars[host].ansible_eth0.ipv4.address }}
> That's what i was afraid of... you're correct that explicitly referencing
> those does work, and I can do this in the template by having different
> cases for the different sets of servers (e.g. "if prod, use
> ansible_bond0.ipv4.address, if staging use ansible_eth0.ipv4.address,
> etc"). I was just hoping there was a way to abstract that if/then logic
> into a common variable outside the template.
Idea, untested:
In your template:
{% for host in groups['uat-webapp']|sort %}
BalancerMember ajp://{{ hostvars[host][hostvars[host][webapp_iface]].ipv4.address }}
{% endfor %}
In your group_vars file:
webapp_iface: "ansible_bond0"
Or what have you.
Or this might work:
Leave your template as is, and try putting in your group_vars file:
webapp_ip: "{{ hostvars[inventory_hostname].ansible_eth0.ipv4.address }}"
Also, you might want to look into setting your own facts, as those are
per-host.
--
Morgan Hamill