如何通过某个键将两个字典组合成一个ansible
How to combine two dictionaries an ansible by some key
我有两个 yaml 字典,我需要通过键将它们连接起来
server_groups:
- name: grp1
servers: server1-1,server1-2,server1-3
- name: grp2
servers: server2-1,server2-2,server2-3
- name: grp3
servers: server3-1,server3-2,server3-3
server_paths:
- name: path1
src: grp1
dest: grp2
payload: ...
- name: path2
src: grp3
dest: grp1
payload: ...
我想通过按组名添加 src_servers 和 dest_servers 来丰富 server_paths 词典。
我试过这样实现的:
- set_fact:
serverpaths: "{{ server_paths }}"
- set_fact:
serverpaths: "{{ serverpaths|combine({'dest_servers':server_groups| selectattr('name', 'equalto', item.dest) | map(attribute='servers') | first})}}"
loop: "{{ server_paths }}"
预期结果是:
server_paths:
- name: path1
src: server1-1,server1-2,server1-3
dest: server2-1,server2-2,server2-3
payload: ...
- name: path2
src: server3-1,server3-2,server3-3
dest: server1-1,server1-2,server1-3
payload: ...
加入后效果很好,但 returns 只是最后一个丰富的元素。所以我卡住了如何获得所有丰富的元素?
将列表 server_groups 转换为字典 server_groups_dict,例如将下面的表达式放在列表来自的地方
server_groups_dict: "{{ server_groups|items2dict(key_name='name',
value_name='servers') }}"
给予
server_groups_dict:
grp1: server1-1,server1-2,server1-3
grp2: server2-1,server2-2,server2-3
grp3: server3-1,server3-2,server3-3
现在您可以迭代列表 server_paths 并创建所需的结构,例如
- set_fact:
serverpaths: "{{ serverpaths|d([]) + [item|combine(_dict)] }}"
loop: "{{ server_paths }}"
vars:
_dict: "{{ {'src': server_groups_dict[item.src],
'dest': server_groups_dict[item.dest]} }}"
给予
serverpaths:
- dest: server2-1,server2-2,server2-3
name: path1
src: server1-1,server1-2,server1-3
- dest: server1-1,server1-2,server1-3
name: path2
src: server3-1,server3-2,server3-3
备注
- 为简单起见,我删除了 payload 属性。然而,代码应该阻止该结构。
我有两个 yaml 字典,我需要通过键将它们连接起来
server_groups:
- name: grp1
servers: server1-1,server1-2,server1-3
- name: grp2
servers: server2-1,server2-2,server2-3
- name: grp3
servers: server3-1,server3-2,server3-3
server_paths:
- name: path1
src: grp1
dest: grp2
payload: ...
- name: path2
src: grp3
dest: grp1
payload: ...
我想通过按组名添加 src_servers 和 dest_servers 来丰富 server_paths 词典。
我试过这样实现的:
- set_fact:
serverpaths: "{{ server_paths }}"
- set_fact:
serverpaths: "{{ serverpaths|combine({'dest_servers':server_groups| selectattr('name', 'equalto', item.dest) | map(attribute='servers') | first})}}"
loop: "{{ server_paths }}"
预期结果是:
server_paths:
- name: path1
src: server1-1,server1-2,server1-3
dest: server2-1,server2-2,server2-3
payload: ...
- name: path2
src: server3-1,server3-2,server3-3
dest: server1-1,server1-2,server1-3
payload: ...
加入后效果很好,但 returns 只是最后一个丰富的元素。所以我卡住了如何获得所有丰富的元素?
将列表 server_groups 转换为字典 server_groups_dict,例如将下面的表达式放在列表来自的地方
server_groups_dict: "{{ server_groups|items2dict(key_name='name',
value_name='servers') }}"
给予
server_groups_dict:
grp1: server1-1,server1-2,server1-3
grp2: server2-1,server2-2,server2-3
grp3: server3-1,server3-2,server3-3
现在您可以迭代列表 server_paths 并创建所需的结构,例如
- set_fact:
serverpaths: "{{ serverpaths|d([]) + [item|combine(_dict)] }}"
loop: "{{ server_paths }}"
vars:
_dict: "{{ {'src': server_groups_dict[item.src],
'dest': server_groups_dict[item.dest]} }}"
给予
serverpaths:
- dest: server2-1,server2-2,server2-3
name: path1
src: server1-1,server1-2,server1-3
- dest: server1-1,server1-2,server1-3
name: path2
src: server3-1,server3-2,server3-3
备注
- 为简单起见,我删除了 payload 属性。然而,代码应该阻止该结构。