Thanks, your first answer is exactly what I was looking for. :-)
On Monday, February 7, 2022 at 2:32:38 AM UTC+1 [email protected] wrote:
> This produces the list you want:
>
> ---
> - name: Extracting a list of values of a field within a list of dictionaries
> when a key matches another list of values
> hosts:
> - localhost
> strategy: debug
> tasks:
> - name: Extract a list of values of a field within a list of dictionaries
> when a key matches another list of values
> set_fact:
> db_used_ports: |
> {% set ports=[] %}
> {% for dd0 in domain_definition %}
> {% set db_servers_names=dd0.db_servers|default([]) %}
> {% for dd1 in domain_definition %}
> {% if dd1['name'] in db_servers_names %}
> {% set _ = ports.append(dd1.port) %}
> {% endif %}
> {% endfor %}
> {% endfor %}{{ ports }}"
> vars:
> domain_definition:
> - name: server11
> cluster: cluster1
> db_servers:
> - server12
> - server21
> port: '8080'
> - name: server12
> cluster: cluster1
> db_servers:
> - server22
> port: '8090'
> - name: server13
> cluster: cluster1
> port: '8091'
> - name: server21
> cluster: cluster2
> db_servers:
> - server12
> - server22
> port: '9080'
> - name: server22
> cluster: cluster2
> port: '9090'
>
> - name: Show the extracted ports
> debug:
> msg: "{{ db_used_ports }}"
>
> On 2/5/22 9:56 AM, jean-christophe manciot wrote:
>
> Let's assume the following fictional list of dictionaries:
> domain_definition:
> - name: server11
> cluster: cluster1
> db_servers:
> - server12
> - server21
> port: '8080'
> - name: server12
> cluster: cluster1
> db_servers:
> - server22
> port: '8090'
> - name: server13
> cluster: cluster1
> port: '8091'
> - name: server21
> cluster: cluster2
> db_servers:
> - server12
> - server22
> port: '9080'
> - name: server22
> cluster: cluster2
> port: '9090'
> The goal is to list all ports of used 'db_servers', so the expected list
> is:
> - '8090'
> - '9080'
> - '9090'
> - '8090'
> - '9090'
>
> The *constraint* is to use one (some operation is performed for each
> item) and only one loop (the list is huge in reality).
>
> The following does not work because selectattr expects a value, not a list
> of values:
> - name: Extracting a list of values of a field within a list of
> dictionaries when a key matches another list of values
> hosts:
> - localhost
> strategy: debug
> tasks:
> - name: Extracting a list of values of a field within a
> list of dictionaries when a key matches another list of values
> vars:
> domain_definition:
> - name: server11
> cluster: cluster1
> db_servers:
> - server12
> - server21
> port: '8080'
> - name: server12
> cluster: cluster1
> db_servers:
> - server22
> port: '8090'
> - name: server13
> cluster: cluster1
> port: '8091'
> - name: server21
> cluster: cluster2
> db_servers:
> - server12
> - server22
> port: '9080'
> - name: server22
> cluster: cluster2
> port: '9090'
> db_servers_names: "{{ item.db_servers |
> default([]) |
> list }}"
> db_servers_used_ports: "{{ domain_definition |
> selectattr('name',
> 'eq', db_servers_names) |
> map(attribute=
> 'port') |
> list }}"
> debug:
> msg:
> - "db_servers_names: {{
> db_servers_names }}"
> - "db_servers_used_ports: {{
> db_servers_used_ports }}"
> loop: "{{ domain_definition }}"
>
> Any suggestion?
>
>
--
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 view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/f74e094b-e6e0-4fbe-8d33-2f1a88b2dbedn%40googlegroups.com.