欢迎访问宙启技术站
智能推送

在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任务的详细结果。