2

我确实有一个嵌套字典,看起来像:

mydict:
  system:  # <-- group
    disk:  # <-- command name
      cmd: df -a
    memory:
      cmd: free
  hw:
    pci:
      cmd: lspci
      foo: bar

我想将其转换为字典列表,同时将前两个级别的键保存为键,如下所示:

mylist:
- cmd: "df -a"
  group: system
  name: disk
- cmd: "free"
  group: system
  name: memory
- cmd: "lspci"
  name: pci
  group: hw
  foo: bar

虽然我想使用的是json_query()ansible 过滤器,但我猜这个问题对于 json-path 使用来说是通用的。

4

1 回答 1

1

给定嵌套字典

    nested_dict:
      system:
        disk:
          cmd: df -a
        memory:
          cmd: free
      hw:
        pci:
          cmd: lspci
          foo: bar

包含任务的文件

shell> cat item-to-list.yml
- set_fact:
    mylist: "{{ mylist +
                [{'group': outer_item.key, 'name': item.key}|
                 combine(item.value)] }}"
  loop: "{{ outer_item.value|dict2items }}"

以及下面的任务

    - set_fact:
        mylist: []
    - include_tasks: item-to-list.yml
      loop: "{{ nested_dict|dict2items }}"
      loop_control:
        loop_var: outer_item
    - debug:
        var: mylist

    "mylist": [
        {
            "cmd": "df -a", 
            "group": "system", 
            "name": "disk"
        }, 
        {
            "cmd": "free", 
            "group": "system", 
            "name": "memory"
        }, 
        {
            "cmd": "lspci", 
            "foo": "bar", 
            "group": "hw", 
            "name": "pci"
        }
    ]

问:“如何使用 json_query 将嵌套字典转换为列表?”

答:在 Ansible 和 JMESPath 中,除了嵌套循环或自定义过滤器插件外,没有一种方法可以从“names”和“dictionaries_to_combine_with”(见下文)列表中组合请求的字典。恐怕 json_query 在这里是一条死胡同。

    - debug:
        msg:
          - "group: {{ item.0 }}"
          - "names: {{ item.1 }}"
          - "dictionaries_to_combine_with {{ item.2 }}"
      with_together:
        - "{{ nested_dict.keys()|list }}"
        - "{{ nested_dict|json_query('*.[keys(@), values(@)]') }}"
于 2020-04-09T19:42:39.097 回答