Yes, this is pretty easy to achieve with the right set of filters applied to the special variable hostvars.
The set of filter we want to apply are:
dict2items so we can make a list of the hostvars dictionary in order to filter on it
selectattr in order to filter the nodes that are in a specific, with another special variables, groups
- And finally a
map to extract one attribute from each dictionary into a simple list
So, we end up with those variables:
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| map(attribute='value.vhost_ip')
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| map(attribute='value.vhost_ip')
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| map(attribute='value.vhost_ip')
}}
As for the more complex requirement, you can use a json_query and a JMESPath query.
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
Given the playbook:
- hosts: all
gather_facts: no
tasks:
- debug:
msg:
application_ips: "{{ application_ips }}"
database_ips: "{{ database_ips }}"
management_ips: "{{ management_ips }}"
vars:
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| map(attribute="value.vhost_ip")
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| map(attribute="value.vhost_ip")
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| map(attribute="value.vhost_ip")
}}
run_once: true
delegate_to: localhost
- debug:
msg:
application_ips: "{{ application_ips }}"
database_ips: "{{ database_ips }}"
management_ips: "{{ management_ips }}"
vars:
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
run_once: true
delegate_to: localhost
This yields:
TASK [debug] ******************************************************
ok: [node2 -> localhost] =>
msg:
application_ips:
- 10.0.2.1
- 10.0.2.2
database_ips:
- 10.0.1.1
- 10.0.1.2
management_ips:
- 10.0.0.1
TASK [debug] ******************************************************
ok: [node2 -> localhost] =>
msg:
application_ips:
- ip: 10.0.2.1
name: app-1
- ip: 10.0.2.2
name: app-2
database_ips:
- ip: 10.0.1.1
name: db-1
- ip: 10.0.1.2
name: db-2
management_ips:
- ip: 10.0.0.1
name: management-1