Ansible - 连接/展平列表字典

问题描述 投票:0回答:1

我有一个列表字典,例如这里,尽管内部数据可以是任何复杂程度(也许是字符串,也许是字典,也许是多层嵌套的复杂对象)。

my_dict:
  my_list_a:
    - a
    - b
    - c
  my_list_b:
    - a
    - d
    - e
  list_c:
    - f
  1. 如何通过 jinja2 展平此结构/将内部项目加入到以下格式的列表中(在我当前的用例中,保留顺序对我来说并不重要,但在可能的情况下总是很好)。
my_combined_list:
  - a
  - b
  - c
  - a
  - d
  - e
  - f

不幸的是,由于 Jinja 缺乏支持,列表推导式无法实现,到目前为止我还无法拼凑出解决方案。

我还需要做一些额外的事情,尽管大多数事情在最终列表中都很容易完成(去重、排序等)。加入期间需要做的事情是:

  1. select
    reject
    基于测试(例如,仅包含以字符串开头的列表:my_ 意味着 list_c 不会添加到最终结果中)

我已经找到了许多用于字典列表或各种更复杂的特殊情况的方法,但我似乎找不到任何关于创建项目列表字典的所有内部项目的列表的信息。

python ansible jinja2 devops
1个回答
2
投票

问:将内部项目展平为列表。

A:最简单的选择是

my_combined_list: "{{ my_dict.values() | flatten }}"

给予

my_combined_list: [a, b, c, a, d, e, f]

问:根据测试选择或拒绝(起始字符串:my_,例如省略list_c)。

A:例如,使用测试match

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]

用于测试的完整剧本示例

- 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
© www.soinside.com 2019 - 2024. All rights reserved.