如何通过Ansible Python API的CallbackBase获取Playbook Shell执行标准输出?
获取Ansible Playbook Shell任务的标准输出(基于CallbackBase类)
要通过CallbackBase捕获Shell任务的stdout,核心是重写Ansible回调事件方法,从任务结果对象中提取输出数据,具体实现如下:
实现步骤
- 继承
CallbackBase类,重写任务执行成功触发的v2_runner_on_ok方法 - 从任务结果的
_result字典中,直接提取stdout(原始字符串输出)或stdout_lines(按行拆分的列表)字段
示例代码
from ansible.plugins.callback import CallbackBase class MyCustomCallback(CallbackBase): def v2_runner_on_ok(self, result, **kwargs): # 拿到任务执行的原始结果数据 task_result = result._result # 提取并打印stdout if 'stdout' in task_result: print("Shell任务标准输出:") print(task_result['stdout']) # 若需要按行输出,可使用stdout_lines if 'stdout_lines' in task_result: print("\n按行拆分输出:") for line in task_result['stdout_lines']: print(line) # 执行Playbook时加载自定义回调 from ansible.executor.playbook_executor import PlaybookExecutor from ansible.inventory.manager import InventoryManager from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager # 初始化Ansible核心组件 loader = DataLoader() inventory = InventoryManager(loader=loader, sources=['/your/inventory/path']) variable_manager = VariableManager(loader=loader, inventory=inventory) # 实例化Playbook执行器 pb_executor = PlaybookExecutor( playbooks=['your_playbook.yml'], inventory=inventory, variable_manager=variable_manager, loader=loader, passwords={} ) # 注册自定义回调 pb_executor._tqm._stdout_callback = MyCustomCallback() # 执行Playbook pb_executor.run()
关键说明
result._result包含任务执行的全量结果数据,除stdout外,还可获取stderr(标准错误输出)、rc(任务返回码)等字段- 若需捕获失败任务的输出,可重写
v2_runner_on_failed方法,逻辑与v2_runner_on_ok一致 - 确保回调方法名符合Ansible v2版本规范(以
v2_开头),否则无法触发回调
内容的提问来源于stack exchange,提问作者joelcharles28
相关产品推荐
相关产品推荐

