diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml index 6e06e0ac93..792a4d4328 100644 --- a/ansible/group_vars/all.yml +++ b/ansible/group_vars/all.yml @@ -1,10 +1,12 @@ +--- +# Web app configuration +app_name: devops-app docker_image: qobz1e/devops-info-service -docker_image_tag: lab2 -app_container_name: info-service -app_port: 5000 -restart_policy: always -env_vars: - ENV: production +docker_tag: lab2 +app_port: 8000 +app_internal_port: 8000 +compose_project_dir: "/opt/{{ app_name }}" +docker_compose_version: "3.8" dockerhub_username: qobz1e dockerhub_password: !vault | $ANSIBLE_VAULT;1.1;AES256 @@ -13,4 +15,5 @@ dockerhub_password: !vault | 32623434383237333532363630383264323464343563366266336230303266326661616237353064 3337303165653736640a373561613836373639303237373032393134336464613732346161653664 65396237363265336236623361326135346238613065656131656265353737323363303034343133 - 6531623765633839623039323131666530646464306133373030 \ No newline at end of file + 6531623765633839623039323131666530646464306133373030 +web_app_wipe: false \ No newline at end of file diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml index f492d8a049..13189b5f0e 100644 --- a/ansible/playbooks/deploy.yml +++ b/ansible/playbooks/deploy.yml @@ -1,8 +1,8 @@ --- -- name: Deploy application - hosts: webservers - become: yes +- name: Deploy Web Application + hosts: all + become: true vars_files: - /workspaces/DevOps-Core-Course/ansible/group_vars/all.yml roles: - - app_deploy \ No newline at end of file + - web_app \ No newline at end of file diff --git a/ansible/roles/app_deploy/defaults/main.yml b/ansible/roles/app_deploy/defaults/main.yml deleted file mode 100644 index 02de09dfaa..0000000000 --- a/ansible/roles/app_deploy/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -app_port: 5000 -restart_policy: unless-stopped -env_vars: {} \ No newline at end of file diff --git a/ansible/roles/app_deploy/tasks/main.yml b/ansible/roles/app_deploy/tasks/main.yml deleted file mode 100644 index a3f194764e..0000000000 --- a/ansible/roles/app_deploy/tasks/main.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- -- name: Login to Docker Hub - community.docker.docker_login: - username: "{{ dockerhub_username }}" - password: "{{ dockerhub_password }}" - no_log: true - -- name: Pull Docker image - community.docker.docker_image: - name: "{{ docker_image }}" - tag: "{{ docker_image_tag }}" - source: pull - -- name: Stop existing container - community.docker.docker_container: - name: "{{ app_container_name }}" - state: stopped - ignore_errors: yes - -- name: Remove old container - community.docker.docker_container: - name: "{{ app_container_name }}" - state: absent - ignore_errors: yes - -- name: Run application container - community.docker.docker_container: - name: "{{ app_container_name }}" - image: "{{ docker_image }}:{{ docker_image_tag }}" - state: started - restart_policy: "{{ restart_policy }}" - published_ports: - - "{{ app_port }}:{{ app_port }}" - env: - "{{ env_vars }}" - -- name: Wait for application to be ready - wait_for: - host: 127.0.0.1 - port: "{{ app_port }}" - delay: 5 - timeout: 30 - -- name: Verify health endpoint - uri: - url: "http://127.0.0.1:{{ app_port }}/health" - status_code: 200 \ No newline at end of file diff --git a/ansible/roles/web_app/defaults/main.yml b/ansible/roles/web_app/defaults/main.yml new file mode 100644 index 0000000000..c852ce5a05 --- /dev/null +++ b/ansible/roles/web_app/defaults/main.yml @@ -0,0 +1,14 @@ +--- +# Application variables +app_name: devops-app +docker_image: your_dockerhub_username/devops-info-service +docker_tag: latest +app_port: 8000 +app_internal_port: 8000 + +# Docker Compose +compose_project_dir: "/opt/{{ app_name }}" +docker_compose_version: "3.8" + +# Wipe logic +web_app_wipe: false \ No newline at end of file diff --git a/ansible/roles/app_deploy/handlers/main.yml b/ansible/roles/web_app/handlers/main.yml similarity index 100% rename from ansible/roles/app_deploy/handlers/main.yml rename to ansible/roles/web_app/handlers/main.yml diff --git a/ansible/roles/web_app/meta/main.yml b/ansible/roles/web_app/meta/main.yml new file mode 100644 index 0000000000..fc95875336 --- /dev/null +++ b/ansible/roles/web_app/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - role: docker \ No newline at end of file diff --git a/ansible/roles/web_app/tasks/main.yml b/ansible/roles/web_app/tasks/main.yml new file mode 100644 index 0000000000..5f4bcb0eb2 --- /dev/null +++ b/ansible/roles/web_app/tasks/main.yml @@ -0,0 +1,34 @@ +--- +# Include wipe logic first +- name: Include wipe tasks + include_tasks: wipe.yml + tags: + - web_app_wipe + +# Deployment block +- name: Deploy application with Docker Compose + block: + - name: Create app directory + file: + path: /opt/{{ app_name }} + state: directory + mode: '0755' + + - name: Template docker-compose.yml + template: + src: docker-compose.yml.j2 + dest: /opt/{{ app_name }}/docker-compose.yml + + - name: Deploy with docker-compose + shell: docker compose up -d --build + args: + chdir: "/opt/{{ app_name }}" + + rescue: + - name: Handle deployment failure + debug: + msg: "Deployment failed for {{ app_name }}" + + tags: + - app_deploy + - compose \ No newline at end of file diff --git a/ansible/roles/web_app/tasks/wipe.yml b/ansible/roles/web_app/tasks/wipe.yml new file mode 100644 index 0000000000..d00edaf2bb --- /dev/null +++ b/ansible/roles/web_app/tasks/wipe.yml @@ -0,0 +1,23 @@ +--- +- name: Wipe web application + block: + - name: Stop and remove containers + community.docker.docker_compose: + project_src: /opt/{{ app_name }} + state: absent + remove_images: all + ignore_errors: yes + + - name: Remove application directory + file: + path: /opt/{{ app_name }} + state: absent + ignore_errors: yes + + - name: Log wipe completion + debug: + msg: "Application {{ app_name }} wiped successfully" + + when: web_app_wipe | bool + tags: + - web_app_wipe \ No newline at end of file diff --git a/ansible/roles/web_app/templates/docker-compose.yml.j2 b/ansible/roles/web_app/templates/docker-compose.yml.j2 new file mode 100644 index 0000000000..a8ac1fbd5b --- /dev/null +++ b/ansible/roles/web_app/templates/docker-compose.yml.j2 @@ -0,0 +1,9 @@ +version: '3.8' + +services: + {{ app_name }}: + image: {{ docker_image }}:{{ docker_tag }} + container_name: {{ app_name }} + ports: + - "{{ app_port }}:{{ app_internal_port }}" + restart: unless-stopped \ No newline at end of file