gpt4 book ai didi

ansible - 将字符串附加到 Ansible 中字典值中包含的列表

转载 作者:行者123 更新时间:2023-12-03 07:50:48 30 4
gpt4 key购买 nike

我有一本看起来像这样的字典(但更大):

my_dict:
"id1": "name1"
"id2": "name2"
"id3": "name1"
"id4": "name2"
"id5": "name1"
"id6": "name3"

在 Ansible 中,如何创建一个任务来“反转”此字典,如下所示:

result_dict:
"name1": ["id1", "id3", "id5"]
"name2": ["id2", "id4"]
"name3": ["id6"]

我已经尝试过这个:

- name: "Get list of unique ids"
set_fact:
unique_names: "{{ my_dict.values() | unique }}"

- name: "Initialize result_dict with empty lists"
set_fact:
result_dict: "{{ result_dict | combine(item: []) }}"
loop: "{{ unique_names }}"

- name: "Populate result_dict lists"
set_fact:
result_dict: "{{ result_dict | combine(new_item, recursive=true)}}"
vars:
new_item: "{ '{{ item.value }}': { item.value: item.key } }"
with_dict: "{{ result_dict }}"
loop: "{{ my_dict | dict2items }}"

我对 Ansible 还很陌生。问题是我不确定如何附加到已有的列表中。希望这是有道理的。有更好的方法吗?谢谢。

最佳答案

还有更多选项:

  • 金贾

最简单的选项是 Jinja 。例如下面的表达式

  result: |
{% filter from_yaml %}
{% for i in my_dict|dict2items|groupby('value') %}
{{ i.0 }}: {{ i.1|map(attribute='value') }}
{% endfor %}
{% endfilter %}

给出了预期的结果

  result:
name1: [id1, id3, id5]
name2: [id2, id4]
name3: [id6]

  • community.general.lists_mergeby

使用过滤器community.general.lists_mergeby 。将字典转换为列表,并将属性键也放入列表中

  list1: "{{ my_dict|dict2items|
json_query('[].{key: [key], value: value}') }}"

给出

  list1:
- key: [id1]
value: name1
- key: [id2]
value: name2
- key: [id3]
value: name1
- key: [id4]
value: name2
- key: [id5]
value: name1
- key: [id6]
value: name3

合并项目并附加列表

  merge: "{{ [list1, []]|
community.general.lists_mergeby('value', list_merge='append') }}"

给出

  merge:
- key: [id1, id3, id5]
value: name1
- key: [id2, id4]
value: name2
- key: [id6]
value: name3

将列表转换为字典。使用中间结果merge或将过滤器items2dict添加到管道

  result: "{{ [list1, []]|
community.general.lists_mergeby('value', list_merge='append')|
items2dict(key_name='value', value_name='key') }}"

给出相同的结果

  result:
name1: [id1, id3, id5]
name2: [id2, id4]
name3: [id6]

用于测试的完整剧本示例

- hosts: all

vars:

my_dict:
id1: name1
id2: name2
id3: name1
id4: name2
id5: name1
id6: name3

list1: "{{ my_dict|dict2items|
json_query('[].{key: [key], value: value}') }}"
merge: "{{ [list1, []]|
community.general.lists_mergeby('value', list_merge='append') }}"
result: "{{ [list1, []]|
community.general.lists_mergeby('value', list_merge='append')|
items2dict(key_name='value', value_name='key') }}"

tasks:

- debug:
var: list1|to_yaml
- debug:
var: merge|to_yaml
- debug:
var: result|to_yaml

  • dict(键|zip(值))

在此选项中,获取键和值并使用函数dict创建字典。

将字典转换为列表并按值对项目进行分组

  _grps: "{{ my_dict|dict2items|groupby('value') }}"

给出

  _grps:
- - name1
- - {key: id1, value: name1}
- {key: id3, value: name1}
- {key: id5, value: name1}
- - name2
- - {key: id2, value: name2}
- {key: id4, value: name2}
- - name3
- - {key: id6, value: name3}

获取 key

  _keys: "{{ _grps|map('first') }}"

给出

  _keys: [name1, name2, name3]

获取值

  _vals: "{{ _grps|map('last')|map('map', attribute='key') }}"

给出

  _vals:
- [id1, id3, id5]
- [id2, id4]
- [id6]

创建字典

  result: "{{ dict(_keys|zip(_vals)) }}"

给出相同的结果

  result:
name1: [id1, id3, id5]
name2: [id2, id4]
name3: [id6]

用于测试的完整剧本示例

- hosts: all

vars:

my_dict:
id1: name1
id2: name2
id3: name1
id4: name2
id5: name1
id6: name3

_grps: "{{ my_dict|dict2items|groupby('value') }}"
_keys: "{{ _grps|map('first') }}"
_vals: "{{ _grps|map('last')|map('map', attribute='key') }}"
result: "{{ dict(_keys|zip(_vals)) }}"

tasks:

- debug:
var: _grps|to_yaml
- debug:
var: _keys|to_yaml
- debug:
var: _vals|to_yaml
- debug:
var: result|to_yaml

关于ansible - 将字符串附加到 Ansible 中字典值中包含的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77160426/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com