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

利用CallbackBase()实现Ansible插件定制化输出

发布时间:2023-12-25 21:51:42

在Ansible中,可以使用CallbackBase类来定制化输出。CallbackBase是Ansible中所有回调插件的基类,通过继承该基类可以自定义回调插件并实现输出定制化。

下面是一个使用CallbackBase实现定制化输出的示例代码:

from ansible.plugins.callback import CallbackBase

class MyCallbackPlugin(CallbackBase):
    """
    自定义回调插件,实现定制化输出
    """

    def __init__(self):
        super(MyCallbackPlugin, self).__init__()
        self.results = []  # 用于保存执行结果

    def v2_runner_on_ok(self, result, **kwargs):
        """
        当任务执行成功时,输出执行结果
        """
        host = result._host.get_name()
        self.results.append({
            'host': host,
            'task': result.task_name,
            'status': "ok",
            'result': result._result,
        })

    def v2_runner_on_failed(self, result, **kwargs):
        """
        当任务执行失败时,输出执行结果
        """
        host = result._host.get_name()
        self.results.append({
            'host': host,
            'task': result.task_name,
            'status': 'failed',
            'result': result._result,
        })

    def v2_runner_on_unreachable(self, result, **kwargs):
        """
        当主机不可达时,输出执行结果
        """
        host = result._host.get_name()
        self.results.append({
            'host': host,
            'task': result.task_name,
            'status': 'unreachable',
            'result': result._result,
        })

    def v2_playbook_on_stats(self, stats):
        """
        在执行完所有任务后,输出执行结果统计信息
        """
        print("执行结果统计信息:")
        for result in self.results:
            host = result['host']
            task = result['task']
            status = result['status']
            print(f"主机:{host},任务:{task},状态:{status}")
        print("执行结束")

在这个示例中,我们自定义了一个名为MyCallbackPlugin的回调插件类,继承自CallbackBase。我们重写了CallbackBase的几个方法,分别实现了任务执行成功、失败和主机不可达时的输出逻辑。在v2_playbook_on_stats方法中,我们输出了执行结果的统计信息。

使用该回调插件可以通过调用Ansible API来执行Ansible任务并输出定制化的结果。下面是一个使用该回调插件的示例代码:

from ansible import context
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
from ansible.utils.vars import combine_vars

def run_ansible_playbook(playbook_path):
    """
    执行Ansible Playbook,并使用自定义回调插件输出结果
    """
    loader = DataLoader()
    inventory = InventoryManager(loader=loader, sources=inventory_path)
    variable_manager = loader.get_variables()
    playbooks = [playbook_path]
    passwords = {}

    # 设置Ansible上下文
    context.CLIARGS = {
        'listtasks': False,
        'listhosts': False,
        'syntax': False,
        'module_paths': None,
        'forks': 100,
        'become': None,
        'become_method': None,
        'become_user': None,
        'check': False,
        'diff': False,
    }

    # 创建Playbook执行器
    playbook_executor = PlaybookExecutor(
        playbooks=playbooks,
        inventory=inventory,
        variable_manager=variable_manager,
        loader=loader,
        passwords=passwords
    )

    # 设置回调插件
    callback = MyCallbackPlugin()
    playbook_executor._tqm._stdout_callback = callback

    # 执行Playbook
    playbook_executor.run()

    # 输出执行结果
    callback.v2_playbook_on_stats(playbook_executor._tqm._stats)

if __name__ == "__main__":
    playbook_path = "path_to_playbook.yml"
    run_ansible_playbook(playbook_path)

在这个示例中,我们通过调用Ansible API来载入Ansible Playbook,并使用自定义回调插件来输出执行结果。我们通过设置回调插件来自定义输出逻辑,并在执行Playbook后调用v2_playbook_on_stats方法输出结果统计信息。

通过继承CallbackBase类并自定义回调插件,我们可以实现Ansible任务执行结果的定制化输出。使用自定义回调插件可以更灵活地处理执行结果,并将输出适配到各种需求。