Python 如何在Ansible 2中向PlaybookExecutor添加回调插件

Python 如何在Ansible 2中向PlaybookExecutor添加回调插件,python,ansible,ansible-playbook,ansible-2.x,Python,Ansible,Ansible Playbook,Ansible 2.x,如何在通过ansible的API调用ansible时指定回调 我有一个用于ansible 2.0.0.2的回调插件database_write.py,运行时会登录到数据库: ansible-playbook -i inventory.txt playbook.yml # callback is fired ok 这一切正常,因为在我的$PWD中,我有ansible.cfg这一行: callback_plugins = ./src/callback 现在我正试图使ansible能够使用py

如何在通过ansible的API调用ansible时指定回调

我有一个用于ansible 2.0.0.2的回调插件
database_write.py
,运行时会登录到数据库:

ansible-playbook -i inventory.txt playbook.yml # callback is fired ok
这一切正常,因为在我的$PWD中,我有
ansible.cfg
这一行:

callback_plugins   = ./src/callback
现在我正试图使ansible能够使用python API执行我的剧本和回调。我基本上复制了ansible playbook cli工具的功能

# based on https://github.com/ansible/ansible/blob/v2.0.0.2-1/lib/ansible/cli/playbook.py
pbex = PlaybookExecutor(playbooks=['../playbook.yml'],
                        inventory=inventory,
                        variable_manager=variable_manager,
                        loader=loader,
                        options=options,
                        passwords=passwords)

results = pbex.run()
这会很好地执行playbook,但不会触发回调

我猜在使用python API时,我的
ansible.cfg
文件没有被考虑在内

如何向PlaybookExecutor指定回调插件?

(我发现的大多数文档都适用于ansible版本<2.0)

提前谢谢你

在我的设置(ansible 2.0.0.2 RHEL6 python 2.6.6)中,我需要在/etc/ansible/ansible.cfg中设置它 就这样做了:

callback_plugins = /usr/lib/python2.6/site-packages/ansible/plugins/callback
bin_ansible_callbacks = True
callback_whitelist = profile_tasks

2.0 API非常原始,通常不适合最终用户。未来可能也会发生变化。在邮件列表中,我发布了类似的问题,并提出了我自己的答案,答案显然是正确的:您可以将回调分配给executor的TaskQueueManager实例(PlaybookExecutor.\u tqm.\u stdout\u回调)


(Resultacumerator是来自的回调插件类。它应该从ansible.plugins.callback.CallbackBase派生。

ansible API文档很少。PlaybookExecutor不接受任何回调参数。 但是,您可以从CallbackBase创建自定义回调。 以下示例返回所有TaskResults的列表:

class SampleCallback(CallbackBase):
    """Sample callback"""

    def __init__(self):
        super(SampleCallback, self).__init__()
        # store all results
        self.results = []

    def v2_runner_on_ok(self, result, **kwargs):
        """Save result instead of printing it"""
        self.results.append(result)

pbe = PlaybookExecutor(
            playbooks=playbooks,
            inventory=inventory,
            variable_manager=variable_manager,
            loader=loader,
            options=options,
            passwords=passwords
        )
callback = SampleCallback()
pbe._tqm._stdout_callback = callback
return_code = pbe.run()
results = callback.results
class SampleCallback(CallbackBase):
    """Sample callback"""

    def __init__(self):
        super(SampleCallback, self).__init__()
        # store all results
        self.results = []

    def v2_runner_on_ok(self, result, **kwargs):
        """Save result instead of printing it"""
        self.results.append(result)

pbe = PlaybookExecutor(
            playbooks=playbooks,
            inventory=inventory,
            variable_manager=variable_manager,
            loader=loader,
            options=options,
            passwords=passwords
        )
callback = SampleCallback()
pbe._tqm._stdout_callback = callback
return_code = pbe.run()
results = callback.results