111 lines
3.8 KiB
YAML
111 lines
3.8 KiB
YAML
---
|
|
# Ansible Playbook: Emergency Rollback
|
|
# Purpose: Fast rollback without health checks for emergency situations
|
|
# Usage: ansible-playbook -i inventory/production.yml playbooks/emergency-rollback.yml -e "rollback_tag=<tag>"
|
|
|
|
- name: Emergency Rollback (Fast Mode)
|
|
hosts: production_server
|
|
become: no
|
|
vars:
|
|
registry_url: "git.michaelschiemer.de:5000"
|
|
image_name: "framework"
|
|
stack_name: "framework"
|
|
rollback_tag: "{{ rollback_tag | default('latest') }}"
|
|
skip_health_check: true
|
|
|
|
pre_tasks:
|
|
- name: Emergency rollback warning
|
|
debug:
|
|
msg: |
|
|
🚨 EMERGENCY ROLLBACK IN PROGRESS 🚨
|
|
|
|
This will immediately revert to: {{ rollback_tag }}
|
|
Health checks will be SKIPPED for speed.
|
|
|
|
Press Ctrl+C now if you want to abort.
|
|
|
|
- name: Record rollback initiation
|
|
shell: |
|
|
echo "[$(date)] Emergency rollback initiated to {{ rollback_tag }}" >> /home/deploy/deployments/emergency-rollback.log
|
|
|
|
tasks:
|
|
- name: Get current running image tag
|
|
shell: |
|
|
docker service inspect {{ stack_name }}_web --format '{{`{{.Spec.TaskTemplate.ContainerSpec.Image}}`}}'
|
|
register: current_image
|
|
changed_when: false
|
|
|
|
- name: Display current vs target
|
|
debug:
|
|
msg: |
|
|
Current: {{ current_image.stdout }}
|
|
Target: {{ registry_url }}/{{ image_name }}:{{ rollback_tag }}
|
|
|
|
- name: Pull rollback image (skip verification)
|
|
docker_image:
|
|
name: "{{ registry_url }}/{{ image_name }}"
|
|
tag: "{{ rollback_tag }}"
|
|
source: pull
|
|
register: rollback_image
|
|
ignore_errors: yes
|
|
|
|
- name: Force rollback even if image pull failed
|
|
debug:
|
|
msg: "⚠️ Image pull failed, attempting rollback with cached image"
|
|
when: rollback_image is failed
|
|
|
|
- name: Immediate rollback - web service
|
|
shell: |
|
|
docker service update \
|
|
--image {{ registry_url }}/{{ image_name }}:{{ rollback_tag }} \
|
|
--force \
|
|
--update-parallelism 999 \
|
|
--update-delay 0s \
|
|
{{ stack_name }}_web
|
|
register: web_rollback
|
|
|
|
- name: Immediate rollback - queue-worker service
|
|
shell: |
|
|
docker service update \
|
|
--image {{ registry_url }}/{{ image_name }}:{{ rollback_tag }} \
|
|
--force \
|
|
--update-parallelism 999 \
|
|
--update-delay 0s \
|
|
{{ stack_name }}_queue-worker
|
|
register: worker_rollback
|
|
|
|
- name: Wait for rollback to propagate (minimal wait)
|
|
pause:
|
|
seconds: 15
|
|
|
|
- name: Quick service status check
|
|
shell: |
|
|
docker service ps {{ stack_name }}_web --filter "desired-state=running" --format "{{`{{.CurrentState}}`}}" | head -1
|
|
register: rollback_state
|
|
changed_when: false
|
|
|
|
- name: Display rollback status
|
|
debug:
|
|
msg: |
|
|
🚨 Emergency rollback completed (fast mode)
|
|
|
|
Web Service: {{ web_rollback.changed | ternary('ROLLED BACK', 'NO CHANGE') }}
|
|
Worker Service: {{ worker_rollback.changed | ternary('ROLLED BACK', 'NO CHANGE') }}
|
|
Service State: {{ rollback_state.stdout }}
|
|
|
|
⚠️ MANUAL VERIFICATION REQUIRED:
|
|
1. Check application: https://michaelschiemer.de
|
|
2. Check service logs: docker service logs {{ stack_name }}_web
|
|
3. Verify database connectivity
|
|
4. Run full health check: ansible-playbook playbooks/health-check.yml
|
|
|
|
- name: Record rollback completion
|
|
shell: |
|
|
echo "[$(date)] Emergency rollback completed: {{ rollback_tag }}, Status: {{ rollback_state.stdout }}" >> /home/deploy/deployments/emergency-rollback.log
|
|
|
|
- name: Alert - manual verification required
|
|
debug:
|
|
msg: |
|
|
⚠️ IMPORTANT: This was an emergency rollback without health checks.
|
|
You MUST manually verify application functionality before considering this successful.
|