使用Ansible中多个列表的笛卡尔乘积设置新列表变量的更好方法是什么?

使用Ansible中多个列表的笛卡尔乘积设置新列表变量的更好方法是什么?,ansible,Ansible,我正在尝试将来自不同变量的数据合并到一个新列表中。我使用了笛卡尔积和映射/连接过滤器的组合 --- - name: Debug hosts: localhost gather_facts: no vars: uid: 'uid1' product_types: - product1 - product2 - product3 data_types: - {data_name: data1, data_por

我正在尝试将来自不同变量的数据合并到一个新列表中。我使用了笛卡尔积和映射/连接过滤器的组合

---
- name: Debug
  hosts: localhost
  gather_facts: no

  vars:
    uid: 'uid1'

    product_types:
      - product1
      - product2
      - product3

    data_types:
      - {data_name: data1, data_port: 111}
      - {data_name: data2, data_port: 222}
      - {data_name: data3, data_port: 333}

  tasks:
    - set_fact:
        test_list: "{{ test_list | default([]) + ([item.data_name] | product(product_types) | map('join', '-') | product([uid]) | map('join', '-') | product([item.data_port]) | map('join', '_') | product(['pool']) | map('join', '_') | list) }}"
      loop: "{{ data_types }}"

    - debug: msg="{{ test_list | to_nice_yaml }}"
新列表显示了正确的输出,但我想知道是否有更好的方法来组合列表/数据

$ ansible-playbook playbooks/test.yaml
Vault password:

PLAY [Debug] ************************************************************************************************************************************************************

TASK [debug] ************************************************************************************************************************************************************
ok: [localhost] => (item={'data_name': 'data1', 'data_port': 111}) => {}
$ ansible-playbook playbooks/test.yaml

PLAY [Debug] ************************************************************************************************************************************************************

TASK [set_fact] *********************************************************************************************************************************************************
ok: [localhost] => (item={'data_name': 'data1', 'data_port': 111})
ok: [localhost] => (item={'data_name': 'data2', 'data_port': 222})
ok: [localhost] => (item={'data_name': 'data3', 'data_port': 333})

TASK [debug] ************************************************************************************************************************************************************
ok: [localhost] => {}

MSG:

- data1-product1-uid1_111_pool
- data1-product2-uid1_111_pool
- data1-product3-uid1_111_pool
- data2-product1-uid1_222_pool
- data2-product2-uid1_222_pool
- data2-product3-uid1_222_pool
- data3-product1-uid1_333_pool
- data3-product2-uid1_333_pool
- data3-product3-uid1_333_pool



PLAY RECAP **************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
问:“对我来说,组装列表/数据的更好方法是什么?”

A:不,很好。格式化可以提高可读性

- set_fact:
    test_list: "{{ test_list|default([]) +
                   [item.data_name]|
                   product(product_types)|map('join', '-')|
                   product([uid])|map('join', '-')|
                   product([item.data_port])|map('join', '_')|
                   product(['pool'])|map('join', '_')|
                   list }}"
  loop: "{{ data_types }}"
问:“对我来说,组装列表/数据的更好方法是什么?”

A:不,很好。格式化可以提高可读性

- set_fact:
    test_list: "{{ test_list|default([]) +
                   [item.data_name]|
                   product(product_types)|map('join', '-')|
                   product([uid])|map('join', '-')|
                   product([item.data_port])|map('join', '_')|
                   product(['pool'])|map('join', '_')|
                   list }}"
  loop: "{{ data_types }}"