In my environment i have a group_vars structure something like the 
following:
[global:children]
datacenter1


[datacenter1:children]
network_zone1
network_zone2


[network_zone1]
server1


[network_zone2]
server2


so using a simple case where I want to add entries to /etc/hosts (although 
there are other use cases, this just seemed the simplest to demonstrate)
I want to be able to set group_vars within each group that get 
merged/appended together for processing by my role.  However 
since the default ansible behavior is not to merge and I don't really want 
to change the default.
therefore I was thinking about doing something like this:

[global:vars]
linux_hosts_entries_global:
  - { ip: 123.124.125.125, names: [backup_server]} 


[datacenter1:vars]
linux_hosts_entries_dc1:
  - { ip: 123.124.125.126, names: [dc1_server]} 


[network_zone1:vars]
linux_hosts_entries_z1:
  - { ip: 123.124.125.125, names: [z1_server]}


Then I could do something like below to loop through the variables to get a 
merged list.   
- name: "debug2"
  debug:
    msg: "value is: {{ lookup('vars', item) }} "
  loop: "{{ hostvars[inventory_hostname] | select('match', 
'^linux_hosts_entries') |list  }}"


or in the case of a template, you could do something like this:
{% set linux_hosts_merged_entries =  hostvars[inventory_hostname] | select(
'match', '^linux_hosts_entries') |list %}
{% for groupvar_name in linux_hosts_merged_entries %}
  {% set host_entries = lookup('vars', groupvar_name) %}
  {% for host_entry in host_entries %}
{{ host_entry.ip }} {{ host_entry.names | join(' ') }}
  {% endfor %}
{% endfor %}


I was wondering how others are handling similar use cases?  is there a 
simpler solution?
This strategy seems to work quite well.

I am aware of combine/union filters, however these require that you know 
the names of the variables ahead of time.  I like that in this model I can 
add additional variables later without affecting the existing setup.

I also created a PR to simplify further by adding regex support 
<https://github.com/ansible/ansible/pull/51466> to the lookup vars plugin.

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/e04a6e1f-4edc-4e0c-9660-26ff8c8ebd8f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to