Как лучше установить новую переменную списка с помощью декартовых произведений нескольких списков в Ansible? - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь объединить данные из разных переменных в новый список. Я использовал комбинацию декартовых произведений и фильтров map / join.

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

1 Ответ

0 голосов
/ 07 ноября 2019

Q: «Лучший способ для меня собрать список / данные?»

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 }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...