批量服务器操作实战:100台服务器一键管控(含脚本+避坑指南)
在大规模服务器运维场景中,手动逐台操作100台服务器不仅效率低下,还极易出现人为失误。本文将基于SSH协议实现100台服务器的一键管控,涵盖批量执行命令、文件分发、状态监控等核心功能,并结合实战经验梳理避坑指南,帮助你高效、安全地管理服务器集群。
一、前置准备
1. 核心依赖
- 环境要求:控制端为Linux系统(推荐CentOS7+/Ubuntu18.04+),被控端为Linux系统(主流发行版均可)。
- 核心工具 :
sshpass:免交互输入SSH密码(测试环境可用,生产环境优先密钥认证);ansible(可选):进阶批量运维工具,本文先基于原生Shell+SSH实现基础版,再补充Ansible进阶方案;parallel-ssh:高性能并行SSH工具,适合大规模服务器批量操作。
2. 环境初始化(控制端)
bash
# CentOS/RHEL
yum install -y sshpass openssh-clients parallel-ssh
# Ubuntu/Debian
apt update && apt install -y sshpass openssh-clients pssh
3. 服务器信息整理
新建服务器清单文件 server_list.txt,格式为 IP:端口:用户名:密码(生产环境建议仅保留IP,用密钥认证):
192.168.1.10:22:root:Passwd@123
192.168.1.11:22:root:Passwd@123
192.168.1.12:22:root:Passwd@123
# ... 共100台服务器,按此格式补充
二、核心脚本实现(基础版:Shell+SSH)
1. 批量执行命令脚本(run_cmd.sh)
该脚本可一键在100台服务器上执行指定命令(如查看内存、重启服务、安装软件等)。
bash
#!/bin/bash
# 批量执行命令脚本
# 使用方式:./run_cmd.sh "要执行的命令"
# 检查参数
if [ $# -ne 1 ]; then
echo "用法错误!示例:./run_cmd.sh 'free -m'"
exit 1
fi
CMD=$1
SERVER_LIST="./server_list.txt"
LOG_DIR="./batch_log"
mkdir -p $LOG_DIR # 创建日志目录,记录每台服务器执行结果
# 遍历服务器清单执行命令
while IFS=":" read -r IP PORT USER PWD; do
# 跳过空行和注释行
if [[ -z $IP || $IP =~ ^# ]]; then
continue
fi
echo "===== 开始执行 $IP ====="
# 核心命令:SSH免交互执行,输出日志到指定文件
sshpass -p "$PWD" ssh -o StrictHostKeyChecking=no -p "$PORT" "$USER"@"$IP" "$CMD" > "$LOG_DIR/$IP.log" 2>&1
# 检查执行结果
if [ $? -eq 0 ]; then
echo "$IP 执行成功,日志:$LOG_DIR/$IP.log"
else
echo "$IP 执行失败,日志:$LOG_DIR/$IP.log"
fi
done < "$SERVER_LIST"
echo "===== 所有服务器执行完成 ====="
2. 批量分发文件脚本(send_file.sh)
用于将控制端文件一键分发到100台服务器指定目录(如配置文件、安装包)。
bash
#!/bin/bash
# 批量分发文件脚本
# 使用方式:./send_file.sh 本地文件路径 目标服务器路径
# 检查参数
if [ $# -ne 2 ]; then
echo "用法错误!示例:./send_file.sh /local/test.txt /remote/test.txt"
exit 1
fi
LOCAL_FILE=$1
REMOTE_PATH=$2
SERVER_LIST="./server_list.txt"
LOG_DIR="./batch_log"
mkdir -p $LOG_DIR
# 检查本地文件是否存在
if [ ! -f "$LOCAL_FILE" ]; then
echo "错误:本地文件 $LOCAL_FILE 不存在!"
exit 1
fi
# 遍历服务器分发文件
while IFS=":" read -r IP PORT USER PWD; do
if [[ -z $IP || $IP =~ ^# ]]; then
continue
fi
echo "===== 开始分发到 $IP ====="
# 核心命令:scp免交互分发文件
sshpass -p "$PWD" scp -o StrictHostKeyChecking=no -P "$PORT" "$LOCAL_FILE" "$USER"@"$IP":"$REMOTE_PATH" > "$LOG_DIR/$IP.send.log" 2>&1
if [ $? -eq 0 ]; then
echo "$IP 分发成功,日志:$LOG_DIR/$IP.send.log"
else
echo "$IP 分发失败,日志:$LOG_DIR/$IP.send.log"
fi
done < "$SERVER_LIST"
echo "===== 所有服务器分发完成 ====="
3. 脚本使用示例
bash
# 1. 批量查看所有服务器内存使用情况
chmod +x run_cmd.sh
./run_cmd.sh "free -m"
# 2. 批量分发nginx配置文件到所有服务器
chmod +x send_file.sh
./send_file.sh /etc/nginx/nginx.conf /etc/nginx/nginx.conf
# 3. 批量重启nginx服务
./run_cmd.sh "systemctl restart nginx && systemctl status nginx"
三、进阶方案:Ansible批量管控(推荐生产环境)
Shell脚本适合简单场景,100台服务器规模推荐使用Ansible,效率更高、安全性更强,且无需编写复杂循环。
1. Ansible配置
(1)安装Ansible
bash
# CentOS/RHEL
yum install -y ansible
# Ubuntu/Debian
apt install -y ansible
(2)配置主机清单(/etc/ansible/hosts)
ini
[servers]
192.168.1.10 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=Passwd@123
192.168.1.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=Passwd@123
# ... 补充剩余98台服务器
2. Ansible一键管控示例
bash
# 1. 批量执行命令(查看内存)
ansible servers -m command -a "free -m"
# 2. 批量分发文件
ansible servers -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf"
# 3. 批量安装软件(如nginx)
ansible servers -m yum -a "name=nginx state=installed"
# 4. 批量重启服务并检查状态
ansible servers -m service -a "name=nginx state=restarted"
ansible servers -m command -a "systemctl status nginx | grep Active"
# 5. 并行执行(指定并发数,100台建议设50)
ansible servers -f 50 -m command -a "df -h"
四、实战避坑指南(100台服务器必看)
1. 网络与连接类坑
-
坑1 :SSH连接超时/卡顿,批量操作时部分服务器无响应。
✅ 避坑方案:
- 脚本中添加超时参数:
ssh -o ConnectTimeout=5 -o ConnectionAttempts=2; - 提前检查服务器网络连通性:
ping -c 1 $IP,过滤不可达服务器; - 生产环境使用SSH长连接,修改
/etc/ssh/ssh_config:ControlMaster auto、ControlPersist 30s。
- 脚本中添加超时参数:
-
坑2 :首次连接服务器时,SSH主机密钥验证弹窗中断批量执行。
✅ 避坑方案:脚本中添加
-o StrictHostKeyChecking=no(测试环境),生产环境提前批量导入公钥。
2. 权限与安全类坑
-
坑3 :使用密码明文存储在
server_list.txt,存在泄露风险。✅ 避坑方案:
- 生产环境禁用密码认证,改用SSH密钥:
ssh-copy-id root@$IP,批量导入公钥; - 对服务器清单文件加密:
chmod 600 server_list.txt,仅运维用户可读取; - 进阶方案:使用Vault加密Ansible密码(
ansible-vault encrypt)。
- 生产环境禁用密码认证,改用SSH密钥:
-
坑4 :批量执行命令时权限不足(如普通用户执行root命令)。
✅ 避坑方案:
- 命令中添加
sudo:./run_cmd.sh "sudo systemctl restart nginx"; - 被控端配置sudo免密:
echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers(仅授权必要命令)。
- 命令中添加
3. 执行效率与稳定性类坑
-
坑5 :100台服务器串行执行,耗时过长(每台10秒,总计1000秒)。
✅ 避坑方案:
- Shell脚本改用并行执行(
xargs -P或parallel); - Ansible指定并发数(
-f 50),平衡效率与服务器负载; - 使用
parallel-ssh工具:pssh -h server_list.txt -i "free -m"(原生支持并行)。
- Shell脚本改用并行执行(
-
坑6 :批量操作时部分服务器执行失败,无日志追溯。
✅ 避坑方案:
- 所有脚本强制输出日志到文件,按IP命名;
- 执行完成后生成汇总报告:
grep "执行失败" $LOG_DIR/*.log > fail_report.txt; - 关键操作(如修改配置、重启服务)先在1-2台测试机验证,再批量执行。
4. 业务影响类坑
- 坑7 :批量重启服务时,100台服务器同时重启导致业务雪崩。
✅ 避坑方案:- 分批执行:将服务器清单按批次拆分(如每20台一批),间隔5分钟执行;
- Ansible使用
--limit指定批次:ansible servers --limit 192.168.1.*:10-30 -m service -a "name=nginx state=restarted"; - 核心业务服务器添加执行前确认:
read -p "确认重启100台服务器nginx?(y/n)" res && [ $res = y ] || exit 0。
五、脚本优化建议(适配100台规模)
- 异步执行:将长耗时操作(如安装软件)改为异步,避免阻塞;
- 状态监控:增加服务器在线状态检测,执行前过滤离线节点;
- 结果汇总:执行完成后自动生成Excel/CSV报告,包含每台服务器执行状态、耗时、日志路径;
- 异常重试:对执行失败的服务器自动重试1-2次,减少人工干预。
总结
- 100台服务器批量管控可选择「Shell+SSH」(简单场景)或「Ansible」(生产环境),核心是标准化服务器清单和日志追溯;
- 避坑核心点:优先使用SSH密钥认证、控制并发数、分批执行核心操作、全量日志记录;
- 生产环境需兼顾效率与安全,禁止密码明文存储,关键操作先测试后批量执行。
通过本文的脚本和避坑指南,你可实现100台服务器的一键命令执行、文件分发、服务管控,大幅降低运维成本,同时避免大规模操作中的常见风险。