如何通过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
现在我正在尝试使用python API来执行我的playbook和回调。我基本上复制了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指定我的回调插件?
(我发现的大多数文档适用于ansible版本< 2.0)
提前谢谢你!
答案 0 :(得分:4)
2.0 API非常原始,通常不适合最终用户。它也可能在未来发生变化。请参阅我发布类似问题的邮件列表上的this discussion,并提出我自己的答案显然是正确的:您可以将回调分配给执行者的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是来自here的回调插件类。它应该来自ansible.plugins.callback.CallbackBase。
答案 1 :(得分:3)
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
答案 2 :(得分:-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