加入词典列表

join list of dictionaries

我有一个 macaddresses 网络适配器 的列表,我想将它们合并到一个列表中。

  vars:
    network_adapters:
    - name: "Network adapter one"
    - name: "Network adapter two"

    macaddresses:
    - "00:50:56:9c:8c:b1"
    - "00:50:56:9c:8c:b2"

可以使用以下方法使用附加变量来完成,但我希望 oneliner

  - name: "Set fact"
    set_fact:
      network_interfaces: >-
        {{
          network_interfaces | default([])
            + [item[0] | combine({'macaddress':item[1]})]
        }}
    loop: "{{ network_adapters | zip(macaddresses) }}"

输出:

{
  "macaddress": "00:50:56:9c:8c:b1",
  "name": "Network adapter one"
},
{
  "macaddress": "00:50:56:9c:8c:b2",
  "name": "Network adapter two"
}

以下是我的一些试用,也许有人觉得有用。

我对最后一个特别感兴趣。这两次输出最后一个 network_adapters 项的字典。 这是一个错误吗?

任务完成工作

    - debug:
        msg: "{{ dict(network_adapters|map(attribute='name')|zip(macaddresses))|
                 dict2items(key_name='name', value_name='macaddress') }}"

给予

  msg:
  - macaddress: 00:50:56:9c:8c:b1
    name: Network adapter one
  - macaddress: 00:50:56:9c:8c:b2
    name: Network adapter two

问:"比较复杂的数据。保留其他属性,比如'ip'?"

    network_adapters:
    - name: "Network adapter one"
      ip: "192.168.0.1"
    - name: "Network adapter two"
      ip: "192.168.0.2"

答:没有“单行”,只有循环(你已经知道了),例如

    - set_fact:
        na2: "{{ na2|default([]) + [item.0|combine({'macaddress': item.1})] }}"
      with_together:
        - "{{ network_adapters }}"
        - "{{ macaddresses }}"

给予

  na2:
  - ip: 192.168.0.1
    macaddress: 00:50:56:9c:8c:b1
    name: Network adapter one
  - ip: 192.168.0.2
    macaddress: 00:50:56:9c:8c:b2
    name: Network adapter two