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

在Django中如何通过WebSocket传递ansible_runner的输出?

使用Ansible Runner捕获并处理实时输出

一、实时捕获输出流

  • 利用ansible_runner的event_handler回调机制,在任务执行全过程中实时获取事件数据
  • 示例代码:
import ansible_runner

def event_callback(event, **kwargs):
    # 处理任务成功事件
    if event['event'] == 'runner_on_ok':
        host = event['event_data']['remote_addr']
        result = event['event_data']['res']
        print(f"{host} | SUCCESS => {result}")
    # 处理任务启动事件,提取时间戳
    elif event['event'] == 'runner_on_start':
        timestamp = event['event_data']['timestamp']
        print(f"{timestamp} ***********")
    # 按需处理其他事件,如失败、跳过等
    elif event['event'] == 'runner_on_failed':
        host = event['event_data']['remote_addr']
        error = event['event_data']['res']['msg']
        print(f"{host} | FAILED => {error}")

# 启动Runner并绑定回调函数
runner = ansible_runner.run(
    private_data_dir='/path/to/your/ansible/project',
    playbook='target_playbook.yml',
    event_handler=event_callback
)

二、格式化输出为目标样式

  • 在回调函数中对事件数据做格式化,匹配你需要的输出格式:
def format_event_output(event):
    output = ""
    if event['event'] == 'runner_on_ok':
        timestamp = event['event_data']['timestamp']
        host = event['event_data']['remote_addr']
        res = event['event_data']['res']
        output = f"{timestamp} *********** \n{host} | SUCCESS => {res}"
    elif event['event'] == 'playbook_on_stats':
        stats = event['event_data']['stats']
        output = "===============================================================================\n"
        for task_name, duration in stats['playbook']['tasks'].items():
            output += f"{task_name} ------------------------------------------------------------------- {duration}s\n"
    return output

三、实时展示或写入数据库

  • 实时展示:如果是Web场景,可通过WebSocket将格式化后的输出推送到前端页面;终端场景直接打印即可
  • 写入数据库:在回调函数中,将输出内容插入数据库(以SQLite为例):
import sqlite3

def save_output_to_db(content):
    conn = sqlite3.connect('ansible_output.db')
    cursor = conn.cursor()
    # 提前创建表:CREATE TABLE IF NOT EXISTS output_logs (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
    cursor.execute('INSERT INTO output_logs (content) VALUES (?)', (content,))
    conn.commit()
    conn.close()

# 在event_callback中调用
formatted_content = format_event_output(event)
if formatted_content:
    save_output_to_db(formatted_content)

四、核心接口说明

  • ansible_runner.run()的event_handler参数:接收自定义回调函数,每个Ansible事件触发时自动调用
  • 事件类型:通过event['event']判断,常见类型包括runner_on_ok、runner_on_failed、playbook_on_start、playbook_on_stats等
  • 事件数据:event['event_data']包含事件的全部细节,如主机地址、任务结果、时间戳、耗时等

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:47:40