91 lines
2.8 KiB
YAML
91 lines
2.8 KiB
YAML
---
|
|
- 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') }}"
|