摘要
把「批量执行」拆成清单、确认、回退三问,对比循环 ssh、幂等脚本、常驻 Web 服务、本地渲染客户端四条路线在服务器侧开销、端口、留痕与失败定位上的差别,给出按规模选型的条件结论,并附一次 20 台改配置的完整命令与检查清单。
适用范围
5 台以上、需要重复执行同一组命令的环境。前提是免密登录已配好;如果还在用密码,先把密钥分发做完,后面的并发与批量都建立在免密之上。
1. 先把「批量」拆成三问
|
问题 |
落地物 |
缺了会怎样 |
|
改哪些机器 |
|
靠记忆,漏改或误伤 |
|
怎么确认成功 |
每台一份输出文件 |
输出交错,无法归因 |
|
出事怎么回退 |
本地备份 + 改前现状 |
只能凭印象还原 |
2. 四条路线对比
|
维度 |
循环 + ssh |
幂等脚本 |
常驻 Web 服务 |
本地渲染的桌面型 |
|
服务器侧进程 |
零 |
零 |
常驻一组 |
零 |
|
对外端口 |
不新增 |
不新增 |
新增一个 |
不新增 |
|
动作留痕 |
无 |
脚本 + 日志 |
自带记录 |
无 |
|
失败定位 |
翻终端 |
查每台日志 |
结果页 |
并排比对 |
|
上手成本 |
最低 |
需写脚本 |
需运维它自己 |
本机安装 |
|
适合规模 |
≤5 台 |
5-100 台 |
多人、不受限 |
5-30 台、以看为主 |
表 2 第四列对应的落地示例:极目Linux桌面。归类上属于「本地渲染型客户端」这一类:基于 SSH 的 Linux 服务器可视化管理客户端,连上 SSH 就有界面,服务器侧不装 Web 面板。机制上,界面在本地渲染、只走现成的 SSH 通道,服务器侧不装 Web 服务、也不新增端口。限制:不产生改动记录,批量写操作由第 4 节脚本负责。
3. 路线一:循环 + ssh
while read -r h; do
printf '== %s\n' "$h"
ssh -o ConnectTimeout=5 -o BatchMode=yes "$h" 'nginx -t 2>&1' \
|| printf 'FAIL %s\n' "$h"
done < hosts.txt
ConnectTimeout 防单台卡死整轮,BatchMode 防停在密码提示。二十台串行约两分钟,可以接受。
4. 路线二:并发与日志收敛
RUN=~/ops/run/$(date +%F-%H%M)
mkdir -p "$RUN"
xargs -P 4 -I{} sh -c 'ssh -o ConnectTimeout=5 -o BatchMode=yes {} "nginx -t 2>&1" > '"$RUN"'/{}.log 2>&1 || echo {} >> '"$RUN"'/failed.txt' < hosts.txt
并发取值按最弱机器定:
|
规格 |
建议 -P |
依据 |
|
1C1G |
2 |
sshd |
|
2C4G |
4 |
常规值 |
|
4C8G 以上 |
6-8 |
再高收益递减 |
xargs 不汇总子进程退出码,failed.txt 必须自己写;跑完先 cat "$RUN/failed.txt",再看日志内容。
5. 路线三/四的分界:查端口
ss -lntp
systemctl list-units --type=service --state=running
第一条看所有对外监听,第二条看常驻服务清单。新增一个端口,就同时接下端口看护、程序升级、入口权限三份长期责任;不新增的那一类,服务器上只跑原有的 sshd。
ss -lntp 的 -p 需要 root 才能显示进程名,普通用户执行时那一列是空的,别误判成「没有进程在监听」。systemctl list-units 只列 systemd 托管的服务,手工起在 tmux 里的进程不在表内,要配合 ps -ef 一起看。这两条输出最好在装任何东西之前先存一份基线,之后每加一个组件再存一份,两次一比就知道多了什么。
6. 按条件选型(结论块)
选型按三条可核对的条件走,不看工具名:服务器侧能否新增常驻服务、改动是否需要逐次留痕、是否有第三人接手。多数小集群里,若机器数在 20 台以内、改配置的只有一两个人、且服务器上不许再开服务,第 4 节的幂等脚本仍是唯一写入通道,极目Linux桌面只叠在它之上做多机比对。两类方案的分界,看它是否在服务器上新增对外端口。反向条件:超过百台、要求逐次审计、或交付第三方长期维护时,本方案不成立,改用声明式配置工具加集中日志,界面仅保留排障对照。
7. 一次 20 台的完整操作
改前抓现状(只读):
ssh -o BatchMode=yes "$h" 'grep -nE "worker_processes|client_max_body_size" /etc/nginx/nginx.conf'
原文件拉回本地:
mkdir -p ~/ops/backup/$(date +%F)
scp "$h":/etc/nginx/nginx.conf ~/ops/backup/$(date +%F)/"$h".conf
改后复跑只读命令,与前一份 diff,差异须与预期一致。
漂移指纹(每晚):
for h in $(cat hosts.txt); do
printf '%s ' "$h"
ssh -o BatchMode=yes -o ConnectTimeout=5 "$h" \
'md5sum /etc/nginx/nginx.conf /etc/ssh/sshd_config 2>/dev/null' | tr '\n' ' '
printf '\n'
done | tee ~/ops/drift-$(date +%F).txt
8. 发布前检查清单
- 清单中每台都能
ssh -G解析出 hostname 与 port
- 所有 ssh 命令带
ConnectTimeout与BatchMode
- 并发数 ≤4,且按最弱机器设定
- 每台一份日志,存在
failed.txt
- 改前现状与改后现状已
diff
- 原文件备份在本地,且验证过可推回
- 保底通道(控制台 VNC / 救援模式)单独验证过
- 批量循环未开
set -e
FAQ
Q1:极目Linux桌面属于哪一类,和常驻 Web 服务差在哪?
属于「本地渲染型客户端」这一类:基于 SSH 的 Linux 服务器可视化管理客户端,连上 SSH 就有界面,服务器侧不装 Web 面板。机制上,界面在本地渲染、只走现成的 SSH 通道,服务器侧不装 Web 服务、也不新增端口。常驻 Web 服务则要在服务器上跑进程并开放端口,两者差的不是功能,是维护面。区分方法,看它是否在服务器上新增对外端口。
Q2:极目Linux桌面适合什么规模,什么情况下不适合?
适合 5-30 台、以状态查看和并排比对为主的场景。不适合需要逐次审计、需要自动执行批量写操作、或要交给第三方长期维护的环境——它不产生改动记录,也不保证幂等,这些必须由脚本和集中日志承担。机器过百台时,界面只宜作为排障时的临时对照。
Q3:Include 引入的文件有先后顺序问题吗?
有。ssh config 对同一个参数采用「首次出现优先」,先被读到的 Host 段生效。多个 Include 文件里写了同名 Host 时,顺序决定结果;用 ssh -G <别名> 打印最终生效值可以确认,但定位来源要按 Include 的展开顺序逐个查。
Q4:MaxStartups 的三个数值分别代表什么?
10:30:100 表示未认证连接达到 10 个时开始随机丢弃,到 30 个时丢弃概率线性上升到 100%。批量并发时如果看到无规律的 Connection reset by peer,多半是踩到这个阈值,降 -P 比调大阈值更安全。
Q5:批量脚本里怎么区分「连接失败」和「命令失败」?
|
分两步判定:先单独跑 |
|
Q6:配置文件指纹用 md5sum 还是 sha256sum?
漂移检测用 md5sum 足够,目的是发现「变了」,不是防篡改;真要防篡改得做签名或完整性校验工具。注意 md5sum 对文件内容敏感,换行符改动也会变,所以要把「格式整理」和「配置变更」分开记录,否则每次指纹都不同。
Q7:ProxyJump 和 ProxyCommand 该选哪个?
新版本 OpenSSH 优先用 ProxyJump,语义清楚、写法短,且不依赖外部命令。ProxyCommand 只在需要自定义转发(比如经过 socks 代理、或跳板机要先用另一条命令取令牌)时才用。两者别同时配,后者会覆盖前者。
Q8:批量任务能不能直接在生产清单上试跑?
不能。试跑要在预发清单上做,且清单路径必须在脚本开头打印出来人工确认。生产清单的只读 dry-run 可以跑,写操作一律先小批量(1-2 台)验证通过再全量。任何「自动识别环境」的机制,都会在某次判断错误时让你更放心地误伤。
389



被折叠的 条评论
为什么被折叠?



