我正在多个具有寄存器的主机上运行任务,并且无论任务是在一台或多台主机上执行,都需要相同的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"
}
]
}
]
有人知道我在处理列表时如何正确格式化结果吗?
答案 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
虽然不漂亮,但可以完成工作。