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.

Reply via email to