--- - name: Deploy Framework Application to Production hosts: production_server become: no vars: git_repo_url: "{{ lookup('env', 'GIT_REPO_URL') | default('') }}" build_timestamp: "{{ ansible_date_time.epoch }}" tasks: - name: Ensure git repo path exists file: path: "{{ git_repo_path }}" state: directory mode: '0755' - name: Pull latest code from git git: repo: "{{ git_repo_url }}" dest: "{{ git_repo_path }}" version: main force: yes when: git_repo_url != '' register: git_pull_result - name: Build Docker image on production server docker_image: name: "{{ docker_registry }}/{{ docker_image_name }}" tag: "{{ docker_image_tag }}" build: path: "{{ git_repo_path }}" dockerfile: "{{ build_dockerfile }}" args: --target: "{{ build_target }}" source: build force_source: yes push: no register: build_result - name: Tag image with timestamp for rollback capability docker_image: name: "{{ docker_registry }}/{{ docker_image_name }}" repository: "{{ docker_registry }}/{{ docker_image_name }}" tag: "{{ build_timestamp }}" source: local - name: Update Docker Swarm service - web docker_swarm_service: name: "{{ docker_swarm_stack_name }}_web" image: "{{ docker_registry }}/{{ docker_image_name }}:{{ docker_image_tag }}" force_update: yes state: present register: web_update_result - name: Update Docker Swarm service - queue-worker docker_swarm_service: name: "{{ docker_swarm_stack_name }}_queue-worker" image: "{{ docker_registry }}/{{ docker_image_name }}:{{ docker_image_tag }}" force_update: yes state: present register: worker_update_result - name: Wait for services to stabilize pause: seconds: 60 - name: Check service status shell: docker stack services {{ docker_swarm_stack_name }} | grep -E "NAME|{{ docker_swarm_stack_name }}" register: service_status changed_when: false - name: Display deployment results debug: msg: - "Deployment completed successfully" - "Build timestamp: {{ build_timestamp }}" - "Image: {{ docker_registry }}/{{ docker_image_name }}:{{ docker_image_tag }}" - "Services status: {{ service_status.stdout_lines }}" - name: Test website availability uri: url: "https://michaelschiemer.de/" validate_certs: no status_code: [200, 302] timeout: 10 register: website_health ignore_errors: yes - name: Display website health check debug: msg: "Website responded with status: {{ website_health.status | default('FAILED') }}"