"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
我有一个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