You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:45:55