"Flattening" 在 ansible 中将列表放入字典 key/value

"Flattening" a list into dictionary key/value in ansible

我有一个yaml数据集如下:

  - order_number: 1
    name: 7zip
    unique_id: uid_1637333977
    parameters:
      - msi_file_name: 7z2104-x64.msi
      - msi_file_path: c:\users\zztestz2104-x64.msi
      - msi_file_directory: c:\users\zztest

我正在尝试仅使用“参数”设置一个新事实,但不是列表,而是字典的集合 key/values

例如

new_variable: {
  msi_file_name: 7z2104-x64.msi
  msi_file_path: c:\users\zztestz2104-x64.msi
  msi_file_directory: c:\users\zztest
}

如何将“参数”作为定义字典返回 key/values 而不是 key/values 列表?

有(至少)两种方式:dict2items and items2dict filter 的序列,或更传统的 dict.update 用法。您更喜欢哪一个主要是个人喜好,以及您是否需要向未来的同事解释管道魔法

流水线

  - name: use a jijna2 pipeline
    set_fact:
      new_variable: >-
        {{ parameters | map("dict2items") | flatten | items2dict  }}

flatten 在那里是因为 parameters 列表中的每个项目本身都会成为字典列表,形状如下:

    [
        [
            {
                "key": "msi_file_name",
                "value": "7z2104-x64.msi"
            }
        ],

但是通过对其应用“展平”,我们得到了 items2dict 期望的形状:

    [
            {
                "key": "msi_file_name",
                "value": "7z2104-x64.msi"
            }
    ]

最后,它产生了你所要求的:

ok: [localhost] => changed=false
  ansible_facts:
    new_variable:
      msi_file_directory: c:\users\zztest
      msi_file_name: 7z2104-x64.msi
      msi_file_path: c:\users\zztestz2104-x64.msi

使用dict.update

  - name: use update
    set_fact:
      new_variable: >-
        {%- set results = {} -%}
        {%- for p_dict in parameters -%}
        {%-   set _ = results.update(p_dict) -%}
        {%- endfor -%}
        {{ results }}

产量相同:

ok: [localhost] => changed=false
  ansible_facts:
    new_variable:
      msi_file_directory: c:\users\zztest
      msi_file_name: 7z2104-x64.msi
      msi_file_path: c:\users\zztestz2104-x64.msi

给定yaml数据集

  yaml_data_set:
    - order_number: 1
      name: 7zip
      unique_id: uid_1637333977
      parameters:
        - msi_file_name: 7z2104-x64.msi
        - msi_file_path: c:\users\zztestz2104-x64.msi
        - msi_file_directory: c:\users\zztest

combine 参数,例如

  new_variable: "{{ yaml_data_set|map(attribute='parameters')|flatten|combine }}"

给予

  new_variable:
    msi_file_directory: c:\users\zztest
    msi_file_name: 7z2104-x64.msi
    msi_file_path: c:\users\zztestz2104-x64.msi