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 }}"