4

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

我有一个database_write.pyansible 2.0.0.2 的回调插件,它在运行时会登录到数据库:

ansible-playbook -i inventory.txt playbook.yml # callback is fired ok

这行得通,因为在我的 $PWD 中我有ansible.cfg这条线:

callback_plugins   = ./src/callback

现在我正在尝试使用 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()

这可以很好地执行剧本,但不会触发回调。

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

如何将我的回调插件指定给 PlaybookExecutor?

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

先感谢您!

4

3 回答 3

5

2.0 API 非常原始,通常不适合最终用户。将来也可能会改变。请参阅邮件列表上的此讨论,我在其中发布了类似的问题并提出了我自己的答案,这显然是正确的:您可以将回调分配给执行程序的 TaskQueueManager 实例(PlaybookExecutor._tqm._stdout_callback)。

pbex = PlaybookExecutor(playbooks=playbooks, inventory=inventory,
                        variable_manager=variable_manager,
                        loader=loader, options=options,
                        passwords=passwords)
cb = ResultAccumulator()
pbex._tqm._stdout_callback = cb
results = pbex.run()

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

于 2016-02-13T11:32:36.433 回答
4

Ansible API 文档很少。PlaybookExecutor 不接受任何回调参数。但是,您可以从 CallbackBase 创建自定义回调。这是一个返回所有任务结果列表的示例:

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
于 2016-09-21T13:06:20.140 回答
-1

使用我的设置(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
于 2016-01-29T22:24:50.727 回答