多异构服务商Ubuntu 22.04+Docker Compose环境下,10+服务器爬虫工作流自动化管理咨询
兄弟,我太懂你这种挨个SSH登10多台服务器重复操作的痛苦了——光是输命令、等执行完都能耗掉大半天,还容易手滑输错指令😂。结合你用Ubuntu 22.04+Docker Compose的环境,给你几个从简单到进阶的方案,完全不会过度工程化:
一、最简方案:SSH批量执行脚本(零新工具学习成本)
如果你不想学新工具,先把SSH免密登录搞定(这是所有批量操作的基础),然后写个简单的bash脚本就能搞定重复操作:
先配置免密登录:
在你的本地机器上生成密钥(如果还没的话):ssh-keygen -t ed25519然后把公钥批量传到所有服务器:
# 假设你有个servers.txt,每行是服务器的IP/域名+用户名,比如 ubuntu@192.168.1.100 while read server; do ssh-copy-id $server done < servers.txt写批量执行脚本(比如
deploy_scraper.sh):#!/bin/bash # 服务器列表文件 SERVERS="servers.txt" # 要执行的命令,比如拉取代码、安装依赖、重启compose COMMANDS=" cd /path/to/your/scraper-repo && git pull pip install -r requirements.txt docker-compose down && docker-compose up -d " while read server; do echo "=== 正在处理服务器 $server ===" ssh $server "$COMMANDS" done < $SERVERS给脚本加执行权限:
chmod +x deploy_scraper.sh,之后跑./deploy_scraper.sh就能批量操作所有服务器了。👉 小技巧:如果不同服务商的服务器有差异(比如路径不同),可以把servers.txt分成不同分组文件(比如
aws_servers.txt、azure_servers.txt),脚本里指定对应文件就行。
二、Ansible:其实没你想的那么复杂(推荐)
你提到考虑Ansible但怕复杂,其实对于10多台机器的场景,Ansible的配置超简单,完全不算过度工程化——它是无代理的,只依赖SSH,和你现有环境完美适配。
先在本地装Ansible:
sudo apt update && sudo apt install ansible写inventory文件(比如
hosts.ini):[scraper_servers] server1 ansible_host=192.168.1.100 ansible_user=ubuntu server2 ansible_host=192.168.1.101 ansible_user=ubuntu # 把所有10+台服务器都列在这里写极简playbook(比如
deploy.yml):- name: 部署爬虫服务 hosts: scraper_servers tasks: - name: 拉取最新代码 git: repo: "git@your-repo-url.git" dest: /path/to/your/scraper-repo version: main update: yes - name: 安装Python依赖 pip: requirements: /path/to/your/scraper-repo/requirements.txt executable: pip3 - name: 重启Docker Compose服务 docker_compose: project_src: /path/to/your/scraper-repo state: restarted执行playbook:
ansible-playbook deploy.yml -i hosts.ini👉 优势:Ansible会自动处理执行结果,失败的服务器会高亮提示,还能并行执行(默认5个,可通过
-f 10改成10个并行),比脚本更可靠,而且配置文件可以复用,后续加新服务器只需要在inventory里加一行就行。
三、结合Docker Compose的进阶优化:用镜像代替服务器端安装
既然你已经在用Docker Compose,其实可以把爬虫的依赖都打包到Docker镜像里,服务器端只需要拉取镜像重启容器,完全不用在服务器上装库:
把爬虫代码和Dockerfile放到代码仓库,构建镜像后推到私有镜像仓库(比如Docker Hub私有库,或者本地搭个简单的registry):
docker build -t your-username/scraper:latest . docker push your-username/scraper:latest然后把批量操作的命令改成拉取镜像+重启compose:
脚本里的命令改成:cd /path/to/your/scraper-repo && git pull docker-compose pull && docker-compose up -d或者Ansible playbook里的任务简化成:
- name: 拉取最新代码 git: repo: "git@your-repo-url.git" dest: /path/to/your/scraper-repo version: main update: yes - name: 重启Docker Compose服务(拉取最新镜像) docker_compose: project_src: /path/to/your/scraper-repo pull: yes state: restarted这样服务器上完全不用管依赖安装,所有环境都在镜像里,更稳定也更省心。
额外小建议
- 把你的Docker Compose文件也放到代码仓库里,确保所有服务器用的是同一个配置;
- 如果怕误操作,可以先在一台测试服务器上跑脚本/playbook,没问题再批量执行;
- 可以给脚本/playbook加个简单的日志输出,方便事后排查问题。
备注:内容来源于stack exchange,提问作者robokonk

