在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
相关产品推荐
相关产品推荐

