У меня есть набор списков, таких как здесь, хотя внутренние данные могут быть любого уровня сложности (возможно, строки, возможно, словари, возможно, многослойный вложенный сложный объект).
my_dict:
my_list_a:
- a
- b
- c
my_list_b:
- a
- d
- e
list_c:
- f
my_combined_list:
- a
- b
- c
- a
- d
- e
- f
К сожалению, поскольку о понимании списков не может быть и речи из-за отсутствия поддержки в Jinja, мне пока не удалось собрать решение воедино.
Есть также некоторые дополнительные вещи, которые мне нужно сделать, хотя большинство из них легко выполнимо в окончательном списке (дедупликация, сортировка и т. д.). Во время присоединения необходимо сделать следующее:
select или reject на основе теста (например, включать только списки, начинающиеся со строки: my_ означает, что list_c не добавляется к конечному результату)Я нашел много способов создания списка диктовок или различных более сложных особых случаев, но, похоже, я ничего не могу найти о составлении списка всех внутренних элементов списка списков элементов.






Вопрос: Сведите внутренние элементы в список.
О: Самый простой вариант
my_combined_list: "{{ my_dict.values() | flatten }}"
дает
my_combined_list: [a, b, c, a, d, e, f]
Вопрос: Выберите или отклоните на основе теста (начальная строка: my_, например, list_c опущен).
О: Например, используйте тест совпадение
allow_match: [my_]
my_combined_list: "{{ my_dict | dict2items |
selectattr('key', 'match', allow_match|join('|')) |
map(attribute='value') | flatten }}"
дает
my_combined_list: [a, b, c, a, d, e]
Example of a complete playbook for testing
- hosts: localhost
vars:
my_dict:
my_list_a: [a, b, c]
my_list_b: [a, d, e]
list_c: [f]
my_combined_list: "{{ my_dict.values() | flatten }}"
allow_match: [my_]
my_combined_lis2: "{{ my_dict | dict2items |
selectattr('key', 'match', allow_match|join('|')) |
map(attribute='value') | flatten }}"
tasks:
- debug:
var: my_combined_list | to_yaml
- debug:
var: my_combined_lis2 | to_yaml