Skip to content

Commit c91b27e

Browse files
authored
Merge pull request #8 from 3llimi/lab07
Ahmed Baha Eddine Alimi - B23-SD-01 [Lab07 + Bonus Task]
2 parents 272cd25 + 5382472 commit c91b27e

24 files changed

Lines changed: 1221 additions & 24 deletions

File tree

ansible/docs/LAB05.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 1. Architecture Overview
44

5-
**Ansible Version:** 2.10.8
5+
**Ansible Version:** 2.17.14
66
**Target VM OS:** Ubuntu 22.04 LTS (jammy64)
77
**Control Node:** Same VM (Ansible runs on the VM and targets itself via `ansible_connection=local`)
88

@@ -260,7 +260,7 @@ Any secret stored in plain text in a Git repository is effectively public, even
260260
## 7. Challenges
261261

262262
- **WSL2 disk space:** The WSL2 Alpine distro had only 136MB disk space, not enough to install Ansible. Solved by installing Ansible directly on the Vagrant VM and running it against localhost.
263-
- **Docker login module:** `community.general.docker_login` failed in Ansible 2.10. Solved by using a `shell` task with `docker login --password-stdin` instead.
263+
- **Docker login module:** `community.general.docker_login` failed. Solved by using a `shell` task with `docker login --password-stdin` instead.
264264
- **group_vars not loading with become:** Vault-encrypted `group_vars/all.yml` variables were not accessible when `become: yes` was set at the play level. Solved by passing variables explicitly with `-e @group_vars/all.yml` and setting `become: no` in the deploy playbook.
265265
- **App port:** The application runs on port 8000 (FastAPI/Uvicorn), not 5000 as initially assumed. Discovered via `docker logs` and corrected in the vault variables and port mapping.
266266

ansible/docs/LAB06.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ Both `ansible-deploy.yml` and `ansible-deploy-bonus.yml` show green in GitHub Ac
622622
## Summary
623623

624624
### Technologies Used
625-
- Ansible 2.10.8 on Ubuntu 22.04 (Vagrant VM, `ansible_connection=local`)
625+
- Ansible 2.17.14 on Ubuntu 22.04 (Vagrant VM, `ansible_connection=local`)
626626
- Docker Compose v2 plugin (`docker compose` not `docker-compose`)
627627
- GitHub Actions with self-hosted runner on the Vagrant VM
628628
- Jinja2 templating for docker-compose.yml generation
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
- name: Deploy Monitoring Stack
3+
hosts: all
4+
gather_facts: true
5+
6+
roles:
7+
- role: monitoring
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Service versions
2+
loki_version: "3.0.0"
3+
promtail_version: "3.0.0"
4+
grafana_version: "12.3.1"
5+
6+
# Ports
7+
loki_port: 3100
8+
promtail_port: 9080
9+
grafana_port: 3000
10+
11+
# Retention
12+
loki_retention_period: "168h"
13+
14+
# Grafana credentials
15+
grafana_admin_user: "admin"
16+
grafana_admin_password: "admin123"
17+
18+
# Deployment directory
19+
monitoring_dir: "/opt/monitoring"
20+
21+
# Schema
22+
loki_schema_version: "v13"
23+
loki_schema_from: "2024-01-01"
24+
25+
# Resource limits
26+
loki_memory_limit: "1g"
27+
loki_cpu_limit: "1.0"
28+
promtail_memory_limit: "256m"
29+
promtail_cpu_limit: "0.5"
30+
grafana_memory_limit: "512m"
31+
grafana_cpu_limit: "1.0"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
- name: Restart monitoring stack
3+
become: true
4+
community.docker.docker_compose_v2:
5+
project_src: "{{ monitoring_dir }}"
6+
state: present
7+
remove_orphans: true
8+
recreate: always
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
galaxy_info:
2+
author: 3llimi
3+
description: Deploys Loki, Promtail, and Grafana monitoring stack
4+
license: MIT
5+
min_ansible_version: "2.16"
6+
7+
dependencies:
8+
- role: docker
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
- name: Deploy monitoring stack with Docker Compose
3+
become: true
4+
tags: [monitoring, monitoring_deploy]
5+
block:
6+
- name: Deploy monitoring stack
7+
community.docker.docker_compose_v2:
8+
project_src: "{{ monitoring_dir }}"
9+
state: present
10+
remove_orphans: true
11+
register: compose_result
12+
13+
- name: Wait for Loki to be ready
14+
ansible.builtin.uri:
15+
url: "http://localhost:{{ loki_port }}/ready"
16+
status_code: 200
17+
register: loki_ready
18+
retries: 12
19+
delay: 10
20+
until: loki_ready.status == 200
21+
22+
- name: Wait for Grafana to be ready
23+
ansible.builtin.uri:
24+
url: "http://localhost:{{ grafana_port }}/api/health"
25+
status_code: 200
26+
register: grafana_ready
27+
retries: 12
28+
delay: 10
29+
until: grafana_ready.status == 200
30+
31+
- name: Report deployment success
32+
ansible.builtin.debug:
33+
msg: "Monitoring stack deployed — Grafana at http://localhost:{{ grafana_port }}"
34+
35+
rescue:
36+
- name: Show container logs on failure
37+
ansible.builtin.command: >
38+
docker compose -f {{ monitoring_dir }}/docker-compose.yml logs --tail=20
39+
changed_when: false
40+
failed_when: false
41+
register: compose_logs
42+
43+
- name: Print container logs
44+
ansible.builtin.debug:
45+
msg: "{{ compose_logs.stdout_lines }}"
46+
47+
always:
48+
- name: Show running containers
49+
ansible.builtin.command: docker compose -f {{ monitoring_dir }}/docker-compose.yml ps
50+
changed_when: false
51+
failed_when: false
52+
register: compose_ps
53+
54+
- name: Print container status
55+
ansible.builtin.debug:
56+
msg: "{{ compose_ps.stdout_lines }}"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
- name: Setup monitoring directories and configs
3+
ansible.builtin.include_tasks: setup.yml
4+
tags: [monitoring, monitoring_setup]
5+
6+
- name: Deploy monitoring stack
7+
ansible.builtin.include_tasks: deploy.yml
8+
tags: [monitoring, monitoring_deploy]
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
- name: Setup monitoring directories and configuration files
3+
become: true
4+
tags: [monitoring, monitoring_setup]
5+
block:
6+
- name: Create monitoring directory structure
7+
ansible.builtin.file:
8+
path: "{{ item }}"
9+
state: directory
10+
mode: "0755"
11+
loop:
12+
- "{{ monitoring_dir }}"
13+
- "{{ monitoring_dir }}/loki"
14+
- "{{ monitoring_dir }}/promtail"
15+
16+
- name: Template Loki configuration
17+
ansible.builtin.template:
18+
src: loki-config.yml.j2
19+
dest: "{{ monitoring_dir }}/loki/config.yml"
20+
mode: "0644"
21+
notify: Restart monitoring stack
22+
23+
- name: Template Promtail configuration
24+
ansible.builtin.template:
25+
src: promtail-config.yml.j2
26+
dest: "{{ monitoring_dir }}/promtail/config.yml"
27+
mode: "0644"
28+
notify: Restart monitoring stack
29+
30+
- name: Template Docker Compose file
31+
ansible.builtin.template:
32+
src: docker-compose.yml.j2
33+
dest: "{{ monitoring_dir }}/docker-compose.yml"
34+
mode: "0644"
35+
notify: Restart monitoring stack
36+
37+
rescue:
38+
- name: Report setup failure
39+
ansible.builtin.debug:
40+
msg: "Failed to set up monitoring configuration. Check directory permissions."
41+
42+
always:
43+
- name: List monitoring directory
44+
ansible.builtin.command: ls -la {{ monitoring_dir }}
45+
changed_when: false
46+
failed_when: false
47+
register: monitoring_dir_contents
48+
49+
- name: Show monitoring directory contents
50+
ansible.builtin.debug:
51+
msg: "{{ monitoring_dir_contents.stdout_lines }}"
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
networks:
2+
logging:
3+
driver: bridge
4+
5+
volumes:
6+
loki-data:
7+
grafana-data:
8+
9+
services:
10+
11+
loki:
12+
image: grafana/loki:{{ loki_version }}
13+
container_name: loki
14+
ports:
15+
- "{{ loki_port }}:{{ loki_port }}"
16+
volumes:
17+
- {{ monitoring_dir }}/loki/config.yml:/etc/loki/config.yml:ro
18+
- loki-data:/loki
19+
command: -config.file=/etc/loki/config.yml
20+
networks:
21+
- logging
22+
healthcheck:
23+
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:{{ loki_port }}/ready || exit 1"]
24+
interval: 10s
25+
timeout: 5s
26+
retries: 5
27+
start_period: 20s
28+
deploy:
29+
resources:
30+
limits:
31+
cpus: '{{ loki_cpu_limit }}'
32+
memory: {{ loki_memory_limit }}
33+
restart: unless-stopped
34+
35+
promtail:
36+
image: grafana/promtail:{{ promtail_version }}
37+
container_name: promtail
38+
volumes:
39+
- {{ monitoring_dir }}/promtail/config.yml:/etc/promtail/config.yml:ro
40+
- /var/lib/docker/containers:/var/lib/docker/containers:ro
41+
- /var/run/docker.sock:/var/run/docker.sock:ro
42+
command: -config.file=/etc/promtail/config.yml
43+
networks:
44+
- logging
45+
depends_on:
46+
loki:
47+
condition: service_healthy
48+
deploy:
49+
resources:
50+
limits:
51+
cpus: '{{ promtail_cpu_limit }}'
52+
memory: {{ promtail_memory_limit }}
53+
restart: unless-stopped
54+
55+
grafana:
56+
image: grafana/grafana:{{ grafana_version }}
57+
container_name: grafana
58+
ports:
59+
- "{{ grafana_port }}:3000"
60+
volumes:
61+
- grafana-data:/var/lib/grafana
62+
environment:
63+
- GF_AUTH_ANONYMOUS_ENABLED=false
64+
- GF_SECURITY_ADMIN_USER={{ grafana_admin_user }}
65+
- GF_SECURITY_ADMIN_PASSWORD={{ grafana_admin_password }}
66+
networks:
67+
- logging
68+
depends_on:
69+
loki:
70+
condition: service_healthy
71+
healthcheck:
72+
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1"]
73+
interval: 10s
74+
timeout: 5s
75+
retries: 5
76+
start_period: 30s
77+
deploy:
78+
resources:
79+
limits:
80+
cpus: '{{ grafana_cpu_limit }}'
81+
memory: {{ grafana_memory_limit }}
82+
restart: unless-stopped

0 commit comments

Comments
 (0)