Sam*_*m F 3 python ansible ansible-playbook ansible-2.x
通过其API调用ansible时如何指定回调?
我有一个database_write.py用于ansible 2.0.0.2 的回调插件,该插件在运行时登录数据库:
ansible-playbook -i inventory.txt playbook.yml # callback is fired ok
Run Code Online (Sandbox Code Playgroud)
这行得通,因为在我的$ PWD中我有ansible.cfg以下一行:
callback_plugins = ./src/callback
Run Code Online (Sandbox Code Playgroud)
现在,我试图使用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()
Run Code Online (Sandbox Code Playgroud)
这样可以很好地执行剧本,但不会触发回调。
我猜在使用python API时,我的ansible.cfg文件没有被考虑在内吗?
如何为PlaybookExecutor指定回调插件?
(我发现的大多数文档适用于<2.0版的ansible版本)
先感谢您!
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()
Run Code Online (Sandbox Code Playgroud)
(ResultAccumulator是此处的回调插件类。它应从ansible.plugins.callback.CallbackBase派生。