как получить правильный формат JSON - PullRequest
0 голосов
/ 11 июля 2019

Я запускаю задачу на нескольких хостах с регистром и мне нужен один и тот же формат вывода json независимо от того, выполняется ли задача на одном хосте или на нескольких.

- name: Retrieve Software information
  win_get_software:
  register: facts_software
- name: set fact
  set_fact:
  software_facts: "{{ facts_software.List }}"

Модуль win_get_softare возвращает данные json.

Приведенный выше пример перезаписывает software_facts последними данными хоста, которые невозможно использовать.

- name: Retrieve Software information
  win_get_software:
  register: facts_software
- name: set fact
  set_fact:
  software_facts: "{{ ansible_play_hosts | map('extract', hostvars, facts_software') | map(attribute='List') | list }}"
  run_once: yes
  delegate_to: 192.168.1.20
  delegate_facts: true

В приведенном выше примере корректно установлена ​​переменная, но в виде списка, который выводит следующий формат json:

[
[
    {
        "TEST-VM": [
            {
                "ADSPath": "WinNT://DOMAIN/TEST-VM/TestAdmin",
                "Class": "User",
                "Domain": "DOMAIN",
                "IsLocal": true,
                "Name": "TestAdmin"
            }
        ]
    }
],
[
    {
        "TEST2-VM": [
            {
                "ADSPath": "WinNT://DOMAIN/TEST2-VM/TestAdmin",
                "Class": "User",
                "Domain": "DOMAIN",
                "IsLocal": true,
                "Name": "TestAdmin"
            }
        ]
    }
]

]

Мне нужен следующий вывод:

[
{
    "TEST-VM": [
        {
                "ADSPath": "WinNT://DOMAIN/TEST-VM/TestAdmin",
                "Class": "User",
                "Domain": "DOMAIN",
                "IsLocal": true,
                "Name": "TestAdmin"
        }
    ]
},
{
    "TEST2-VM": [
        {
                "ADSPath": "WinNT://DOMAIN/TEST2-VM/TestAdmin",
                "Class": "User",
                "Domain": "DOMAIN",
                "IsLocal": true,
                "Name": "TestAdmin"
        }
    ]
}

]

Кто-нибудь знает, как правильно отформатировать результат при работе со списком?

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Так что мне удалось решить эту задачу с помощью следующих задач:

- name: set fact set_fact: software_facts: "{{ ansible_play_hosts | map('extract', hostvars, facts_software') | map(attribute='List') | list }}" run_once: yes delegate_to: 192.168.1.20 delegate_facts: true

- name: Reset variable of type hash set_fact: combined: {} - name: Combine items in list set_fact: combined: "{{ combined | combine(item) }}" loop: "{{ software_facts }}" loop_control: label: "Host {{ my_idx + 1 }} variable was added to list" index_var: my_idx

Это не красиво, но делает работу.

0 голосов
/ 12 июля 2019

Попробуйте ниже, но не проверено.Добавить прогон один раз, делегировать и т. Д.

- name: Final result
  set_fact:
    result: "{{ result | default({}) + item[0] }}"
  with_items:
    - "{{ software_facts }}"
- name: Debug
   debug:
     msg: "{{ result }}"
...