I have a playbook, and in one of the templates I need to walk over all the hosts in certain groups grabbing their hostvars etc.
In template I have:
{% for host in groups['nova'] %}
{% set myvars=hostvars[host] %}
<service name="nova" type="compute" disabled="False" description="" order="1">
<user name="{{ myvars.service_user }}" password="{{ myvars.service_user_password }}" email="{{ myvars.service_user_email }}"/>
<mysql user="{{ myvars.service_mysql_user }}" password="{{ myvars.service_mysql_user_password }}"/>
<host name="{{ host }}"/>
<endpoint>
<address type="admin" host="{{ myvars.service_admin_ip }}" uri_suff=":$(compute_port)s/v1.1/$(tenant_id)s" />
<address type="public" host="{{ myvars.service_public_ip }}" uri_suff=":$(compute_port)s/v1.1/$(tenant_id)s"/>
<address type="internal" host="{{ myvars.service_internal_ip }}" uri_suff=":$(compute_port)s/v1.1/$(tenant_id)s"/>
</endpoint>
<region name="{{ myvars.service_region }}"/>
</service>
{% endfor %}
in group_vars/nova.yml I have:
...
service_admin_ip: 192.168.0.138
service_public_ip: "{{ ansible_default_ipv4.address }}"
service_internal_ip: "{{ ansible_default_ipv4.address }}"
service_region: RegionOne
...
so as a result I get:
<service name="nova" type="compute" disabled="False" description="" order="1">
<mysql user="nova" password="nova"/>
<host name="192.168.0.138"/>
<endpoint>
<address type="admin" host="192.168.0.138" uri_suff=":$(compute_port)s/v1.1/$(tenant_id)s" />
<address type="public" host="{{ansible_default_ipv4.address}}" uri_suff=":$(compute_port)s/v1.1/$(tenant_id)s"/>
<address type="internal" host="{{ansible_default_ipv4.address}}" uri_suff=":$(compute_port)s/v1.1/$(tenant_id)s"/>
</endpoint>
<region name="RegionOne"/>
Note that service_public_ip did not get resolved as expected (even though facts were collected for that host already), and service_admin_ip works fine when I hardcode it and don't use facts. Is there a way to get around this issue? I do not want to drop ansible_default_ipv4 stuff into the role's playbook but prefer to keep it "configurable" with some sane default (default_ipv4). What am I missing in this?
P.S.
I have some other plays where group_vars/all.yml defines vars in similar fashion (referencing some of the facts) and those work just fine.