首页 > 解决方案 > ansible - 字典列表到列表字典

问题描述

我正在尝试获取以下 dict 链接列表:

family:
- {'name': 'lior', 'kidname': 'kid1'}
- {'name': 'lior', 'kidname': 'kid2'}
- {'name': 'lew', 'kidname': 'kid3'}
- {'name': 'lew', 'kidname': 'kid4'}

并将其变成列表的字典:

{
  'lior':['kid1', 'kid2']
  'lew':['kid3', 'kid4']
}

我需要它作为set_factansible playbook 中的命令。到目前为止,我能够创建它,但只有一个孩子(最后一个)

- set_fact:
    names: "{{ names | default({}) | combine({ item.name: [item.kidname] }) }}"
    with_items: "{{ family }}"

基本上我的问题是添加一个空列表并附加到它,就像我为密钥所做的那样。

谢谢你,里奥

标签: pythonlistdictionaryansible

解决方案


I edited your initial attempt to append to the list

---

- hosts: localhost
  vars:
    family:
      - {'name': 'lior', 'kidname': 'kid1'}
      - {'name': 'lior', 'kidname': 'kid2'}
      - {'name': 'lew', 'kidname': 'kid3'}
      - {'name': 'lew', 'kidname': 'kid4'}
  tasks:
    - set_fact:
        names: "{{ names | default({}) | combine({ item.name: names[item.name] | default([]) + [item.kidname] }) }}"
      with_items: "{{ family }}"

    - debug:
        var: names

Which outputs

TASK [debug] *******************************************************************
ok: [localhost] => {
    "names": {
        "lew": [
            "kid3",
            "kid4"
        ],
        "lior": [
            "kid1",
            "kid2"
        ]
    }
}

推荐阅读