--- - name: Rollback ECS Service hosts: localhost connection: local gather_facts: false vars: ecs_cluster_name: "nvhi-atsila-cluster" service_name: "nvhi-atsila-cluster-service" task_family: "nvhi-atsila-cluster-task" aws_region: "us-east-2" tasks: - name: Get current service task definition shell: | aws ecs describe-services \ --cluster {{ ecs_cluster_name }} \ --services {{ service_name }} \ --region {{ aws_region }} \ --query 'services[0].taskDefinition' \ --output text register: current_task_def environment: AWS_DEFAULT_REGION: "{{ aws_region }}" - name: Extract current revision number set_fact: current_revision: "{{ current_task_def.stdout.split(':')[-1] | int }}" - name: Calculate rollback revision set_fact: rollback_revision: "{{ (current_revision | int) - 1 }}" when: rollback_revision is not defined - name: Validate rollback revision fail: msg: "Cannot rollback - target revision {{ rollback_revision }} is invalid (must be >= 1)" when: (rollback_revision | int) < 1 - name: Display rollback information debug: msg: | ================================= ROLLBACK INFORMATION ================================= Service: {{ service_name }} Cluster: {{ ecs_cluster_name }} Current Revision: {{ current_revision }} Target Revision: {{ rollback_revision }} ================================= - name: Confirm rollback (interactive) pause: prompt: | WARNING: You are about to rollback the ECS service! Service: {{ service_name }} From: {{ task_family }}:{{ current_revision }} To: {{ task_family }}:{{ rollback_revision }} Do you want to continue? (yes/no) register: rollback_confirm when: auto_rollback is not defined - name: Set automatic confirmation set_fact: rollback_confirm: user_input: "yes" when: auto_rollback is defined and auto_rollback - name: Execute rollback shell: | aws ecs update-service \ --cluster {{ ecs_cluster_name }} \ --service {{ service_name }} \ --task-definition {{ task_family }}:{{ rollback_revision }} \ --force-new-deployment \ --region {{ aws_region }} \ --output json environment: AWS_DEFAULT_REGION: "{{ aws_region }}" when: rollback_confirm.user_input | lower == 'yes' register: rollback_result - name: Wait for rollback completion shell: | echo "Waiting for rollback to complete..." count=0 while [ $count -lt 20 ]; do service_status=$(aws ecs describe-services \ --cluster {{ ecs_cluster_name }} \ --services {{ service_name }} \ --region {{ aws_region }} \ --query 'services[0]' \ --output json 2>/dev/null) if [ $? -eq 0 ]; then running=$(echo "$service_status" | jq -r '.runningCount // 0') pending=$(echo "$service_status" | jq -r '.pendingCount // 0') echo "Running: $running, Pending: $pending" if [ "$running" -ge "1" ] && [ "$pending" -eq "0" ]; then echo "Rollback completed successfully" exit 0 fi fi echo "Waiting for rollback completion (attempt $((count+1))/20)..." sleep 15 count=$((count+1)) done echo "WARNING: Rollback may not have completed within expected time" exit 1 environment: AWS_DEFAULT_REGION: "{{ aws_region }}" when: rollback_confirm.user_input | lower == 'yes' - name: Verify rollback status shell: | aws ecs describe-services \ --cluster {{ ecs_cluster_name }} \ --services {{ service_name }} \ --region {{ aws_region }} \ --query 'services[0].{TaskDefinition:taskDefinition,RunningCount:runningCount,Status:status}' \ --output table environment: AWS_DEFAULT_REGION: "{{ aws_region }}" when: rollback_confirm.user_input | lower == 'yes' register: final_status - name: Display rollback results debug: msg: | ======================================== 🔄 ROLLBACK COMPLETED ======================================== Service: {{ service_name }} Rolled back to: {{ task_family }}:{{ rollback_revision }} Status: Check output above ======================================== when: rollback_confirm.user_input | lower == 'yes' - name: Rollback cancelled debug: msg: "Rollback operation was cancelled by user" when: rollback_confirm.user_input | lower != 'yes'