如何通过某个键将两个字典组合成一个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 属性。然而,代码应该阻止该结构。