运维自动化脚本编写,批量操作多台服务器

如果你手上有三台以上服务器,重复登录执行相同命令会非常低效。
运维自动化脚本编写,批量操作多台服务器的核心思路是:先配置SSH免密登录,再用Shell循环或pssh工具批量执行命令,最后检查输出确认结果。
下面从零开始,带你完成整个流程。

准备工作:清单、免密与连通性检查

动手写脚本前,先确认三件事:服务器IP列表、统一登录用户、SSH端口。
建议新建一个文本文件存放IP,每行一个,例如 /tmp/hosts.txt:

192.168.1.101
192.168.1.102
192.168.1.103

接着配置SSH免密登录,否则每次连接都要输密码。
在本地管理机执行:

ssh-keygen -t rsa -b 2048
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
ssh-copy-id root@192.168.1.103

验证免密是否生效:

ssh root@192.168.1.101 "hostname"

如果直接返回主机名且没提示输密码,说明配置成功。建议先用一台机器测试通过,再批量复制到其他机器,避免因网络或防火墙问题反复失败。

两种批量执行方式:Shell循环与pssh

最基础的方式是用 for 循环读取IP列表并逐台执行。
创建脚本 batch_run.sh:

#!/bin/bash
for ip in $(cat /tmp/hosts.txt)
do
  echo "===== $ip ====="
  ssh root@$ip "uptime"
done

赋予执行权限并运行:

chmod +x batch_run.sh
./batch_run.sh

这种方式适合服务器数量少、命令执行时间短的场景。
如果服务器超过10台,串行执行会明显变慢,推荐使用 pssh 工具并行执行。
安装方式因系统而异,CentOS可尝试 yum install pssh,Ubuntu可尝试 apt install pssh,若仓库没有可改用 parallel-ssh 包。

使用pssh批量执行:

pssh -h /tmp/hosts.txt -l root -i "uptime"

参数说明:-h 指定主机文件,-l 指定登录用户,-i 表示显示每台机器的输出。并行执行能大幅缩短等待时间,但要注意命令本身是否适合并发操作,比如同时重启服务可能引发短暂不可用。

避坑指南:权限、超时与危险命令

批量操作最容易踩的坑集中在三方面。
第一,权限问题:如果登录用户不是root,执行需要提权的命令会失败,建议在脚本中使用 sudo 并确保该用户有免密sudo权限,或者直接用root账号操作。
第二,超时与卡顿:网络不通时SSH可能长时间挂起,可以在 ssh 命令中加入 -o ConnectTimeout=5 限制连接超时,例如:

ssh -o ConnectTimeout=5 root@$ip "df -h"

第三,危险命令无二次确认:像 rm -rf、reboot、shutdown 这类命令一旦批量执行后果严重。
建议先在脚本里加 echo 打印将要执行的内容,确认无误后再去掉 echo 真正执行。
另外,如果服务器SSH端口不是默认22,需要加 -p 端口号,主机文件里也可以写成 IP:端口 格式,但需要确认工具是否支持。

结果验证:如何确认批量操作真的生效

脚本跑完不代表任务完成,必须逐项核对。
对于 uptime、df -h 这类查询命令,直接看输出是否每台都有返回即可。
对于修改类操作,例如批量创建目录,建议在脚本末尾追加验证命令:

for ip in $(cat /tmp/hosts.txt)
do
  echo "===== $ip ====="
  ssh root@$ip "ls -ld /data/backup"
done

如果某台机器没有输出或报错,
单独登录该机器排查。建议把每次批量操作的输出重定向到日志文件,
例如 ./batch_run.sh > /tmp/batch_$(date +%F).log 2>&1,
方便事后复查。

常见疑问

脚本执行时提示“Host key verification failed”怎么办?
这是首次连接新主机时SSH询问是否信任指纹导致的。可以临时使用 -o StrictHostKeyChecking=no 跳过检查,但生产环境建议先手动连接一次确认指纹。

主机文件里能不能写注释?
标准pssh主机文件不支持行内注释,Shell循环读取时如果遇到空行或 # 开头的行会报错。建议保持主机文件每行只有IP或IP:端口,不要混入注释。

批量执行时部分机器成功、部分失败,如何快速定位?
优先看日志中失败机器返回的错误信息。常见原因是网络不通、认证失败、命令不存在。可以先用 ping 和 ssh -o ConnectTimeout=5 单独测试失败机器,确认基础连通性后再重新执行。

能不能用Ansible替代脚本?
可以。Ansible适合更复杂的批量配置管理,但学习成本高于Shell脚本。如果只是偶尔执行几条命令,Shell加pssh足够;如果需要频繁下发配置、管理文件,建议后续学习Ansible。

掌握以上步骤后,你已经能用运维自动化脚本批量操作多台服务器。
建议先在小规模环境验证脚本逻辑,再逐步扩大范围,每次操作保留日志,遇到异常优先检查网络、权限和命令兼容性。

分享到:
上一篇
Zabbix运维监控部署,服务器异常自动告警
下一篇
Ansible批量管理服务器,批量推送网站配置
1
系统公告

关于香港云优质服务器IP地址更换的通知

尊敬的客户: 因原IP运营商大幅涨价,为避免成本转嫁至用户,我司决定更换IP服务商。本次更换后,您的续费价格将保持不变,且新IP网络质量与服务标准不受影响。新IP已分配至后台,即刻生效(更换的新IP都是香港原生IPv4)。 涉及 IP 段: 45.192.x.x 旧 IP 停用时间: 2026 年 12 月 1 日
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意