运维自动化脚本编写,批量操作多台服务器
如果你手上有三台以上服务器,重复登录执行相同命令会非常低效。
运维自动化脚本编写,批量操作多台服务器的核心思路是:先配置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。
掌握以上步骤后,你已经能用运维自动化脚本批量操作多台服务器。
建议先在小规模环境验证脚本逻辑,再逐步扩大范围,每次操作保留日志,遇到异常优先检查网络、权限和命令兼容性。