结果收集是什么
收集的目的不是把输出堆起来,而是把 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(连接或认证失败)与远端命令的非零退出码分开统计,可以立刻区分「压根没连上」和「连上了但执行失败」,排查路径完全不同。
并发任务共同重定向到同一个汇总文件,会产生交错或被覆盖的内容。汇总文件应各写各的,或保证每次追加写的是单行且不超过系统原子写上限。