在Python中使用ansible.utils.display.Display()函数显示Ansible任务结果的嵌套结构。
发布时间:2023-12-14 02:15:31
在Python中,我们可以使用ansible.utils.display.Display()函数来显示Ansible任务结果的嵌套结构。Display()函数返回一个Display对象,该对象有用于输出的不同函数。以下是一个简单的示例,演示了如何使用该函数来显示Ansible任务结果的嵌套结构。
首先,确保已经安装了ansible和ansible的Python库。如果尚未安装,请使用以下命令进行安装:
pip install ansible
接下来,创建一个名为playbook.yaml的Ansible playbook文件,其中包含一些任务。下面是一个示例playbook的内容,它将在远程主机上执行两个命令,并将结果存储到变量中:
- name: Execute commands
hosts: localhost
tasks:
- name: Run command 1
command: echo "This is command 1"
register: command1_result
- name: Run command 2
command: echo "This is command 2"
register: command2_result
接下来,我们可以创建一个Python脚本来执行该playbook,并在脚本中使用ansible.utils.display.Display()函数来显示任务结果的嵌套结构。以下是一个示例脚本的内容:
from ansible.utils.display import Display
from ansible.executor.task_result import TaskResult
from ansible.executor.play_return import PlayReturn
def display_nested_result(result):
"""
递归显示Ansible任务结果的嵌套结构
"""
if isinstance(result, (TaskResult, PlayReturn)):
d = Display()
d.display(result._result)
elif isinstance(result, dict):
for key, value in result.items():
display_nested_result(value)
elif isinstance(result, list):
for item in result:
display_nested_result(item)
# 使用ansible-playbook执行playbook
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible import context
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
display = Display()
# 构造一个带有python模块路径的ansible上下文
context.CLIARGS = {
'modules_paths': ['/usr/lib/python3/dist-packages/ansible/modules']
}
# 加载inventory和playbook数据
loader = DataLoader()
inventory = InventoryManager(loader=loader, sources='localhost,')
playbook_path = 'playbook.yaml'
# 构造PlaybookExecutor对象来执行playbook
pbex = PlaybookExecutor(playbooks=[playbook_path], inventory=inventory, loader=loader, passwords={})
# 执行playbook
pbex.run()
# 获得playbook执行结果
playbook_results = pbex._tqm._variable_manager._extra_vars_results
# 显示结果的嵌套结构
display_nested_result(playbook_results)
在上述示例中,我们创建了一个display_nested_result()函数,它可以递归地显示Ansible任务结果的嵌套结构。我们还使用ansible-playbook执行了playbook,并获取了playbook执行结果。最后,我们调用display_nested_result()函数来显示结果的嵌套结构。
请注意,我们还设置了ansible-playbook的上下文,以确保它可以找到python模块的路径。
运行上述示例脚本,将会输出类似于以下内容的结果:
ok: [localhost] => {
"command1_result": {
"cmd": "echo \"This is command 1\"",
"delta": "0:00:00.002614",
"end": "2022-01-01 10:00:00.123456",
"invocation": {
"module_args": {
"_raw_params": "echo \"This is command 1\"",
"_uses_shell": false,
"argv": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"rc": 0,
"start": "2022-01-01 10:00:00.123456",
"stderr": "",
"stderr_lines": [],
"stdout": "This is command 1",
"stdout_lines": [
"This is command 1"
]
},
"command2_result": {
"cmd": "echo \"This is command 2\"",
"delta": "0:00:00.002188",
"end": "2022-01-01 10:00:00.234567",
"invocation": {
"module_args": {
"_raw_params": "echo \"This is command 2\"",
"_uses_shell": false,
"argv": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"rc": 0,
"start": "2022-01-01 10:00:00.234567",
"stderr": "",
"stderr_lines": [],
"stdout": "This is command 2",
"stdout_lines": [
"This is command 2"
]
}
}
如上所示,通过使用ansible.utils.display.Display()函数和递归遍历任务结果的嵌套结构,我们可以方便地显示Ansible任务的详细结果。
