--- - name: Docker Swarm Migration Plan for ash3c hosts: ash3c become: yes gather_facts: yes vars: # 定义服务迁移计划 swarm_services: high_priority: - name: ghproxy image: wjqserver/ghproxy:latest ports: "8046:8080" replicas: 2 networks: ["app-network"] - name: redis image: redis:latest ports: "63789:6379" replicas: 1 networks: ["app-network"] volumes: ["redis-data:/data"] medium_priority: - name: consul image: bitnami/consul:latest ports: - "8310:8300" - "8311:8301" - "8312:8302" - "8501:8500" - "8601:8600/udp" replicas: 1 networks: ["consul-network"] - name: discourse-app image: bitnami/discourse:3.4.1 ports: "31080:3000" replicas: 1 networks: ["app-network"] depends_on: ["postgres", "redis"] - name: discourse-sidekiq image: bitnami/discourse:3.4.1 replicas: 1 networks: ["app-network"] depends_on: ["postgres", "redis"] low_priority: - name: elasticsearch image: bitnami/elasticsearch:8.17.2 ports: "59200:9200" replicas: 1 networks: ["elastic-network"] volumes: ["elastic-data:/bitnami/elasticsearch/data"] constraints: ["node.role==manager"] - name: postgres image: postgres:17.2 ports: "54322:5432" replicas: 1 networks: ["db-network"] volumes: ["postgres-data:/var/lib/postgresql/data"] constraints: ["node.role==manager"] secrets: ["postgres_password"] tasks: - name: Display migration plan debug: msg: | 🚀 DOCKER SWARM MIGRATION PLAN FOR {{ inventory_hostname }} ========================================================= 📋 PHASE 1 - HIGH PRIORITY (Low Risk) {% for service in swarm_services.high_priority %} ✅ {{ service.name }}: - Image: {{ service.image }} - Replicas: {{ service.replicas }} - Networks: {{ service.networks | join(', ') }} - Migration: Safe, stateless service {% endfor %} 📋 PHASE 2 - MEDIUM PRIORITY (Medium Risk) {% for service in swarm_services.medium_priority %} ⚠️ {{ service.name }}: - Image: {{ service.image }} - Replicas: {{ service.replicas }} - Networks: {{ service.networks | join(', ') }} - Migration: Requires coordination {% endfor %} 📋 PHASE 3 - LOW PRIORITY (High Risk) {% for service in swarm_services.low_priority %} 🔴 {{ service.name }}: - Image: {{ service.image }} - Replicas: {{ service.replicas }} - Networks: {{ service.networks | join(', ') }} - Migration: Requires careful planning {% endfor %} - name: Create migration script copy: content: | #!/bin/bash # Docker Swarm Migration Script for {{ inventory_hostname }} # Generated: {{ ansible_date_time.iso8601 }} set -e echo "🚀 Starting Docker Swarm Migration..." # Create networks echo "📡 Creating overlay networks..." docker network create -d overlay --attachable app-network || true docker network create -d overlay --attachable db-network || true docker network create -d overlay --attachable consul-network || true docker network create -d overlay --attachable elastic-network || true # Create volumes echo "💾 Creating volumes..." docker volume create redis-data || true docker volume create postgres-data || true docker volume create elastic-data || true # Create secrets (example) echo "🔐 Creating secrets..." echo "your_postgres_password" | docker secret create postgres_password - || true echo "✅ Infrastructure setup complete!" echo "" echo "🔄 PHASE 1 - Migrate high priority services:" echo "docker service create --name ghproxy-svc --replicas 2 --network app-network -p 8046:8080 wjqserver/ghproxy:latest" echo "docker service create --name redis-svc --replicas 1 --network app-network -p 63789:6379 --mount type=volume,source=redis-data,target=/data redis:latest" echo "" echo "🔄 PHASE 2 - Migrate medium priority services:" echo "docker service create --name consul-svc --replicas 1 --network consul-network -p 8310:8300 -p 8311:8301 -p 8312:8302 -p 8501:8500 -p 8601:8600/udp bitnami/consul:latest" echo "docker service create --name discourse-app-svc --replicas 1 --network app-network -p 31080:3000 bitnami/discourse:3.4.1" echo "docker service create --name discourse-sidekiq-svc --replicas 1 --network app-network bitnami/discourse:3.4.1" echo "" echo "🔄 PHASE 3 - Migrate low priority services (CAREFUL!):" echo "docker service create --name postgres-svc --replicas 1 --network db-network -p 54322:5432 --mount type=volume,source=postgres-data,target=/var/lib/postgresql/data --secret postgres_password --constraint 'node.role==manager' postgres:17.2" echo "docker service create --name elasticsearch-svc --replicas 1 --network elastic-network -p 59200:9200 --mount type=volume,source=elastic-data,target=/bitnami/elasticsearch/data --constraint 'node.role==manager' bitnami/elasticsearch:8.17.2" echo "" echo "📊 Monitor services:" echo "docker service ls" echo "docker service ps " echo "" echo "⚠️ IMPORTANT NOTES:" echo "1. Stop original containers before creating services" echo "2. Backup data before migrating databases" echo "3. Test each phase before proceeding" echo "4. Monitor logs: docker service logs " dest: "/tmp/swarm-migration-{{ inventory_hostname }}.sh" mode: '0755' - name: Create rollback script copy: content: | #!/bin/bash # Docker Swarm Rollback Script for {{ inventory_hostname }} echo "🔄 Rolling back Swarm services..." # Remove services docker service rm ghproxy-svc redis-svc consul-svc discourse-app-svc discourse-sidekiq-svc postgres-svc elasticsearch-svc 2>/dev/null || true # Remove networks (optional) # docker network rm app-network db-network consul-network elastic-network 2>/dev/null || true echo "✅ Rollback complete. Original containers should be restarted manually." dest: "/tmp/swarm-rollback-{{ inventory_hostname }}.sh" mode: '0755' - name: Migration plan complete debug: msg: | 🎉 MIGRATION PLAN GENERATED! 📄 Files created: - /tmp/swarm-migration-{{ inventory_hostname }}.sh (Migration script) - /tmp/swarm-rollback-{{ inventory_hostname }}.sh (Rollback script) 🚀 RECOMMENDED APPROACH: 1. Backup all data first 2. Test migration in phases 3. Start with Phase 1 (low risk services) 4. Monitor each service before proceeding 5. Keep rollback script ready 💡 NEXT STEPS: 1. Review and customize the migration script 2. Plan maintenance window 3. Execute phase by phase 4. Monitor and validate each service