1.
前提准备与安全建议
小分段:a) 使用 SSH 密钥对(推荐),避免明文密码;b) 本地安装 OpenSSH client;c) 确认目标
香港云服务器可达(ping 或 telnet 22)。
2.
生成并分发 SSH 密钥
小分段:a) 生成密钥:ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_hk;b) 逐台或批量分发:ssh-copy-id -i ~/.ssh/id_rsa_hk.pub user@IP;c) 若无 ssh-copy-id,可用 scp ~/.ssh/id_rsa_hk.pub user@IP:'~/.ssh/authorized_keys' 并调整权限 chmod 600。
3.
整理目标主机清单(hosts 文件)
小分段:a) 在本地创建 hosts.txt,每行一个 IP 或 user@IP;示例:root@1.2.3.4;b) 将端口号非默认时写成 user@IP:PORT;c) 便于维护可加注释并定期同步。
4.
选择批量执行工具(pssh / parallel-ssh / ansible)
小分段:a) 简单并发可用 pssh:apt install pssh 或 pip install parallel-ssh;b) 复杂部署建议 Ansible(无 agent、基于 SSH);c) 本文以 pssh 和纯 bash 两种方式示例。
5.
pssh 并发执行示例
小分段:a) 安装:pip3 install parallel-ssh;b) 命令示例:pssh -h hosts.txt -l root -i -x "-i ~/.ssh/id_rsa_hk -o StrictHostKeyChecking=no" "cd /opt/app && git pull && docker-compose pull && docker-compose up -d";c) -i 输出每台结果,-t 可设置超时。
6.
纯 Bash 循环与并发示例(适合小规模)
小分段:a) 脚本示例(deploy_all.sh):
#!/bin/bash
KEY=~/.ssh/id_rsa_hk
while read HOST; do
&& ssh -o StrictHostKeyChecking=no -i ${KEY} ${HOST} 'bash -s' < ./deploy.sh > logs/${HOST//[:@.]/_}.log 2>&1 &
done < hosts.txt
wait
b) deploy.sh 中写具体部署:git pull; docker-compose up -d; systemctl restart myservice。
7.
处理首次连接与 known_hosts
小分段:a) 使用 -o StrictHostKeyChecking=no 可自动接受主机密钥(有风险,仅在可信网络使用);b) 或预先用 ssh-keyscan -H IP >> ~/.ssh/known_hosts 批量写入;c) 确保文件权限为 644/600 合理设置。
8.
日志、错误处理与回滚
小分段:a) 每台输出重定向到独立日志,便于排查;b) 在 deploy.sh 内对关键步骤添加返回值判断,失败时执行回滚脚本 rollback.sh;c) 可使用邮件或 Webhook 汇报执行结果。
9.
自动化定时与 CI 集成
小分段:a) 把 deploy_all.sh 加入 CI(如 GitLab CI)或 Jenkins,触发时运行;b) 本地定时用 crontab -e 写入执行周期;c) 注意密钥权限与密钥在 CI 中的安全存储(使用 Secret 管理)。
10.
示例安全注意与常见问题
小分段:a) 不要在脚本里存明文密码,使用密钥或密钥 passphrase+agent;b) 防火墙放行必要端口并限制来源 IP;c) 若并发过大可导致目标主机连接数溢出,使用限速或分批执行。
11.
问:如何在批量登录时避免手动输入密码?
小分段:答:使用 SSH 密钥对是最安全便捷的方式。生成密钥对后用 ssh-copy-id 批量分发公钥,或将公钥追加到目标服务器 ~/.ssh/authorized_keys。避免使用 sshpass 明文密码,若必须使用则确保运行环境受限且权限受控。
12.
问:如果需要并发数百台服务器,推荐哪种方案?
小分段:答:建议使用 Ansible 或分布式并发工具(如 fabric + 批量 runner、或商业运维平台)。Ansible 无需在目标安装 agent,支持并发控制、失败重试和复杂剧本,适合大规模批量部署。
13.
问:部署失败如何做自动回滚与告警?
小分段:答:在 deploy.sh 中每步判断执行状态($?),失败时调用 rollback.sh 执行回滚动作,并通过 curl 调用企业微信/邮件 API 发送告警。同时在 pssh 或脚本外层收集返回码,写入集中日志或 CI 报告。
来源:自动化脚本实现批量登录香港云服务器并执行部署任务