147 lines
4.9 KiB
YAML
147 lines
4.9 KiB
YAML
---
|
|
- 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' |