236 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			YAML
		
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			YAML
		
	
	
	
| ---
 | |
| - name: Docker Swarm Check for ash3c
 | |
|   hosts: ash3c
 | |
|   become: yes
 | |
|   gather_facts: yes
 | |
|   
 | |
|   tasks:
 | |
|     # 基础检查
 | |
|     - name: Check if Docker is installed
 | |
|       command: which docker
 | |
|       register: docker_installed
 | |
|       failed_when: false
 | |
|       changed_when: false
 | |
|       
 | |
|     - name: Fail if Docker not installed
 | |
|       fail:
 | |
|         msg: "Docker is not installed on {{ inventory_hostname }}"
 | |
|       when: docker_installed.rc != 0
 | |
|       
 | |
|     # 检查当前 Swarm 状态
 | |
|     - name: Check Docker Swarm status
 | |
|       shell: docker info | grep "Swarm:" -A 1
 | |
|       register: swarm_status
 | |
|       
 | |
|     - name: Display current Swarm status
 | |
|       debug:
 | |
|         msg: "🔍 Current Swarm Status: {{ swarm_status.stdout_lines }}"
 | |
|         
 | |
|     # 获取运行中的容器 - 使用简单格式
 | |
|     - name: Get running containers
 | |
|       shell: docker ps
 | |
|       register: running_containers
 | |
|       
 | |
|     - name: Display running containers
 | |
|       debug:
 | |
|         msg: "🏃 Running Containers:\n{{ running_containers.stdout }}"
 | |
|         
 | |
|     # 获取所有容器(包括停止的)
 | |
|     - name: Get all containers
 | |
|       shell: docker ps -a
 | |
|       register: all_containers
 | |
|       
 | |
|     - name: Display all containers
 | |
|       debug:
 | |
|         msg: "📦 All Containers:\n{{ all_containers.stdout }}"
 | |
|         
 | |
|     # 获取容器名称列表
 | |
|     - name: Get container names
 | |
|       shell: docker ps -a | awk 'NR>1 {print $NF}' | head -20
 | |
|       register: container_names
 | |
|       
 | |
|     - name: Display container names
 | |
|       debug:
 | |
|         msg: "Container names: {{ container_names.stdout_lines }}"
 | |
|         
 | |
|     # 检查每个容器的基本信息
 | |
|     - name: Get basic container info
 | |
|       shell: |
 | |
|         echo "=== Container: {{ item }} ==="
 | |
|         docker inspect {{ item }} | jq -r '.[0] | {
 | |
|           "Image": .Config.Image,
 | |
|           "Status": .State.Status,
 | |
|           "RestartPolicy": .HostConfig.RestartPolicy.Name,
 | |
|           "NetworkMode": .HostConfig.NetworkMode
 | |
|         }'
 | |
|         echo "Ports:"
 | |
|         docker port {{ item }} 2>/dev/null || echo "No published ports"
 | |
|         echo "Mounts:"
 | |
|         docker inspect {{ item }} | jq -r '.[0].Mounts[]? | "  \(.Source):\(.Destination) (\(.Mode))"'
 | |
|         echo "---"        
 | |
|       register: container_info
 | |
|       loop: "{{ container_names.stdout_lines[:10] }}"  # 限制前10个容器
 | |
|       when: container_names.stdout_lines | length > 0
 | |
|       
 | |
|     - name: Display container info
 | |
|       debug:
 | |
|         msg: "{{ item.stdout }}"
 | |
|       loop: "{{ container_info.results }}"
 | |
|       when: container_info is defined
 | |
|       
 | |
|     # 检查 Docker Compose 文件
 | |
|     - name: Find docker-compose files in common locations
 | |
|       find:
 | |
|         paths: 
 | |
|           - /root
 | |
|           - /home
 | |
|           - /opt
 | |
|           - /var/lib/docker
 | |
|         patterns: 
 | |
|           - "docker-compose.yml"
 | |
|           - "docker-compose.yaml"
 | |
|           - "compose.yml"
 | |
|           - "compose.yaml"
 | |
|         recurse: yes
 | |
|         depth: 3
 | |
|       register: compose_files
 | |
|       ignore_errors: yes
 | |
|       
 | |
|     - name: Display found compose files
 | |
|       debug:
 | |
|         msg: "📄 Found compose files: {{ compose_files.files | map(attribute='path') | list }}"
 | |
|       when: compose_files.files | length > 0
 | |
|       
 | |
|     # 分析网络配置
 | |
|     - name: Get Docker networks
 | |
|       shell: docker network ls
 | |
|       register: docker_networks
 | |
|       
 | |
|     - name: Display Docker networks
 | |
|       debug:
 | |
|         msg: "🌐 Docker Networks:\n{{ docker_networks.stdout }}"
 | |
|         
 | |
|     # 检查卷使用情况
 | |
|     - name: Get Docker volumes
 | |
|       shell: docker volume ls
 | |
|       register: docker_volumes
 | |
|       
 | |
|     - name: Display Docker volumes
 | |
|       debug:
 | |
|         msg: "💾 Docker Volumes:\n{{ docker_volumes.stdout }}"
 | |
|         
 | |
|     # 检查容器资源使用
 | |
|     - name: Get container resource usage
 | |
|       shell: docker stats --no-stream
 | |
|       register: container_stats
 | |
|       when: container_names.stdout_lines | length > 0
 | |
|       
 | |
|     - name: Display container stats
 | |
|       debug:
 | |
|         msg: "📊 Container Resource Usage:\n{{ container_stats.stdout }}"
 | |
|       when: container_stats is defined
 | |
|       
 | |
|     # 检查 Docker 镜像
 | |
|     - name: Get Docker images
 | |
|       shell: docker images
 | |
|       register: docker_images
 | |
|       
 | |
|     - name: Display Docker images
 | |
|       debug:
 | |
|         msg: "🖼️ Docker Images:\n{{ docker_images.stdout }}"
 | |
|         
 | |
|     # 生成 Swarm 适用性分析
 | |
|     - name: Generate Swarm suitability analysis
 | |
|       debug:
 | |
|         msg: |
 | |
|           
 | |
|           🔍 DOCKER SWARM MIGRATION ANALYSIS FOR {{ inventory_hostname }}
 | |
|           ================================================================
 | |
|           
 | |
|           📋 SUMMARY:
 | |
|           - Current Swarm Status: {{ 'Active' if 'active' in swarm_status.stdout else 'Inactive' }}
 | |
|           - Total Containers: {{ container_names.stdout_lines | length }}
 | |
|           - Running Containers: {{ running_containers.stdout_lines | length - 1 }}
 | |
|           - Compose Files Found: {{ compose_files.files | length if compose_files.files is defined else 0 }}
 | |
|           
 | |
|           💡 SWARM MIGRATION RECOMMENDATIONS:
 | |
|           
 | |
|           ✅ TYPICALLY SUITABLE FOR SWARM:
 | |
|           - Web servers (nginx, apache, caddy)
 | |
|           - API services and microservices
 | |
|           - Application servers
 | |
|           - Load balancers (traefik, haproxy)
 | |
|           - Monitoring tools (prometheus, grafana)
 | |
|           - Databases (with proper volume strategy)
 | |
|           
 | |
|           ❌ NOT SUITABLE FOR SWARM:
 | |
|           - Containers using Docker socket (/var/run/docker.sock)
 | |
|           - Containers with --privileged flag
 | |
|           - Development/testing containers
 | |
|           - Containers requiring specific host hardware access
 | |
|           
 | |
|           ⚠️  NEEDS MODIFICATION FOR SWARM:
 | |
|           - Containers using bind mounts → convert to volumes
 | |
|           - Containers without restart policies → add restart policies
 | |
|           - Containers using host networking → use overlay networks
 | |
|           - Containers with hardcoded IPs → use service discovery
 | |
|           
 | |
|           🚀 MIGRATION STEPS:
 | |
|           1. ✅ Swarm is already initialized
 | |
|           2. Create overlay networks for service communication
 | |
|           3. Convert suitable containers to Docker services
 | |
|           4. Set up service discovery and load balancing
 | |
|           5. Configure secrets and configs management
 | |
|           6. Test service scaling and failover
 | |
|           
 | |
|           📝 NEXT ACTIONS:
 | |
|           - Review each container above for Swarm suitability
 | |
|           - Identify services that would benefit from scaling
 | |
|           - Plan network topology for services
 | |
|           - Prepare volume migration strategy          
 | |
|       when: container_names is defined
 | |
|       
 | |
|     # 保存分析结果
 | |
|     - name: Save analysis summary to file
 | |
|       copy:
 | |
|         content: |
 | |
|           Docker Swarm Analysis for {{ inventory_hostname }}
 | |
|           Generated: {{ ansible_date_time.iso8601 }}
 | |
|           
 | |
|           SWARM STATUS:
 | |
|           {{ swarm_status.stdout }}
 | |
|           
 | |
|           CONTAINERS ({{ container_names.stdout_lines | length }} total):
 | |
|           {{ container_names.stdout_lines | join('\n') }}
 | |
|           
 | |
|           NETWORKS:
 | |
|           {{ docker_networks.stdout }}
 | |
|           
 | |
|           VOLUMES:
 | |
|           {{ docker_volumes.stdout }}
 | |
|           
 | |
|           IMAGES:
 | |
|           {{ docker_images.stdout }}
 | |
|           
 | |
|           {% if compose_files.files is defined and compose_files.files | length > 0 %}
 | |
|           COMPOSE FILES FOUND:
 | |
|           {% for file in compose_files.files %}
 | |
|           - {{ file.path }}
 | |
|           {% endfor %}
 | |
|           {% endif %}          
 | |
|         dest: "/tmp/swarm-analysis-{{ inventory_hostname }}-{{ ansible_date_time.epoch }}.txt"
 | |
|       
 | |
|     - name: Analysis complete
 | |
|       debug:
 | |
|         msg: |
 | |
|           
 | |
|           🎉 ANALYSIS COMPLETE!
 | |
|           
 | |
|           📄 Results saved to: /tmp/swarm-analysis-{{ inventory_hostname }}-{{ ansible_date_time.epoch }}.txt
 | |
|           
 | |
|           🔍 Review the container details above to identify:
 | |
|           - Which services are suitable for Swarm
 | |
|           - Which containers need modification
 | |
|           - Migration priority and strategy
 | |
|           
 | |
|           💡 TIP: Focus on stateless services first for easier migration!           |