首页/系统与基础设施/自动化运维速查/批量执行结果的收集与汇总
批量执行与作业50 条

批量执行结果的收集与汇总

结果收集是把 N 台主机的自由文本输出转成一条条可判定记录的过程,需要落到主机、状态、退出码、耗时、错误摘要几个字段。做法分结果落盘、状态归一、汇总审定三层,并存原则是失败必须可见,不能只留成功记录。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

结果收集是什么

收集的目的不是把输出堆起来,而是把 N 台主机的自由文本转成一条条可判定的记录:哪台主机、什么状态、耗时多久、失败在哪一步。实现分三层:结果落盘(每主机一份文件或结构化事件流)、状态归一(把工具特有状态映射成统一的成功/失败/跳过枚举)、汇总审定(统计各类数量并生成待处理清单)。

基本信息

关键字段host、status、exit_code、start/end、duration、stderr 摘要、变更量
存储形式JSON Lines(每主机一行)、每主机独立文件、中心数据库
核心原则失败必须可见,不能只有成功记录
权限要求控制端可写日志目录;读取目标系统日志可能需提权

典型使用场景

  • 批量发布后逐台确认生效,而不是只看整体返回 0
  • 汇总失败主机清单,作为下一轮重试的输入
  • 统计耗时分布,为并发度与时间窗口调整提供依据
  • 留存执行证据,用于事后复盘与责任界定
  • 跨团队交接时提供可核对、可复核的执行报告

逐台落盘与汇总

逐台落盘与汇总
mkdir -p logs
while read -r h; do
  ssh -n "$h" 'hostname; uptime' >"logs/$h.out" 2>"logs/$h.err" &   # 每台独立文件避免交错
  printf '%s exit=%s\n' "$h" "$?" >> logs/summary.txt                 # 记录退出码
done < hosts
wait
grep -c 'exit=255' logs/summary.txt   # 255 是 SSH 连接失败,与业务失败区分统计

结果字段与判读

字段含义异常表现
host目标标识出现预期外主机名,说明目标选择有误
status归一后的状态大量 skipped,说明执行条件写得过严
exit_code命令退出码全为 0 但业务未生效,需查被忽略的 stderr
duration单机耗时个别远超中位数,说明该主机或链路异常
stderr 摘要错误首行为空但状态失败,说明判据与实际不符
把 SSH 的 255(连接或认证失败)与远端命令的非零退出码分开统计,可以立刻区分「压根没连上」和「连上了但执行失败」,排查路径完全不同。
并发任务共同重定向到同一个汇总文件,会产生交错或被覆盖的内容。汇总文件应各写各的,或保证每次追加写的是单行且不超过系统原子写上限。

易错点

  • 只统计成功数量,失败主机的 stderr 被丢弃,事后无法定位原因
  • 并行任务共同重定向到同一日志文件,内容交错损坏无法解析
  • 把命令输出当作结果,未记录退出码,命令失败但打印了提示信息被误判为成功
  • 未记录开始与结束时间,无法判断异常是本次变更导致还是本来就存在

数据来源与参考

  • OpenSSH 手册 ssh(1) 退出码说明
  • Ansible 官方文档:回调插件与执行结果结构
  • Bash 参考手册:重定向与管道

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/batch-execution-result-collection.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​