【发布时间】:2019-12-13 15:24:14
【问题描述】:
我正在尝试使用 Ansible 向多个返回 dict 的主机发送命令。然后我想附加每个主机的 dict 结果以累积所有主机的结果。最后,我想打印累积结果的字典以供以后处理或写入文件。由于结果显示为字符串,我似乎无法合并字典。有没有办法解决这个问题?另外,有没有更高效的 Ansible 方法来实现这一点?
示例手册:
---
- hosts: myhosts
gather_facts: False
vars:
mydict: {}
tasks:
- name: Get dict result
shell: "cat /path/dict_output"
register: output
- set_fact:
result_dict="{{ output.stdout}}"
- debug: var=result_dict
调试输出:
TASK [debug] ****************************************************************************************************************************************************************
ok: [host-a] => {
"result_dict": {
"host_b": [
{
"ip-1": {
"port": "22",
"service": "ssh"
}
},
{
"ip-2": {
"port": "21",
"service": "ftp"
}
}
]
}
}
ok: [host-b] => {
"result_dict": {
"host_a": [
{
"ip-1": {
"port": "22",
"service": "ssh"
}
},
{
"ip-2": {
"port": "21",
"service": "ftp"
}
}
]
}
}
我尝试合并每个主机的结果:
- set_fact:
mydict: "{{ mydict | combine(output.stdout) }}"
- debug: var=mydict
失败结果:
TASK [set_fact] *************************************************************************************************************************************************************
fatal: [host-b]: FAILED! => {"msg": "|combine expects dictionaries, got u\"{'host_b': [{'ip-1': {'service': 'ssh', 'port': '22'}}, {'ip-2': {'service': 'ftp', 'port': '21'}}]}\""}
fatal: [host-a]: FAILED! => {"msg": "|combine expects dictionaries, got u\"{'host_a': [{'ip-1': {'service': 'ssh', 'port': '22'}}, {'ip-2': {'service': 'ftp', 'port': '21'}}]}\""}
累积结果的期望输出:
{'host_a': [{'ip-1': {'port': '22', 'service': 'ssh'}},
{'ip-2': {'port': '21', 'service': 'ftp'}}],
'host_b': [{'ip-1': {'port': '22', 'service': 'ssh'}},
{'ip-2': {'port': '21', 'service': 'ftp'}}]}
【问题讨论】:
标签: python python-3.x dictionary ansible