Как преобразовать вложенный словарь в список, используя json_query? - PullRequest
2 голосов
/ 09 апреля 2020

У меня есть вложенный словарь, который выглядит следующим образом:

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, я предполагаю, что вопрос является общим c для использования json -path.

1 Ответ

1 голос
/ 09 апреля 2020

С учетом вложенного словаря

    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"
        }
    ]

Q: "Как преобразовать вложенный словарь в список с помощью json_query?"

A: Ни в 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(@)]') }}"
...