如何获得正确的json格式

时间:2019-07-11 10:26:08

标签: json ansible yaml

我正在多个具有寄存器的主机上运行任务,并且无论任务是在一台或多台主机上执行,都需要相同的json输出格式。

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

win_get_soft模块返回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 :(得分:0)

尝试以下方法,但未进行测试。添加一次运行,委托等

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

答案 1 :(得分:0)

因此我能够通过以下任务解决此问题:

- 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

虽然不漂亮,但可以完成工作。