--- # 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=" - 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.