上一篇 下一篇 分享链接 返回 返回顶部

Shell脚本批量管理服务器实践

发布人: 发布时间:9小时前 阅读量:3

批量服务器管理的常见挑战

在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

注意控制最大并发数(如使用jobswait限制),避免同时发起过多连接导致管控机资源耗尽。

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脚本依然是最灵活的基础技能。

目录结构
全文
企业微信 企业微信
微信公众号 微信公众号
服务热线: 400-790-1688
电子邮箱: 3310008520@qq.com