Shell脚本批量管理服务器实践
批量服务器管理的常见挑战
在IDC运维中,当需要同时对数台甚至上百台服务器执行同一命令(如更新配置、检查状态、批量部署)时,逐台SSH登录的效率极低。手动操作不仅耗时,还容易因遗漏或输入错误导致运维事故。Shell脚本结合SSH免密认证,是实现轻量级批量管控的首选方案。
核心思路与准备工作
1. 建立SSH互信
在所有目标服务器上部署相同的公钥,确保管控机无需密码即可登录。典型命令如下:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" ssh-copy-id user@server_ip
建议将目标服务器IP存入一个文本文件(如server_list.txt),每行一个IP。
2. 批量执行脚本示例
以下脚本遍历服务器列表,通过SSH执行指定命令:
#!/bin/bash
SERVER_LIST="server_list.txt"
CMD=$1
if [ -z "$CMD" ]; then
echo "Usage: $0 "
exit 1
fi
while IFS= read -r ip; do
echo "=== $ip ==="
ssh -o StrictHostKeyChecking=no user@$ip "$CMD"
done < "$SERVER_LIST"
将此脚本保存为batch_exec.sh,使用时即可直接批量执行如./batch_exec.sh "uptime"查看所有服务器的负载。
进阶功能与优化
1. 并行执行提升效率
顺序执行在大批量时较慢,可借助GNU Parallel或Shell后台进程实现并发。例如:
while IFS= read -r ip; do
(
ssh user@$ip "your_command" &
)
done < server_list.txt
wait
注意控制最大并发数(如使用jobs和wait限制),避免同时发起过多连接导致管控机资源耗尽。
2. 结果记录与异常处理
将每条命令的输出重定向到独立日志文件,并捕获SSH返回值。可以使用数组或临时文件汇总结果:
LOG_DIR="logs/$(date +%Y%m%d%H%M%S)"
mkdir -p $LOG_DIR
while IFS= read -r ip; do
ssh user@$ip "your_command" > "$LOG_DIR/${ip}.log" 2>&1
if [ $? -ne 0 ]; then
echo "$ip 执行失败" >> "$LOG_DIR/error.txt"
fi
done < server_list.txt
注意事项
- 密钥安全:管控机的私钥必须设置强密码备份,防止泄露后所有服务器失陷。
- 命令转义:如果包含管道、变量或特殊字符,需用引号包裹或使用
bash -c方式执行。 - 环境差异:不同服务器可能使用不同Shell或工具版本,建议在脚本开头
#!/bin/bash明确指定。 - 回滚方案:批量修改文件前,先备份原始文件,或使用
--dry-run模拟执行。
总结
Shell脚本结合SSH免密认证是IDC运维中低成本、高效率的批量管理手段。通过合理设计并发控制、错误处理与日志记录,运维人员可以在几分钟内完成对数百台服务器的巡检、配置更新或临时任务。该方案无需额外安装Agent,适用于绝大多数Linux环境。对于更复杂的配置管理需求,可进一步结合Ansible或SaltStack等工具,但Shell脚本依然是最灵活的基础技能。