From cca8f5264004702d6d5f124f31e961ca8f3b1813 Mon Sep 17 00:00:00 2001 From: Vsevolod Date: Thu, 12 Mar 2026 22:02:13 +0300 Subject: [PATCH 1/5] lab05 v1 --- .gitignore | 6 + ansible/ansible.cfg | 12 ++ ansible/docs/LAB05.md | 164 +++++++++++++++++++++ ansible/group_vars/all.yml.example | 15 ++ ansible/inventory/hosts.ini | 6 + ansible/playbooks/deploy.yml | 7 + ansible/playbooks/provision.yml | 8 + ansible/playbooks/site.yml | 3 + ansible/requirements.yml | 3 + ansible/roles/app_deploy/defaults/main.yml | 14 ++ ansible/roles/app_deploy/handlers/main.yml | 7 + ansible/roles/app_deploy/tasks/main.yml | 77 ++++++++++ ansible/roles/common/defaults/main.yml | 15 ++ ansible/roles/common/tasks/main.yml | 19 +++ ansible/roles/docker/defaults/main.yml | 29 ++++ ansible/roles/docker/handlers/main.yml | 5 + ansible/roles/docker/tasks/main.yml | 53 +++++++ 17 files changed, 443 insertions(+) create mode 100644 ansible/ansible.cfg create mode 100644 ansible/docs/LAB05.md create mode 100644 ansible/group_vars/all.yml.example create mode 100644 ansible/inventory/hosts.ini create mode 100644 ansible/playbooks/deploy.yml create mode 100644 ansible/playbooks/provision.yml create mode 100644 ansible/playbooks/site.yml create mode 100644 ansible/requirements.yml create mode 100644 ansible/roles/app_deploy/defaults/main.yml create mode 100644 ansible/roles/app_deploy/handlers/main.yml create mode 100644 ansible/roles/app_deploy/tasks/main.yml create mode 100644 ansible/roles/common/defaults/main.yml create mode 100644 ansible/roles/common/tasks/main.yml create mode 100644 ansible/roles/docker/defaults/main.yml create mode 100644 ansible/roles/docker/handlers/main.yml create mode 100644 ansible/roles/docker/tasks/main.yml diff --git a/.gitignore b/.gitignore index fe2b520861..ba4183fd3d 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,9 @@ pulumi/venv/ *.jks *.json credentials + +# Ansible +*.retry +.vault_pass +ansible/inventory/*.pyc +__pycache__/ diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg new file mode 100644 index 0000000000..56ea457fc1 --- /dev/null +++ b/ansible/ansible.cfg @@ -0,0 +1,12 @@ +[defaults] +inventory = inventory/hosts.ini +roles_path = roles +host_key_checking = False +remote_user = ubuntu +retry_files_enabled = False +interpreter_python = auto_silent + +[privilege_escalation] +become = True +become_method = sudo +become_user = root diff --git a/ansible/docs/LAB05.md b/ansible/docs/LAB05.md new file mode 100644 index 0000000000..b0b6195d23 --- /dev/null +++ b/ansible/docs/LAB05.md @@ -0,0 +1,164 @@ +# LAB05 - Ansible Fundamentals + +## 1. Architecture Overview + +- **Ansible version:** 2.16+ (expected by lab, verify with `ansible --version`) +- **Target VM:** local VM from LAB04 (`10.241.1.215`) +- **Target OS:** Debian 13 (role logic also supports Ubuntu) +- **Project structure:** role-based layout (`common`, `docker`, `app_deploy`) with separate playbooks for provisioning and deploy. + +Why roles instead of one monolithic playbook: +- roles isolate responsibilities by domain (base system, Docker, app deployment); +- variables, handlers and tasks stay reusable between labs/environments; +- support and debugging are easier because each role is independent. + +## 2. Roles Documentation + +### Role: `common` +- **Purpose:** base server preparation (apt cache, common packages, timezone). +- **Variables:** + - `common_packages` - list of base packages. + - `common_timezone` - desired timezone (`UTC` by default). + - `common_apt_cache_valid_time` - apt cache TTL. +- **Handlers:** none. +- **Dependencies:** none. + +### Role: `docker` +- **Purpose:** install and configure Docker Engine via official Docker repository. +- **Variables:** + - `docker_user` - user added to `docker` group. + - `docker_packages` - Docker related packages. + - `docker_repo_distribution`, `docker_apt_release` - distro/release mapping for repo URL. + - `docker_architecture_map` - architecture mapping for apt repo. +- **Handlers:** + - `restart docker` - restarts Docker service when repository/packages/key change. +- **Dependencies:** none. + +### Role: `app_deploy` +- **Purpose:** login to Docker Hub, pull image, recreate container when needed, verify app health. +- **Variables:** + - `dockerhub_username`, `dockerhub_password` - credentials from Vault. + - `docker_image`, `docker_image_tag` - deployment image settings. + - `app_container_name`, `app_port`, `app_container_port`, `app_restart_policy`. + - `app_env`, `app_healthcheck_path`. +- **Handlers:** + - `restart application container` - restarts app container if image pull triggered handler and container existed. +- **Dependencies:** Docker must be installed first (`docker` role). + +## 3. Idempotency Demonstration + +Run from `ansible/`: + +```bash +ansible-playbook playbooks/provision.yml +ansible-playbook playbooks/provision.yml +``` + +Paste output snippets below: + +### First run (`provision.yml`) +```text +# paste your terminal output here +``` + +### Second run (`provision.yml`) +```text +# paste your terminal output here +``` + +Analysis: +- first run should show many `changed` tasks because packages/repos/services are applied first time; +- second run should be mostly `ok` because desired state already matches actual state; +- this is achieved by stateful modules (`apt`, `service`, `user`, `docker_container`) and conditional recreation logic. + +## 4. Ansible Vault Usage + +Sensitive variables are stored in encrypted `group_vars/all.yml`. + +Create file: + +```bash +cd ansible +ansible-vault create group_vars/all.yml +``` + +Use this content inside Vault file: + +```yaml +--- +dockerhub_username: "your-dockerhub-username" +dockerhub_password: "your-dockerhub-access-token" + +app_name: "devops-lab2" +docker_image: "{{ dockerhub_username }}/{{ app_name }}" +docker_image_tag: "latest" +app_port: 5000 +app_container_port: 5000 +app_container_name: "{{ app_name }}" +``` + +Password strategy: +- use `--ask-vault-pass` for manual runs; +- optional: store password in `.vault_pass` locally and keep it out of git. + +Why Vault is important: +- secrets can be committed safely in encrypted form; +- prevents plaintext credential leakage in repository history. + +## 5. Deployment Verification + +Run deploy: + +```bash +cd ansible +ansible-galaxy collection install -r requirements.yml +ansible-playbook playbooks/deploy.yml --ask-vault-pass +ansible webservers -a "docker ps" +curl http://10.241.1.215:5000/health +curl http://10.241.1.215:5000/ +``` + +Paste output snippets: + +### `deploy.yml` output +```text +# paste output here +``` + +### `docker ps` output +```text +# paste output here +``` + +### Health checks +```text +# paste curl outputs here +``` + +### Handler execution +```text +# if handler ran, paste TASK [app_deploy : restart application container] lines +``` + +## 6. Key Decisions + +**Why roles instead of plain playbooks?** +Roles isolate logic and keep playbooks thin. This gives clearer boundaries between provisioning and deployment and makes future changes safer. + +**How do roles improve reusability?** +Each role can be reused in other environments or combined with other playbooks. Variable defaults make behavior configurable without editing task code. + +**What makes a task idempotent?** +A task is idempotent when repeated runs converge to same state without extra changes. Using declarative modules (`state: present/started`) and conditions avoids unnecessary mutations. + +**How do handlers improve efficiency?** +Handlers run only when notified by changed tasks, so services are not restarted on every run. This reduces downtime and keeps runs predictable. + +**Why is Ansible Vault necessary?** +Vault protects secrets in version control and CI logs. It allows collaboration while keeping Docker Hub credentials encrypted. + +## 7. Challenges (Optional) + +- `ansible` may not be preinstalled on control node: install in WSL or Linux before running. +- Docker repo can require distro-specific release names; override `docker_apt_release` if needed. +- Ensure VM firewall allows `22` and `5000` from your workstation. diff --git a/ansible/group_vars/all.yml.example b/ansible/group_vars/all.yml.example new file mode 100644 index 0000000000..c78ca54b14 --- /dev/null +++ b/ansible/group_vars/all.yml.example @@ -0,0 +1,15 @@ +--- +# Copy this file to group_vars/all.yml and create it with: +# ansible-vault create group_vars/all.yml +# +# Example content for encrypted file: +dockerhub_username: "your-dockerhub-username" +dockerhub_password: "your-dockerhub-access-token" + +app_name: "devops-lab2" +docker_image: "{{ dockerhub_username }}/{{ app_name }}" +docker_image_tag: "latest" + +app_port: 5000 +app_container_port: 5000 +app_container_name: "{{ app_name }}" diff --git a/ansible/inventory/hosts.ini b/ansible/inventory/hosts.ini new file mode 100644 index 0000000000..bddf4fa1c9 --- /dev/null +++ b/ansible/inventory/hosts.ini @@ -0,0 +1,6 @@ +[webservers] +# Replace values below with your VM details from Lab 4 +web-01 ansible_host=10.241.1.215 ansible_user=sevan ansible_ssh_private_key_file=~/.ssh/id_rsa + +[webservers:vars] +ansible_python_interpreter=/usr/bin/python3 diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml new file mode 100644 index 0000000000..533bf902e0 --- /dev/null +++ b/ansible/playbooks/deploy.yml @@ -0,0 +1,7 @@ +--- +- name: Deploy application + hosts: webservers + become: true + + roles: + - app_deploy diff --git a/ansible/playbooks/provision.yml b/ansible/playbooks/provision.yml new file mode 100644 index 0000000000..7cc2e6678d --- /dev/null +++ b/ansible/playbooks/provision.yml @@ -0,0 +1,8 @@ +--- +- name: Provision web servers + hosts: webservers + become: true + + roles: + - common + - docker diff --git a/ansible/playbooks/site.yml b/ansible/playbooks/site.yml new file mode 100644 index 0000000000..139c08f693 --- /dev/null +++ b/ansible/playbooks/site.yml @@ -0,0 +1,3 @@ +--- +- import_playbook: provision.yml +- import_playbook: deploy.yml diff --git a/ansible/requirements.yml b/ansible/requirements.yml new file mode 100644 index 0000000000..660f775816 --- /dev/null +++ b/ansible/requirements.yml @@ -0,0 +1,3 @@ +--- +collections: + - name: community.docker diff --git a/ansible/roles/app_deploy/defaults/main.yml b/ansible/roles/app_deploy/defaults/main.yml new file mode 100644 index 0000000000..a94b87ec17 --- /dev/null +++ b/ansible/roles/app_deploy/defaults/main.yml @@ -0,0 +1,14 @@ +--- +app_name: "devops-lab2" +app_container_name: "{{ app_name }}" +app_port: 5000 +app_container_port: 5000 +app_restart_policy: unless-stopped +app_healthcheck_path: "/health" +app_wait_timeout: 90 + +app_env: + PORT: "{{ app_container_port | string }}" + +docker_image: "{{ dockerhub_username }}/{{ app_name }}" +docker_image_tag: "latest" diff --git a/ansible/roles/app_deploy/handlers/main.yml b/ansible/roles/app_deploy/handlers/main.yml new file mode 100644 index 0000000000..92eee19dbc --- /dev/null +++ b/ansible/roles/app_deploy/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: restart application container + community.docker.docker_container: + name: "{{ app_container_name }}" + state: started + restart: true + when: app_container_info.exists | default(false) diff --git a/ansible/roles/app_deploy/tasks/main.yml b/ansible/roles/app_deploy/tasks/main.yml new file mode 100644 index 0000000000..9a966ef892 --- /dev/null +++ b/ansible/roles/app_deploy/tasks/main.yml @@ -0,0 +1,77 @@ +--- +- name: Validate required Docker Hub credentials + ansible.builtin.assert: + that: + - dockerhub_username is defined + - dockerhub_username | length > 0 + - dockerhub_password is defined + - dockerhub_password | length > 0 + fail_msg: >- + dockerhub_username/dockerhub_password are not set. + Create encrypted group_vars/all.yml with ansible-vault. + +- name: Read current container information + community.docker.docker_container_info: + name: "{{ app_container_name }}" + register: app_container_info + failed_when: false + changed_when: false + +- name: Log in to Docker Hub + community.docker.docker_login: + username: "{{ dockerhub_username }}" + password: "{{ dockerhub_password }}" + no_log: true + +- name: Pull application image + community.docker.docker_image: + name: "{{ docker_image }}:{{ docker_image_tag }}" + source: pull + register: app_image_pull + notify: restart application container + +- name: Stop existing container when redeploy is required + community.docker.docker_container: + name: "{{ app_container_name }}" + state: stopped + when: + - app_container_info.exists | default(false) + - app_container_info.container.State.Running | default(false) + - app_image_pull.changed or + (app_container_info.container.Config.Image | default('') != docker_image ~ ':' ~ docker_image_tag) + +- name: Remove old container when redeploy is required + community.docker.docker_container: + name: "{{ app_container_name }}" + state: absent + when: + - app_container_info.exists | default(false) + - app_image_pull.changed or + (app_container_info.container.Config.Image | default('') != docker_image ~ ':' ~ docker_image_tag) + +- name: Run application container + community.docker.docker_container: + name: "{{ app_container_name }}" + image: "{{ docker_image }}:{{ docker_image_tag }}" + state: started + restart_policy: "{{ app_restart_policy }}" + published_ports: + - "{{ app_port }}:{{ app_container_port }}" + env: "{{ app_env }}" + +- name: Wait for application port + ansible.builtin.wait_for: + host: "127.0.0.1" + port: "{{ app_port }}" + delay: 2 + timeout: "{{ app_wait_timeout }}" + +- name: Verify health endpoint + ansible.builtin.uri: + url: "http://127.0.0.1:{{ app_port }}{{ app_healthcheck_path }}" + method: GET + status_code: 200 + register: app_health_result + retries: 10 + delay: 3 + until: app_health_result.status == 200 diff --git a/ansible/roles/common/defaults/main.yml b/ansible/roles/common/defaults/main.yml new file mode 100644 index 0000000000..b2e4288d3b --- /dev/null +++ b/ansible/roles/common/defaults/main.yml @@ -0,0 +1,15 @@ +--- +common_apt_cache_valid_time: 3600 + +common_packages: + - python3-pip + - curl + - git + - vim + - htop + - ca-certificates + - gnupg + - lsb-release + - unzip + +common_timezone: "UTC" diff --git a/ansible/roles/common/tasks/main.yml b/ansible/roles/common/tasks/main.yml new file mode 100644 index 0000000000..93e0d39f02 --- /dev/null +++ b/ansible/roles/common/tasks/main.yml @@ -0,0 +1,19 @@ +--- +- name: Update apt cache + ansible.builtin.apt: + update_cache: true + cache_valid_time: "{{ common_apt_cache_valid_time }}" + +- name: Install common packages + ansible.builtin.apt: + name: "{{ common_packages }}" + state: present + +- name: Read current timezone + ansible.builtin.command: timedatectl show --property=Timezone --value + register: common_current_timezone + changed_when: false + +- name: Set timezone + ansible.builtin.command: "timedatectl set-timezone {{ common_timezone }}" + when: common_current_timezone.stdout != common_timezone diff --git a/ansible/roles/docker/defaults/main.yml b/ansible/roles/docker/defaults/main.yml new file mode 100644 index 0000000000..10a3bb0332 --- /dev/null +++ b/ansible/roles/docker/defaults/main.yml @@ -0,0 +1,29 @@ +--- +docker_apt_cache_valid_time: 3600 +docker_user: "{{ ansible_user | default('ubuntu') }}" + +docker_prerequisite_packages: + - ca-certificates + - curl + - gnupg + +docker_apt_keyring_dir: /etc/apt/keyrings +docker_apt_keyring_file: /etc/apt/keyrings/docker.asc +docker_gpg_key_url: "https://download.docker.com/linux/{{ docker_repo_distribution }}/gpg" + +docker_repo_distribution: >- + {{ 'ubuntu' if ansible_distribution | lower == 'ubuntu' else 'debian' }} +docker_apt_release: "{{ ansible_distribution_release }}" + +docker_architecture_map: + x86_64: amd64 + aarch64: arm64 + armv7l: armhf + +docker_packages: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + - python3-docker diff --git a/ansible/roles/docker/handlers/main.yml b/ansible/roles/docker/handlers/main.yml new file mode 100644 index 0000000000..1a5058da5e --- /dev/null +++ b/ansible/roles/docker/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart docker + ansible.builtin.service: + name: docker + state: restarted diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml new file mode 100644 index 0000000000..8b1c6a8924 --- /dev/null +++ b/ansible/roles/docker/tasks/main.yml @@ -0,0 +1,53 @@ +--- +- name: Update apt cache + ansible.builtin.apt: + update_cache: true + cache_valid_time: "{{ docker_apt_cache_valid_time }}" + +- name: Install Docker prerequisites + ansible.builtin.apt: + name: "{{ docker_prerequisite_packages }}" + state: present + +- name: Ensure Docker keyring directory exists + ansible.builtin.file: + path: "{{ docker_apt_keyring_dir }}" + state: directory + mode: "0755" + +- name: Download Docker GPG key + ansible.builtin.get_url: + url: "{{ docker_gpg_key_url }}" + dest: "{{ docker_apt_keyring_file }}" + mode: "0644" + notify: restart docker + +- name: Add Docker apt repository + ansible.builtin.apt_repository: + repo: >- + deb [arch={{ docker_architecture_map.get(ansible_architecture, 'amd64') }} + signed-by={{ docker_apt_keyring_file }}] + https://download.docker.com/linux/{{ docker_repo_distribution }} + {{ docker_apt_release }} stable + state: present + filename: docker + notify: restart docker + +- name: Install Docker packages + ansible.builtin.apt: + name: "{{ docker_packages }}" + state: present + update_cache: true + notify: restart docker + +- name: Ensure Docker service is enabled and running + ansible.builtin.service: + name: docker + state: started + enabled: true + +- name: Add user to docker group + ansible.builtin.user: + name: "{{ docker_user }}" + groups: docker + append: true From 0fd357d9152937fa613b92e6710ef579f382240c Mon Sep 17 00:00:00 2001 From: Linktur Date: Sat, 14 Mar 2026 00:09:24 +0300 Subject: [PATCH 2/5] lab05 --- .gitignore | 1 + .../app_python/docs/screenshots/lab_05_1.png | Bin 0 -> 31755 bytes .../app_python/docs/screenshots/lab_05_2.png | Bin 0 -> 45102 bytes ansible/docs/LAB05.md | 141 +++++++++++++++++- ansible/inventory/hosts.ini | 2 +- ansible/playbooks/deploy.yml | 2 + ansible/roles/common/tasks/main.yml | 2 + ansible/roles/docker/tasks/main.yml | 3 + 8 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 Lab-1/app_python/docs/screenshots/lab_05_1.png create mode 100644 Lab-1/app_python/docs/screenshots/lab_05_2.png diff --git a/.gitignore b/.gitignore index ba4183fd3d..29261542b6 100644 --- a/.gitignore +++ b/.gitignore @@ -36,5 +36,6 @@ credentials # Ansible *.retry .vault_pass +ansible/group_vars/all.yml ansible/inventory/*.pyc __pycache__/ diff --git a/Lab-1/app_python/docs/screenshots/lab_05_1.png b/Lab-1/app_python/docs/screenshots/lab_05_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5248e51b23190f1c9ee567346d5af356ec102653 GIT binary patch literal 31755 zcmb5VbyQr<5(ylB>?~ z3cNcexP$L(jqJVYe9Y&dw-jHVNYJ35FiJw~DKwPc2ZjXIrFoa0E&(%6m+V;ttzhLX ztPtPVmXf}I_qLhC5G_WSzg_a|tB<`(mp-&Pd(|r-jl&r-T%4IDz73o{-k1C^2~0Fe z+fCf!=!;$`Ek_alJCw>}JsdE3+-}BO3(;#{G0^@Q@-SVJP^6?G1rrI0ce`NXPM>ZuIw!o148F4D$53q1t%i@^=E zJ-<)RvBxR{`hZ6=7YTG)I^kGj9S2(~KxHuyn~^dHoS`w7`=|Tz>|ZNv>W^eka2BAp z>}SG)fvdx_> z9)%97*4d|1J6H2BD|TZYE;Nf5*fK1f@wLXk$lp67W90@`?2g^DH{XR_v>*acj{@WJ zytX8)LWg77KGg=ptyy~#!v+H1`jhi7#H%@g-`(fC^g8W%TDckP5`mMe%6;9=dM=Y~ zuT~`Qo6@j7ch6GM(|+@nD|TiF%msHBFJ^$X6YuoLoX^PE1hT*hUuh$nbbusD<{KQ! zPn31icgsOS)iQ^tqPv)^mOveehD&>`bH0`F>EC?U4Yyb}y^H$kL&j-g*y7K}Z*ok& z#hVqK*x=X6F8kPo)^Hd574~3w#9o<(UK%%GX*`KkmmjQmpmLv|8C_Y~;c;Oj^-g;Q zKgnNmYQ5n7Sd9tjHM!C6AwFqe8=P+5>L^WMIoH3s0m?NO@ew`dKQ}I)&fcDjqg(x`&t~okpwm%5rLsaaJ70NUG`^ zT3XE3l{eC~Eal1b_&Uc;06v+mafyV~?o2ugy6-BPa|QXe^b_#0eWbbZPdvu?Rw;)| zM^h$&*nB=AT{-3JUx=sQeqIsG6$sj@ztCgf0lyN&$CgEKq%P;|?w4C|c$O9={jul? zzrK_C>;c1#3v(J*WEJ}Q$)RJ%a_e*8FR#Xv{lQ%ooK`z>;Pv+zs<(c^EE4

K3H7xG_+Xfq}1cqf^$pMagyq-!A4^d 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 literal 0 HcmV?d00001 diff --git a/Lab-1/app_python/docs/screenshots/lab_05_2.png b/Lab-1/app_python/docs/screenshots/lab_05_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a7a45e218f142ed8b381e2b78813705238faec23 GIT binary patch literal 45102 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 o5$o1j+-226to!-Y!{sf { + "changed": false, + "msg": "All assertions passed" +} + +TASK [app_deploy : Read current container information] ************************* +ok: [web-01] + +TASK [app_deploy : Log in to Docker Hub] *************************************** +ok: [web-01] + +TASK [app_deploy : Pull application image] ************************************* +ok: [web-01] + +TASK [app_deploy : Stop existing container when redeploy is required] ********** +skipping: [web-01] + +TASK [app_deploy : Remove old container when redeploy is required] ************* +skipping: [web-01] + +TASK [app_deploy : Run application container] ********************************** +changed: [web-01] + +TASK [app_deploy : Wait for application port] ********************************** +ok: [web-01] + +TASK [app_deploy : Verify health endpoint] ************************************* +ok: [web-01] + +PLAY RECAP ********************************************************************* +web-01 : ok=8 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 ``` ### `docker ps` output ```text -# paste output here +web-01 | CHANGED | rc=0 >> +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +c10a9b0e7565 linktur/devops-lab2:v1 "python app.py" 27 minutes ago Up 27 minutes 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp devops-lab2 ``` ### Health checks ```text -# paste curl outputs here +curl http://10.241.1.215:5000/health +{"status":"healthy","timestamp":"2026-03-13T20:51:31.374Z","uptime_seconds":4768} + +curl http://10.241.1.215:5000/ +{"endpoints":[{"description":"Service information","method":"GET","path":"/"},{"description":"Health check","method":"GET","path":"/health"}],"request":{"client_ip":"10.241.1.148","method":"GET","path":"/","user_agent":"curl/7.81.0"},"runtime":{"current_time":"2026-03-13T20:51:31.383Z","timezone":"UTC","uptime_human":"1 hours, 19 minutes","uptime_seconds":4768},"service":{"description":"DevOps course info service","framework":"Flask","name":"devops-info-service","version":"1.0.0"},"system":{"architecture":"x86_64","cpu_count":1,"hostname":"c10a9b0e7565","platform":"Linux","platform_version":"Debian GNU/Linux 13 (trixie)","python_version":"3.13.12"}} ``` ### Handler execution @@ -162,3 +288,8 @@ Vault protects secrets in version control and CI logs. It allows collaboration w - `ansible` may not be preinstalled on control node: install in WSL or Linux before running. - Docker repo can require distro-specific release names; override `docker_apt_release` if needed. - Ensure VM firewall allows `22` and `5000` from your workstation. + +## 8. Screenshots + +![Lab 05 Screenshot 1](../../Lab-1/app_python/docs/screenshots/lab_05_1.png) +![Lab 05 Screenshot 2](../../Lab-1/app_python/docs/screenshots/lab_05_2.png) diff --git a/ansible/inventory/hosts.ini b/ansible/inventory/hosts.ini index bddf4fa1c9..dfeebb20fa 100644 --- a/ansible/inventory/hosts.ini +++ b/ansible/inventory/hosts.ini @@ -1,6 +1,6 @@ [webservers] # Replace values below with your VM details from Lab 4 -web-01 ansible_host=10.241.1.215 ansible_user=sevan ansible_ssh_private_key_file=~/.ssh/id_rsa +web-01 ansible_host=10.241.1.215 ansible_user=loshara ansible_ssh_private_key_file=~/.ssh/id_rsa [webservers:vars] ansible_python_interpreter=/usr/bin/python3 diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml index 533bf902e0..c8880281d1 100644 --- a/ansible/playbooks/deploy.yml +++ b/ansible/playbooks/deploy.yml @@ -2,6 +2,8 @@ - name: Deploy application hosts: webservers become: true + vars_files: + - ../group_vars/all.yml roles: - app_deploy diff --git a/ansible/roles/common/tasks/main.yml b/ansible/roles/common/tasks/main.yml index 93e0d39f02..296ce4a636 100644 --- a/ansible/roles/common/tasks/main.yml +++ b/ansible/roles/common/tasks/main.yml @@ -3,11 +3,13 @@ ansible.builtin.apt: update_cache: true cache_valid_time: "{{ common_apt_cache_valid_time }}" + lock_timeout: 600 - name: Install common packages ansible.builtin.apt: name: "{{ common_packages }}" state: present + lock_timeout: 600 - name: Read current timezone ansible.builtin.command: timedatectl show --property=Timezone --value diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml index 8b1c6a8924..df20387b35 100644 --- a/ansible/roles/docker/tasks/main.yml +++ b/ansible/roles/docker/tasks/main.yml @@ -3,11 +3,13 @@ ansible.builtin.apt: update_cache: true cache_valid_time: "{{ docker_apt_cache_valid_time }}" + lock_timeout: 600 - name: Install Docker prerequisites ansible.builtin.apt: name: "{{ docker_prerequisite_packages }}" state: present + lock_timeout: 600 - name: Ensure Docker keyring directory exists ansible.builtin.file: @@ -38,6 +40,7 @@ name: "{{ docker_packages }}" state: present update_cache: true + lock_timeout: 600 notify: restart docker - name: Ensure Docker service is enabled and running From c6884c3fb3d449b0b683c19f8c88537c829d204b Mon Sep 17 00:00:00 2001 From: Linktur Date: Thu, 19 Mar 2026 01:06:15 +0300 Subject: [PATCH 3/5] lab06 --- .github/workflows/ansible-deploy.yml | 119 ++++++++++++++ README.md | 1 + ansible/docs/LAB06.md | 118 ++++++++++++++ ansible/group_vars/all.yml.bak | 19 +++ ansible/group_vars/all.yml.example | 11 +- ansible/playbooks/deploy.yml | 21 ++- ansible/playbooks/provision.yml | 8 +- ansible/roles/app_deploy/defaults/main.yml | 14 -- ansible/roles/app_deploy/handlers/main.yml | 7 - ansible/roles/app_deploy/tasks/main.yml | 77 --------- ansible/roles/common/defaults/main.yml | 2 + ansible/roles/common/tasks/main.yml | 69 ++++++-- ansible/roles/docker/tasks/main.yml | 152 +++++++++++------- ansible/roles/web_app/defaults/main.yml | 26 +++ ansible/roles/web_app/handlers/main.yml | 8 + ansible/roles/web_app/meta/main.yml | 7 + ansible/roles/web_app/tasks/main.yml | 101 ++++++++++++ ansible/roles/web_app/tasks/wipe.yml | 55 +++++++ .../web_app/templates/docker-compose.yml.j2 | 17 ++ screenshots/lab06_ans.png | Bin 0 -> 74513 bytes 20 files changed, 653 insertions(+), 179 deletions(-) create mode 100644 .github/workflows/ansible-deploy.yml create mode 100644 ansible/docs/LAB06.md create mode 100644 ansible/group_vars/all.yml.bak delete mode 100644 ansible/roles/app_deploy/defaults/main.yml delete mode 100644 ansible/roles/app_deploy/handlers/main.yml delete mode 100644 ansible/roles/app_deploy/tasks/main.yml create mode 100644 ansible/roles/web_app/defaults/main.yml create mode 100644 ansible/roles/web_app/handlers/main.yml create mode 100644 ansible/roles/web_app/meta/main.yml create mode 100644 ansible/roles/web_app/tasks/main.yml create mode 100644 ansible/roles/web_app/tasks/wipe.yml create mode 100644 ansible/roles/web_app/templates/docker-compose.yml.j2 create mode 100644 screenshots/lab06_ans.png diff --git a/.github/workflows/ansible-deploy.yml b/.github/workflows/ansible-deploy.yml new file mode 100644 index 0000000000..27a092f978 --- /dev/null +++ b/.github/workflows/ansible-deploy.yml @@ -0,0 +1,119 @@ +name: Ansible Deployment + +on: + push: + branches: + - master + - main + paths: + - "ansible/**" + - "!ansible/docs/**" + - ".github/workflows/ansible-deploy.yml" + pull_request: + branches: + - master + - main + paths: + - "ansible/**" + - "!ansible/docs/**" + - ".github/workflows/ansible-deploy.yml" + +concurrency: + group: ansible-deploy-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + lint: + name: Ansible Lint + runs-on: ubuntu-latest + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: Install Ansible toolchain + run: | + pip install ansible ansible-lint + ansible-galaxy collection install -r ansible/requirements.yml + + - name: Run ansible-lint + working-directory: ansible + run: ansible-lint playbooks/*.yml + + deploy: + name: Deploy Application + needs: lint + if: github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main') + runs-on: ubuntu-latest + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: Install Ansible toolchain + run: | + pip install ansible + ansible-galaxy collection install -r ansible/requirements.yml + + - name: Configure SSH access + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan -H "${{ secrets.VM_HOST }}" >> ~/.ssh/known_hosts + + - name: Create runtime inventory + run: | + cat > /tmp/hosts.ini < /tmp/vault_pass + VAULT_ARGS="--vault-password-file /tmp/vault_pass" + fi + + ansible-playbook playbooks/deploy.yml \ + -i /tmp/hosts.ini \ + $VAULT_ARGS \ + -e "dockerhub_username=$DOCKERHUB_USERNAME" \ + -e "dockerhub_password=$DOCKERHUB_PASSWORD" + + rm -f /tmp/vault_pass + + - name: Verify deployment + run: | + sleep 10 + curl -f "http://${{ secrets.VM_HOST }}:5000/" >/dev/null + curl -f "http://${{ secrets.VM_HOST }}:5000/health" >/dev/null diff --git a/README.md b/README.md index 371d51f456..cdc48abecf 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Labs](https://img.shields.io/badge/Labs-18-blue)](#labs) [![Exam](https://img.shields.io/badge/Exam-Optional-green)](#exam-alternative) [![Duration](https://img.shields.io/badge/Duration-18%20Weeks-lightgrey)](#course-roadmap) +[![Ansible Deployment](https://github.com/Linktur/DevOps-Core-Course/actions/workflows/ansible-deploy.yml/badge.svg)](https://github.com/Linktur/DevOps-Core-Course/actions/workflows/ansible-deploy.yml) Master **production-grade DevOps practices** through hands-on labs. Build, containerize, deploy, monitor, and scale applications using industry-standard tools. diff --git a/ansible/docs/LAB06.md b/ansible/docs/LAB06.md new file mode 100644 index 0000000000..cc7d8ff752 --- /dev/null +++ b/ansible/docs/LAB06.md @@ -0,0 +1,118 @@ +## 1. Overview + +In this lab I improved Ansible project from Lab05. + +I did: +- blocks, rescue, always +- tags for selective run +- Docker Compose deploy +- wipe logic (safe delete) +- GitHub Actions workflow for Ansible + +Main files: +- `ansible/roles/common/tasks/main.yml` +- `ansible/roles/docker/tasks/main.yml` +- `ansible/roles/web_app/tasks/main.yml` +- `ansible/roles/web_app/tasks/wipe.yml` +- `ansible/roles/web_app/templates/docker-compose.yml.j2` +- `.github/workflows/ansible-deploy.yml` + +## 2. Blocks and Tags + +I added blocks and tags in roles: + +- `common` role: tags `packages`, `users` +- `docker` role: tags `docker_install`, `docker_config` +- role-level tags: `common`, `docker`, `web_app` + +List tags result: +- `common, docker, docker_config, docker_install, packages, users` + +Selective run tests: +- `--tags docker` works +- `--skip-tags common` works + +## 3. Docker Compose Migration + +I renamed role `app_deploy` to `web_app`. + +I changed deploy from `docker_container` to Docker Compose (`docker_compose_v2`). + +I added: +- compose template with variables +- role dependency `web_app -> docker` +- health check after deploy + +## 4. Wipe Logic + +Safety logic: +- variable: `web_app_wipe` (default `false`) +- tag: `web_app_wipe` + +Behavior: +- normal deploy: wipe tasks are skipped +- wipe-only command: removes app files and containers +- clean reinstall: wipe first, then deploy + +## 5. CI/CD + +I created workflow: +- file: `.github/workflows/ansible-deploy.yml` +- jobs: `lint` and `deploy` +- deploy uses SSH + secrets +- workflow has verification step with `curl` + +I also added workflow badge in `README.md`. + +## 6. Test Results (from terminal) + +### Provision with tags +- `ansible-playbook playbooks/provision.yml --tags docker` +- Result: `ok=9 changed=0 failed=0` + +### Deploy run 1 +- `ansible-playbook playbooks/deploy.yml --vault-id @prompt` +- Result: `ok=22 changed=2 failed=0` + +### Deploy run 2 (idempotency) +- `ansible-playbook playbooks/deploy.yml --vault-id @prompt` +- Result: `ok=21 changed=0 failed=0` + +### Wipe only +- `ansible-playbook playbooks/deploy.yml --vault-id @prompt -e "web_app_wipe=true" --tags web_app_wipe` +- Result: `ok=8 changed=3 failed=0` + +### Clean reinstall +- `ansible-playbook playbooks/deploy.yml --vault-id @prompt -e "web_app_wipe=true"` +- Result: `ok=25 changed=3 failed=0` + +### Safety check (tag only, variable false) +- `ansible-playbook playbooks/deploy.yml --vault-id @prompt --tags web_app_wipe` +- Result: `ok=3 changed=0 skipped=6 failed=0` + +### Service checks +- `curl http://10.241.1.215:5000/` -> app returns JSON +- `curl http://10.241.1.215:5000/health` -> `{"status":"healthy", ...}` + +### Screenshot +![Lab06 Ansible result](../../screenshots/lab06_ans.png) + +## 7. Simple Research Answers + +1. **Why variable + tag for wipe?** + For double safety. It is harder to delete app by mistake. + +2. **Why wipe before deploy?** + So clean reinstall works in one command. + +3. **Can we use Vault vars in templates?** + Yes, Vault vars work like normal Ansible vars after decrypt. + +4. **`restart: always` vs `unless-stopped`?** + `always` always tries restart. `unless-stopped` does not restart container stopped by user. + +## 8. Notes + +- Warning about world-writable directory appears because project is in `/mnt/c/...`. +- It does not block lab execution. +- For cleaner setup, project can be moved to Linux FS (`~/...`). diff --git a/ansible/group_vars/all.yml.bak b/ansible/group_vars/all.yml.bak new file mode 100644 index 0000000000..0a12339d33 --- /dev/null +++ b/ansible/group_vars/all.yml.bak @@ -0,0 +1,19 @@ +$ANSIBLE_VAULT;1.1;AES256 +30616337323935636461353938633536396535653761663466316534616337313134626364393330 +3330356536366663656661633739643565343039363235340a653039626663643038653432613430 +61613166313238666165343734656439373935343131316566633131656331336263636236623766 +3334356230656133370a366630363037346365393533643566643266356131326336323061383131 +37646232343165373466376465643432663231386463393264323030623938306438323761626265 +38346235306230353965323530323330356266633132383662383436636338326466643363653537 +34313562663031373863333035623266643539386532366439356166306462323932363661303230 +31616232383461623334376538376535643966333837303839333462636661363130336433666366 +63663939623562616434383839386235313064666662626435633561653431343137313461663363 +31303264383430393030303533666163646462323234333966646336316161653665633930376635 +33636566656237373833643664343564663037376666323438613230643638343439313930303632 +38393834643462623834383762623138333532616566393334316262303765343464323232613934 +36336664316562633332613837616564343564353861613761666234383530356632393337643836 +39626530303966336235626231643739333366306161363962633033373362666565393337343232 +61323533346365333863333530356164373832313938656161663565383731326230636431323739 +65323861356434363630626231303161623239376561373937666231373962666533373439333438 +66373038613066663861353635333430393834633335356630653539386532343437623231306664 +6665363934336435303337306333373562306637383130643439 diff --git a/ansible/group_vars/all.yml.example b/ansible/group_vars/all.yml.example index c78ca54b14..43d3aef75b 100644 --- a/ansible/group_vars/all.yml.example +++ b/ansible/group_vars/all.yml.example @@ -8,8 +8,11 @@ dockerhub_password: "your-dockerhub-access-token" app_name: "devops-lab2" docker_image: "{{ dockerhub_username }}/{{ app_name }}" -docker_image_tag: "latest" +docker_tag: "latest" -app_port: 5000 -app_container_port: 5000 -app_container_name: "{{ app_name }}" +app_port: 5000 # Host port +app_internal_port: 5000 # Container port +compose_project_dir: "/opt/{{ app_name }}" + +# Wipe safety switch (used with --tags web_app_wipe) +web_app_wipe: false diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml index c8880281d1..07de8085af 100644 --- a/ansible/playbooks/deploy.yml +++ b/ansible/playbooks/deploy.yml @@ -2,8 +2,23 @@ - name: Deploy application hosts: webservers become: true - vars_files: - - ../group_vars/all.yml + + pre_tasks: + - name: Check whether local group_vars/all.yml exists + ansible.builtin.stat: + path: "{{ playbook_dir }}/../group_vars/all.yml" + register: deploy_local_group_vars + delegate_to: localhost + become: false + run_once: true + + - name: Load local vaulted variables when available + ansible.builtin.include_vars: + file: "{{ playbook_dir }}/../group_vars/all.yml" + when: deploy_local_group_vars.stat.exists + run_once: true roles: - - app_deploy + - role: web_app + tags: + - web_app diff --git a/ansible/playbooks/provision.yml b/ansible/playbooks/provision.yml index 7cc2e6678d..6334c412cc 100644 --- a/ansible/playbooks/provision.yml +++ b/ansible/playbooks/provision.yml @@ -4,5 +4,9 @@ become: true roles: - - common - - docker + - role: common + tags: + - common + - role: docker + tags: + - docker diff --git a/ansible/roles/app_deploy/defaults/main.yml b/ansible/roles/app_deploy/defaults/main.yml deleted file mode 100644 index a94b87ec17..0000000000 --- a/ansible/roles/app_deploy/defaults/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -app_name: "devops-lab2" -app_container_name: "{{ app_name }}" -app_port: 5000 -app_container_port: 5000 -app_restart_policy: unless-stopped -app_healthcheck_path: "/health" -app_wait_timeout: 90 - -app_env: - PORT: "{{ app_container_port | string }}" - -docker_image: "{{ dockerhub_username }}/{{ app_name }}" -docker_image_tag: "latest" diff --git a/ansible/roles/app_deploy/handlers/main.yml b/ansible/roles/app_deploy/handlers/main.yml deleted file mode 100644 index 92eee19dbc..0000000000 --- a/ansible/roles/app_deploy/handlers/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- name: restart application container - community.docker.docker_container: - name: "{{ app_container_name }}" - state: started - restart: true - when: app_container_info.exists | default(false) diff --git a/ansible/roles/app_deploy/tasks/main.yml b/ansible/roles/app_deploy/tasks/main.yml deleted file mode 100644 index 9a966ef892..0000000000 --- a/ansible/roles/app_deploy/tasks/main.yml +++ /dev/null @@ -1,77 +0,0 @@ ---- -- name: Validate required Docker Hub credentials - ansible.builtin.assert: - that: - - dockerhub_username is defined - - dockerhub_username | length > 0 - - dockerhub_password is defined - - dockerhub_password | length > 0 - fail_msg: >- - dockerhub_username/dockerhub_password are not set. - Create encrypted group_vars/all.yml with ansible-vault. - -- name: Read current container information - community.docker.docker_container_info: - name: "{{ app_container_name }}" - register: app_container_info - failed_when: false - changed_when: false - -- name: Log in to Docker Hub - community.docker.docker_login: - username: "{{ dockerhub_username }}" - password: "{{ dockerhub_password }}" - no_log: true - -- name: Pull application image - community.docker.docker_image: - name: "{{ docker_image }}:{{ docker_image_tag }}" - source: pull - register: app_image_pull - notify: restart application container - -- name: Stop existing container when redeploy is required - community.docker.docker_container: - name: "{{ app_container_name }}" - state: stopped - when: - - app_container_info.exists | default(false) - - app_container_info.container.State.Running | default(false) - - app_image_pull.changed or - (app_container_info.container.Config.Image | default('') != docker_image ~ ':' ~ docker_image_tag) - -- name: Remove old container when redeploy is required - community.docker.docker_container: - name: "{{ app_container_name }}" - state: absent - when: - - app_container_info.exists | default(false) - - app_image_pull.changed or - (app_container_info.container.Config.Image | default('') != docker_image ~ ':' ~ docker_image_tag) - -- name: Run application container - community.docker.docker_container: - name: "{{ app_container_name }}" - image: "{{ docker_image }}:{{ docker_image_tag }}" - state: started - restart_policy: "{{ app_restart_policy }}" - published_ports: - - "{{ app_port }}:{{ app_container_port }}" - env: "{{ app_env }}" - -- name: Wait for application port - ansible.builtin.wait_for: - host: "127.0.0.1" - port: "{{ app_port }}" - delay: 2 - timeout: "{{ app_wait_timeout }}" - -- name: Verify health endpoint - ansible.builtin.uri: - url: "http://127.0.0.1:{{ app_port }}{{ app_healthcheck_path }}" - method: GET - status_code: 200 - register: app_health_result - retries: 10 - delay: 3 - until: app_health_result.status == 200 diff --git a/ansible/roles/common/defaults/main.yml b/ansible/roles/common/defaults/main.yml index b2e4288d3b..086636f92b 100644 --- a/ansible/roles/common/defaults/main.yml +++ b/ansible/roles/common/defaults/main.yml @@ -13,3 +13,5 @@ common_packages: - unzip common_timezone: "UTC" +common_manage_user: true +common_user_name: "{{ ansible_user | default('ubuntu') }}" diff --git a/ansible/roles/common/tasks/main.yml b/ansible/roles/common/tasks/main.yml index 296ce4a636..623d912d66 100644 --- a/ansible/roles/common/tasks/main.yml +++ b/ansible/roles/common/tasks/main.yml @@ -1,21 +1,56 @@ --- -- name: Update apt cache - ansible.builtin.apt: - update_cache: true - cache_valid_time: "{{ common_apt_cache_valid_time }}" - lock_timeout: 600 +- name: Install common packages and configure timezone + block: + - name: Update apt cache + ansible.builtin.apt: + update_cache: true + cache_valid_time: "{{ common_apt_cache_valid_time }}" + lock_timeout: 600 -- name: Install common packages - ansible.builtin.apt: - name: "{{ common_packages }}" - state: present - lock_timeout: 600 + - name: Install common packages + ansible.builtin.apt: + name: "{{ common_packages }}" + state: present + lock_timeout: 600 -- name: Read current timezone - ansible.builtin.command: timedatectl show --property=Timezone --value - register: common_current_timezone - changed_when: false + - name: Read current timezone + ansible.builtin.command: timedatectl show --property=Timezone --value + register: common_current_timezone + changed_when: false -- name: Set timezone - ansible.builtin.command: "timedatectl set-timezone {{ common_timezone }}" - when: common_current_timezone.stdout != common_timezone + - name: Set timezone + ansible.builtin.command: "timedatectl set-timezone {{ common_timezone }}" + when: common_current_timezone.stdout != common_timezone + rescue: + - name: Recover apt metadata after failed package preparation + ansible.builtin.command: apt-get update --fix-missing + changed_when: false + + - name: Retry apt cache update after recovery + ansible.builtin.apt: + update_cache: true + cache_valid_time: "{{ common_apt_cache_valid_time }}" + lock_timeout: 600 + always: + - name: Record common role completion marker + ansible.builtin.lineinfile: + path: /tmp/ansible-common-role.log + line: "common role completed" + create: true + mode: "0644" + become: true + tags: + - packages + +- name: Ensure automation user exists + block: + - name: Create or update managed user + ansible.builtin.user: + name: "{{ common_user_name }}" + state: present + create_home: true + shell: /bin/bash + when: common_manage_user | bool + become: true + tags: + - users diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml index df20387b35..12a2a494d5 100644 --- a/ansible/roles/docker/tasks/main.yml +++ b/ansible/roles/docker/tasks/main.yml @@ -1,56 +1,98 @@ --- -- name: Update apt cache - ansible.builtin.apt: - update_cache: true - cache_valid_time: "{{ docker_apt_cache_valid_time }}" - lock_timeout: 600 - -- name: Install Docker prerequisites - ansible.builtin.apt: - name: "{{ docker_prerequisite_packages }}" - state: present - lock_timeout: 600 - -- name: Ensure Docker keyring directory exists - ansible.builtin.file: - path: "{{ docker_apt_keyring_dir }}" - state: directory - mode: "0755" - -- name: Download Docker GPG key - ansible.builtin.get_url: - url: "{{ docker_gpg_key_url }}" - dest: "{{ docker_apt_keyring_file }}" - mode: "0644" - notify: restart docker - -- name: Add Docker apt repository - ansible.builtin.apt_repository: - repo: >- - deb [arch={{ docker_architecture_map.get(ansible_architecture, 'amd64') }} - signed-by={{ docker_apt_keyring_file }}] - https://download.docker.com/linux/{{ docker_repo_distribution }} - {{ docker_apt_release }} stable - state: present - filename: docker - notify: restart docker - -- name: Install Docker packages - ansible.builtin.apt: - name: "{{ docker_packages }}" - state: present - update_cache: true - lock_timeout: 600 - notify: restart docker - -- name: Ensure Docker service is enabled and running - ansible.builtin.service: - name: docker - state: started - enabled: true - -- name: Add user to docker group - ansible.builtin.user: - name: "{{ docker_user }}" - groups: docker - append: true +- name: Install Docker engine + block: + - name: Update apt cache + ansible.builtin.apt: + update_cache: true + cache_valid_time: "{{ docker_apt_cache_valid_time }}" + lock_timeout: 600 + + - name: Install Docker prerequisites + ansible.builtin.apt: + name: "{{ docker_prerequisite_packages }}" + state: present + lock_timeout: 600 + + - name: Ensure Docker keyring directory exists + ansible.builtin.file: + path: "{{ docker_apt_keyring_dir }}" + state: directory + mode: "0755" + + - name: Download Docker GPG key + ansible.builtin.get_url: + url: "{{ docker_gpg_key_url }}" + dest: "{{ docker_apt_keyring_file }}" + mode: "0644" + notify: restart docker + + - name: Add Docker apt repository + ansible.builtin.apt_repository: + repo: >- + deb [arch={{ docker_architecture_map.get(ansible_architecture, 'amd64') }} + signed-by={{ docker_apt_keyring_file }}] + https://download.docker.com/linux/{{ docker_repo_distribution }} + {{ docker_apt_release }} stable + state: present + filename: docker + notify: restart docker + + - name: Install Docker packages + ansible.builtin.apt: + name: "{{ docker_packages }}" + state: present + update_cache: true + lock_timeout: 600 + notify: restart docker + rescue: + - name: Wait before retrying Docker apt metadata updates + ansible.builtin.pause: + seconds: 10 + + - name: Retry apt cache update after Docker key/repository failure + ansible.builtin.apt: + update_cache: true + lock_timeout: 600 + + - name: Retry Docker GPG key download + ansible.builtin.get_url: + url: "{{ docker_gpg_key_url }}" + dest: "{{ docker_apt_keyring_file }}" + mode: "0644" + + - name: Re-apply Docker apt repository after retry + ansible.builtin.apt_repository: + repo: >- + deb [arch={{ docker_architecture_map.get(ansible_architecture, 'amd64') }} + signed-by={{ docker_apt_keyring_file }}] + https://download.docker.com/linux/{{ docker_repo_distribution }} + {{ docker_apt_release }} stable + state: present + filename: docker + + - name: Retry Docker package installation + ansible.builtin.apt: + name: "{{ docker_packages }}" + state: present + update_cache: true + lock_timeout: 600 + always: + - name: Ensure Docker service is enabled and running + ansible.builtin.service: + name: docker + state: started + enabled: true + become: true + tags: + - docker_install + +- name: Configure Docker access + block: + - name: Add user to docker group + ansible.builtin.user: + name: "{{ docker_user }}" + groups: docker + append: true + become: true + tags: + - docker_config diff --git a/ansible/roles/web_app/defaults/main.yml b/ansible/roles/web_app/defaults/main.yml new file mode 100644 index 0000000000..809f9fde68 --- /dev/null +++ b/ansible/roles/web_app/defaults/main.yml @@ -0,0 +1,26 @@ +--- +# Application configuration +app_name: "devops-lab2" +app_port: 5000 +app_internal_port: "{{ app_container_port | default(5000) }}" +app_healthcheck_path: "/health" +app_wait_timeout: 90 +app_restart_policy: "unless-stopped" + +# Docker image configuration +docker_image: "{{ dockerhub_username }}/{{ app_name }}" +docker_tag: "{{ docker_image_tag | default('latest') }}" + +# Compose configuration +docker_compose_version: "3.8" +compose_project_dir: "/opt/{{ app_name }}" +web_app_compose_pull_policy: "always" +web_app_compose_recreate: "auto" +web_app_remove_image: false + +# Deployment safety controls +web_app_wipe: false + +# Environment variables passed to the application container. +app_env: + PORT: "{{ app_internal_port | string }}" diff --git a/ansible/roles/web_app/handlers/main.yml b/ansible/roles/web_app/handlers/main.yml new file mode 100644 index 0000000000..6d8680d2ae --- /dev/null +++ b/ansible/roles/web_app/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: restart web application + community.docker.docker_compose_v2: + project_src: "{{ compose_project_dir }}" + state: present + recreate: always + pull: never + become: true diff --git a/ansible/roles/web_app/meta/main.yml b/ansible/roles/web_app/meta/main.yml new file mode 100644 index 0000000000..cc004b056f --- /dev/null +++ b/ansible/roles/web_app/meta/main.yml @@ -0,0 +1,7 @@ +--- +# Docker must be available before docker_compose_v2 can start the application stack. +dependencies: + - role: docker + tags: + - docker + - web_app diff --git a/ansible/roles/web_app/tasks/main.yml b/ansible/roles/web_app/tasks/main.yml new file mode 100644 index 0000000000..b0711b4bdb --- /dev/null +++ b/ansible/roles/web_app/tasks/main.yml @@ -0,0 +1,101 @@ +--- +# Wipe logic executes first, but only performs cleanup when web_app_wipe=true. +- name: Include wipe tasks + ansible.builtin.include_tasks: wipe.yml + tags: + - web_app_wipe + +- name: Validate required Docker Hub credentials + ansible.builtin.assert: + that: + - dockerhub_username is defined + - dockerhub_username | length > 0 + - dockerhub_password is defined + - dockerhub_password | length > 0 + fail_msg: >- + dockerhub_username/dockerhub_password are not set. + Create encrypted group_vars/all.yml with ansible-vault. + tags: + - app_deploy + - compose + +- name: Deploy application with Docker Compose + block: + - name: Ensure compose project directory exists + ansible.builtin.file: + path: "{{ compose_project_dir }}" + state: directory + mode: "0755" + become: true + + - name: Render docker-compose configuration + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: "{{ compose_project_dir }}/docker-compose.yml" + mode: "0644" + become: true + + - name: Inspect existing container with target name + community.docker.docker_container_info: + name: "{{ app_name }}" + register: web_app_existing_container + failed_when: false + changed_when: false + become: true + + - name: Remove conflicting non-compose container + community.docker.docker_container: + name: "{{ app_name }}" + state: absent + force_kill: true + when: + - web_app_existing_container.exists | default(false) + - >- + (web_app_existing_container.container.Config.Labels['com.docker.compose.project'] | default('')) + != (compose_project_dir | basename) + become: true + + - name: Log in to Docker Hub + community.docker.docker_login: + username: "{{ dockerhub_username }}" + password: "{{ dockerhub_password }}" + no_log: true + + - name: Start or update application via Docker Compose + community.docker.docker_compose_v2: + project_src: "{{ compose_project_dir }}" + pull: "{{ web_app_compose_pull_policy }}" + recreate: "{{ web_app_compose_recreate }}" + state: present + register: web_app_compose_result + become: true + + - name: Wait for application port to become available + ansible.builtin.wait_for: + host: "127.0.0.1" + port: "{{ app_port }}" + delay: 2 + timeout: "{{ app_wait_timeout }}" + + - name: Verify health endpoint + ansible.builtin.uri: + url: "http://127.0.0.1:{{ app_port }}{{ app_healthcheck_path }}" + method: GET + status_code: 200 + register: app_health_result + retries: 10 + delay: 3 + until: app_health_result.status == 200 + rescue: + - name: Report deployment failure context + ansible.builtin.debug: + msg: >- + Docker Compose deployment failed for {{ app_name }} in + {{ compose_project_dir }}. Check docker compose logs on the target host. + + - name: Stop play when compose deployment failed + ansible.builtin.fail: + msg: "Deployment failed for {{ docker_image }}:{{ docker_tag }}. Verify image/tag exists in Docker Hub." + tags: + - app_deploy + - compose diff --git a/ansible/roles/web_app/tasks/wipe.yml b/ansible/roles/web_app/tasks/wipe.yml new file mode 100644 index 0000000000..760a653830 --- /dev/null +++ b/ansible/roles/web_app/tasks/wipe.yml @@ -0,0 +1,55 @@ +--- +- name: Check whether docker-compose.yml exists + ansible.builtin.stat: + path: "{{ compose_project_dir }}/docker-compose.yml" + register: web_app_compose_file + tags: + - web_app_wipe + +- name: Wipe web application deployment + block: + - name: Stop and remove compose services + community.docker.docker_compose_v2: + project_src: "{{ compose_project_dir }}" + state: absent + when: web_app_compose_file.stat.exists + become: true + ignore_errors: true + + - name: Optionally remove application image + community.docker.docker_image: + name: "{{ docker_image }}:{{ docker_tag }}" + state: absent + force_absent: true + when: web_app_remove_image | bool + become: true + ignore_errors: true + + - name: Remove legacy container with the same name + community.docker.docker_container: + name: "{{ app_name }}" + state: absent + force_kill: true + become: true + ignore_errors: true + + - name: Remove docker-compose file + ansible.builtin.file: + path: "{{ compose_project_dir }}/docker-compose.yml" + state: absent + become: true + ignore_errors: true + + - name: Remove application directory + ansible.builtin.file: + path: "{{ compose_project_dir }}" + state: absent + become: true + ignore_errors: true + + - name: Confirm wipe completion + ansible.builtin.debug: + msg: "Application {{ app_name }} wiped successfully" + when: web_app_wipe | bool + tags: + - web_app_wipe 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..29e89358dc --- /dev/null +++ b/ansible/roles/web_app/templates/docker-compose.yml.j2 @@ -0,0 +1,17 @@ +services: + {{ app_name }}: + image: "{{ docker_image }}:{{ docker_tag }}" + container_name: "{{ app_name }}" + restart: "{{ app_restart_policy }}" + ports: + - "{{ app_port }}:{{ app_internal_port }}" +{% if app_env | length > 0 %} + environment: +{% for key, value in app_env.items() %} + {{ key }}: "{{ value }}" +{% endfor %} +{% endif %} + +networks: + default: + name: "{{ app_name }}-network" diff --git a/screenshots/lab06_ans.png b/screenshots/lab06_ans.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b0555d9a8ce57313c1fef2deb875e3b26baa8c GIT binary patch literal 74513 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 z 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 Date: Thu, 19 Mar 2026 01:11:10 +0300 Subject: [PATCH 4/5] update lint --- .gitignore | 1 + ansible/.ansible-lint | 4 ++++ ansible/playbooks/deploy.yml | 2 -- ansible/playbooks/site.yml | 7 +++++-- ansible/roles/common/tasks/main.yml | 5 ++++- ansible/roles/docker/handlers/main.yml | 2 +- ansible/roles/docker/tasks/main.yml | 6 +++--- ansible/roles/web_app/handlers/main.yml | 2 +- ansible/roles/web_app/tasks/wipe.yml | 5 ----- 9 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 ansible/.ansible-lint diff --git a/.gitignore b/.gitignore index 29261542b6..99366496d3 100644 --- a/.gitignore +++ b/.gitignore @@ -37,5 +37,6 @@ credentials *.retry .vault_pass ansible/group_vars/all.yml +ansible/group_vars/*.bak ansible/inventory/*.pyc __pycache__/ diff --git a/ansible/.ansible-lint b/ansible/.ansible-lint new file mode 100644 index 0000000000..f452336661 --- /dev/null +++ b/ansible/.ansible-lint @@ -0,0 +1,4 @@ +--- +skip_list: + - key-order + - var-naming diff --git a/ansible/playbooks/deploy.yml b/ansible/playbooks/deploy.yml index 07de8085af..19eae420a5 100644 --- a/ansible/playbooks/deploy.yml +++ b/ansible/playbooks/deploy.yml @@ -10,13 +10,11 @@ register: deploy_local_group_vars delegate_to: localhost become: false - run_once: true - name: Load local vaulted variables when available ansible.builtin.include_vars: file: "{{ playbook_dir }}/../group_vars/all.yml" when: deploy_local_group_vars.stat.exists - run_once: true roles: - role: web_app diff --git a/ansible/playbooks/site.yml b/ansible/playbooks/site.yml index 139c08f693..1138ac0748 100644 --- a/ansible/playbooks/site.yml +++ b/ansible/playbooks/site.yml @@ -1,3 +1,6 @@ --- -- import_playbook: provision.yml -- import_playbook: deploy.yml +- name: Run Provision Playbook + import_playbook: provision.yml + +- name: Run Deploy Playbook + import_playbook: deploy.yml diff --git a/ansible/roles/common/tasks/main.yml b/ansible/roles/common/tasks/main.yml index 623d912d66..23ba41a223 100644 --- a/ansible/roles/common/tasks/main.yml +++ b/ansible/roles/common/tasks/main.yml @@ -21,9 +21,12 @@ - name: Set timezone ansible.builtin.command: "timedatectl set-timezone {{ common_timezone }}" when: common_current_timezone.stdout != common_timezone + changed_when: true rescue: - name: Recover apt metadata after failed package preparation - ansible.builtin.command: apt-get update --fix-missing + ansible.builtin.apt: + update_cache: true + force_apt_get: true changed_when: false - name: Retry apt cache update after recovery diff --git a/ansible/roles/docker/handlers/main.yml b/ansible/roles/docker/handlers/main.yml index 1a5058da5e..07aa0eb290 100644 --- a/ansible/roles/docker/handlers/main.yml +++ b/ansible/roles/docker/handlers/main.yml @@ -1,5 +1,5 @@ --- -- name: restart docker +- name: Restart docker ansible.builtin.service: name: docker state: restarted diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml index 12a2a494d5..7619894feb 100644 --- a/ansible/roles/docker/tasks/main.yml +++ b/ansible/roles/docker/tasks/main.yml @@ -24,7 +24,7 @@ url: "{{ docker_gpg_key_url }}" dest: "{{ docker_apt_keyring_file }}" mode: "0644" - notify: restart docker + notify: Restart docker - name: Add Docker apt repository ansible.builtin.apt_repository: @@ -35,7 +35,7 @@ {{ docker_apt_release }} stable state: present filename: docker - notify: restart docker + notify: Restart docker - name: Install Docker packages ansible.builtin.apt: @@ -43,7 +43,7 @@ state: present update_cache: true lock_timeout: 600 - notify: restart docker + notify: Restart docker rescue: - name: Wait before retrying Docker apt metadata updates ansible.builtin.pause: diff --git a/ansible/roles/web_app/handlers/main.yml b/ansible/roles/web_app/handlers/main.yml index 6d8680d2ae..2e8449c4b3 100644 --- a/ansible/roles/web_app/handlers/main.yml +++ b/ansible/roles/web_app/handlers/main.yml @@ -1,5 +1,5 @@ --- -- name: restart web application +- name: Restart web application community.docker.docker_compose_v2: project_src: "{{ compose_project_dir }}" state: present diff --git a/ansible/roles/web_app/tasks/wipe.yml b/ansible/roles/web_app/tasks/wipe.yml index 760a653830..559daf53de 100644 --- a/ansible/roles/web_app/tasks/wipe.yml +++ b/ansible/roles/web_app/tasks/wipe.yml @@ -14,7 +14,6 @@ state: absent when: web_app_compose_file.stat.exists become: true - ignore_errors: true - name: Optionally remove application image community.docker.docker_image: @@ -23,7 +22,6 @@ force_absent: true when: web_app_remove_image | bool become: true - ignore_errors: true - name: Remove legacy container with the same name community.docker.docker_container: @@ -31,21 +29,18 @@ state: absent force_kill: true become: true - ignore_errors: true - name: Remove docker-compose file ansible.builtin.file: path: "{{ compose_project_dir }}/docker-compose.yml" state: absent become: true - ignore_errors: true - name: Remove application directory ansible.builtin.file: path: "{{ compose_project_dir }}" state: absent become: true - ignore_errors: true - name: Confirm wipe completion ansible.builtin.debug: From 4436f3b4d206a3e9b0a047471fe2cfa9e455c45d Mon Sep 17 00:00:00 2001 From: Linktur Date: Thu, 19 Mar 2026 01:13:59 +0300 Subject: [PATCH 5/5] update md --- ansible/docs/LAB06.md | 1 + screenshots/lint_ans.png | Bin 0 -> 44654 bytes 2 files changed, 1 insertion(+) create mode 100644 screenshots/lint_ans.png diff --git a/ansible/docs/LAB06.md b/ansible/docs/LAB06.md index cc7d8ff752..e8edf1e733 100644 --- a/ansible/docs/LAB06.md +++ b/ansible/docs/LAB06.md @@ -96,6 +96,7 @@ I also added workflow badge in `README.md`. ### Screenshot ![Lab06 Ansible result](../../screenshots/lab06_ans.png) +![Lab06 Ansible lint](../../screenshots/lint_ans.png) ## 7. Simple Research Answers diff --git a/screenshots/lint_ans.png b/screenshots/lint_ans.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3ef9546b8d26edbe8b6bf94927e13155bc4f7e GIT binary patch literal 44654 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 z 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