eadl:bloc4:fm2:td3

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
eadl:bloc4:fm2:td3 [2026/05/24 02:56] jcheroneadl:bloc4:fm2:td3 [2026/05/26 09:26] (Version actuelle) – [11. Execution et verification] jcheron
Ligne 1: Ligne 1:
-====== TD3 : Stack applicative 3 tiers avec Terraform et Ansible ======+====== TD - Automatisation d'une stack web avec Ansible ======
  
 ===== Objectifs ===== ===== Objectifs =====
  
-  Provisionner une stack front / back / db avec Terraform +A l'issue de ce TD, vous serez capable de : 
-  * Configurer chaque service avec Ansible + 
-  * Utiliser les groupes, variables et handlers Ansible +  Comprendre la séparation entre provisionnement (Terraform) et configuration (Ansible) 
-  * Identifier les limites d'idempotence d'un playbook+  * Configurer une stack web multi-services avec Ansible 
 +  * Ecrire des templates Jinja2 pour générer des fichiers de configuration dynamiques 
 +  * Utiliser les handlers pour gérer les redémarrages conditionnels 
 +  * Structurer un projet Ansible en rôles réutilisables 
 +  * Gérer les dépendances entre services 
 +  * Utiliser des variables par environnement
  
 ===== Contexte ===== ===== Contexte =====
  
-Vous travaillez dans une equipe DevOps pour une startup.+Vous intégrez l'équipe DevOps d'une plateforme e-commerce en forte croissance. 
 +L'infrastructure tourne sur AWS en production, mais l'equipe travaille en local avec Docker 
 +pour les environnements de developpement.
  
-L'equipe doit deployer un environnement de developpement compose de :+Votre mission : automatiser la configuration d'une stack composee de quatre serveurs :
  
-  * un frontend NGINX (page statique) +  * un reverse proxy Nginx 
-  * un backend Python Flask+  * une application Flask
   * une base de donnees PostgreSQL   * une base de donnees PostgreSQL
 +  * un cache Redis
  
-Probleme actuel :+Terraform a déjà provisionné les conteneurs. 
 +Vous utilisez Ansible pour configurer.
  
-  * les developpeurs configurent les services a la main +===== 0. Comprendre avant de faire =====
-  * les environnements different d'une machine a l'autre +
-  * le backend demarre avant la base de donnees et plante+
  
-Objectif :+==== 0.1 Rôles Ansible ====
  
-Automatiser le deploiement et la configuration de la stack complete.+Un rôle permet d’organiser :
  
-===== 1. Preparation du projet =====+  * tâches 
 +  * variables 
 +  * handlers 
 +  * templates
  
-<sxh bash;gutter:false+<WRAP round help> 
-mkdir td3-stack +Quel critère doit guider le découpage en rôles le service (nginx, flask...) 
-cd td3-stack +ou l'environnement (production, staging...) ? Justifiez. 
-mkdir terraform ansible ansible/group_vars+</WRAP
 + 
 +==== 0.2 Structure d’un rôle ==== 
 + 
 +<sxh> 
 +roles/ 
 +  nginx/ 
 +    tasks/main.yml 
 +    handlers/main.yml 
 +    templates/
 </sxh> </sxh>
  
-Structure attendue :+===== 1. Structure du projet =====
  
-<sxh;gutter:false+Creez la structure suivante : 
-td3-stack+<sxh bash
-  terraform+  td-ansible
-    main.tf +    docker
-    variables.tf +      Dockerfile 
-    outputs.tf +    terraform/ 
-  ansible/ +      main.tf 
-    inventory.ini +    ansible/ 
-    playbook.yml +      inventory/ 
-    group_vars/ +        hosts.yml 
-      frontend.yml +      group_vars/ 
-      backend.yml +        all.yml 
-      database.yml+        frontend.yml 
 +        backend.yml 
 +        db.yml 
 +        cache.yml 
 +      roles/ 
 +        nginx/ 
 +          tasks/ 
 +            main.yml 
 +          templates/ 
 +            nginx.conf.j2 
 +          handlers/ 
 +            main.yml 
 +        flask/ 
 +          tasks/ 
 +            main.yml 
 +          handlers/ 
 +            main.yml 
 +        postgresql/ 
 +          tasks/ 
 +            main.yml 
 +          handlers/ 
 +            main.yml 
 +        redis/ 
 +          tasks/ 
 +            main.yml 
 +          handlers/ 
 +            main.yml 
 +      playbook.yml
 </sxh> </sxh>
 +===== 2. Construction de l'image Docker =====
  
-===== 2Provisionning Terraform =====+<WRAP round todo> 
 +Construisez l'image manuellement depuis le dossier docker. 
 +</WRAP>
  
-==== 2.1 Fichier de base ====+Fichier : ''docker/Dockerfile'' 
 + 
 +<sxh bash> 
 +FROM ubuntu:22.04 
 + 
 +RUN apt-get update -qq && \ 
 +    apt-get install -y -qq \ 
 +      openssh-server \ 
 +      python3 \ 
 +      python3-pip \ 
 +      sudo \ 
 +      curl \ 
 +    && mkdir -p /run/sshd \ 
 +    && echo 'root:root' | chpasswd \ 
 +    && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config 
 + 
 +EXPOSE 22 
 + 
 +CMD ["/usr/sbin/sshd", "-D"
 +</sxh> 
 + 
 +<sxh bash> 
 +cd docker 
 +docker build -t ansible-node:local . 
 +cd .. 
 +</sxh> 
 + 
 +===== 3Provisionnement avec Terraform ====
 + 
 +<WRAP round todo> 
 +Créez le fichier suivant, puis appliquez la configuration. 
 +</WRAP>
  
 Fichier : ''terraform/main.tf'' Fichier : ''terraform/main.tf''
Ligne 63: Ligne 143:
   required_providers {   required_providers {
     docker = {     docker = {
-      source = "kreuzwerker/docker"+      source  = "kreuzwerker/docker
 +      version = "~> 3.0"
     }     }
   }   }
Ligne 70: Ligne 151:
 provider "docker" {} provider "docker" {}
  
-resource "docker_image" "nginx" { +resource "docker_image" "base" { 
-  name = "nginx:latest"+  name         = "ansible-node:local" 
 +  keep_locally = true
 } }
  
-resource "docker_image" "flask" { +resource "docker_network" "stack_network" { 
-  name = "python:3.11-slim"+  name = "stack_network"
 } }
  
-resource "docker_network" "stack"+resource "docker_container" "nginx" { 
-  name = "td3-network" +  name  = "nginx
-+  image = docker_image.base.image_id
- +
-resource "docker_container" "frontend" { +
-  name  = "frontend+
-  image = docker_image.nginx.name +
   networks_advanced {   networks_advanced {
-    name = docker_network.stack.name+    name = docker_network.stack_network.name 
 +  } 
 +  ports { 
 +    internal = 22 
 +    external = 2221
   }   }
- 
   ports {   ports {
     internal = 80     internal = 80
-    external = 8080+    external = 8090
   }   }
 } }
  
-resource "docker_container" "backend" { +resource "docker_container" "flask" { 
-  name  = "backend+  name  = "flask
-  image = docker_image.flask.name +  image = docker_image.base.image_id
   networks_advanced {   networks_advanced {
-    name = docker_network.stack.name+    name = docker_network.stack_network.name
   }   }
 +  ports {
 +    internal = 22
 +    external = 2222
 +  }
 +}
  
 +resource "docker_container" "postgresql" {
 +  name  = "postgresql"
 +  image = docker_image.base.image_id
 +  networks_advanced {
 +    name = docker_network.stack_network.name
 +  }
   ports {   ports {
-    internal = 5000 +    internal = 22 
-    external = 5000+    external = 2223
   }   }
 +}
  
-  command = ["sleep""infinity"]+resource "docker_container" "redis
 +  name  = "redis" 
 +  image = docker_image.base.image_id 
 +  networks_advanced { 
 +    name = docker_network.stack_network.name 
 +  } 
 +  ports { 
 +    internal = 22 
 +    external = 2224 
 +  }
 } }
 +</sxh>
  
-# A COMPLETER : image et conteneur PostgreSQL +<sxh bash> 
-# port interne : 5432, port externe : 5432 +cd terraform 
-# variable d'environnement POSTGRES_PASSWORD = "secret" +terraform init 
-# connecte a td3-network+terraform apply
 </sxh> </sxh>
  
-==== 2.2 Outputs ====+<WRAP round help> 
 +Si vous obtenez une erreur indiquant que le réseau ou des conteneurs existent déjà, supprimez-les avant de relancer :
  
-Fichier : ''terraform/outputs.tf''+<sxh bash> 
 +docker rm -f nginx flask postgresql redis 
 +docker network rm stack_network 
 +terraform apply 
 +</sxh> 
 +</WRAP>
  
-<sxh js> 
-output "frontend_url" { 
-  value = "http://localhost:8080" 
-} 
  
-output "backend_url" { +<WRAP round help> 
-  value = "http://localhost:5000" +Questions 
-}+  * Que fait terraform init ? 
 +  * Pourquoi expose-t-on le port 22 de chaque conteneur sur un port différent de la machine hôte ? 
 +  * Que se passe-t-il si deux conteneurs exposent le même port ? 
 +</WRAP>
  
-output "database_host"+===== 4. Inventaire Ansible =====
-  value "database" +
-+
-</sxh>+
  
-==== 2.3 Deploiement ====+L'inventaire indique à Ansible quels sont les hôtes à gérer et comment s'y connecter.
  
-<sxh bash;gutter:false+<WRAP round todo> 
-cd terraform +Creez le fichier suivant. 
-terraform init + 
-terraform apply+Fichier ansible/inventory/hosts.yml 
 +</WRAP
 + 
 +<sxh yaml> 
 +all: 
 +  vars: 
 +    ansible_user: root 
 +    ansible_password: root 
 +    ansible_ssh_common_args: '-o StrictHostKeyChecking=no' 
 + 
 +  children: 
 +    frontend: 
 +      hosts: 
 +        nginx: 
 +          ansible_host: 127.0.0.1 
 +          ansible_port: 2221 
 + 
 +    backend: 
 +      hosts: 
 +        flask: 
 +          ansible_host: 127.0.0.1 
 +          ansible_port: 2222 
 + 
 +    db: 
 +      hosts: 
 +        postgresql: 
 +          ansible_host: 127.0.0.1 
 +          ansible_port: 2223 
 + 
 +    cache: 
 +      hosts: 
 +        redis: 
 +          ansible_host: 127.0.0.1 
 +          ansible_port: 2224
 </sxh> </sxh>
  
 <WRAP round todo> <WRAP round todo>
-Verifier que les trois conteneurs sont en cours d'execution :+Testez la connexion aux conteneurs 
 + 
 +Installez au préalable sshpass sur votre machine :
  
 <sxh bash;gutter:false> <sxh bash;gutter:false>
-docker ps +sudo apt-get install -y sshpass 
-docker network inspect td3-network+</sxh> 
 +puis : 
 +<sxh bash;gutter:false> 
 +  cd ansible/ 
 +  ansible all -i inventory/hosts.yml -m ping
 </sxh> </sxh>
 </WRAP> </WRAP>
  
-===== 3. Inventaire Ansible =====+<WRAP round help> 
 +Questions : 
 +  * Que signifie le parametre StrictHostKeyChecking=no ? 
 +  * Pourquoi est-ce acceptable en developpement mais pas en production ? 
 +  * Que retourne la commande ping d'Ansible 
 +</WRAP>
  
-Fichier : ''ansible/inventory.ini'' 
  
-<sxh ini> +===== 5. Variables par groupe =====
-[frontend] +
-localhost ansible_connection=local+
  
-[backend] +Les variables permettent de centraliser la configuration et de la rendre reutilisable.
-localhost ansible_connection=local+
  
-[database] +<WRAP round todo> 
-localhost ansible_connection=local +Creez les fichiers suivants.
-</sxh>+
  
-===== 4. Variables par groupe =====+</WRAP>
  
-Fichier : ''ansible/group_vars/frontend.yml''+ 
 +Fichier : ansible/group_vars/all.yml
  
 <sxh yaml> <sxh yaml>
-container_namefrontend +app_nameecommerce 
-html_content"<h1>Frontend - TD3</h1>"+app_envdevelopment 
 +app_domain: localhost
 </sxh> </sxh>
  
-Fichier : ''ansible/group_vars/backend.yml''+Fichier : ansible/group_vars/db.yml
  
 <sxh yaml> <sxh yaml>
-container_namebackend +db_nameecommerce_db 
-flask_app| +db_userapp_user 
-  from flask import Flask +db_password: changeme 
-  app = Flask(__name__)+db_port: 5432 
 +</sxh>
  
-  @app.route('/'+Fichier ansible/group_vars/cache.yml
-  def index(): +
-      return 'Backend OK'+
  
-  if __name__ == '__main__'+<sxh yaml> 
-      app.run(host='0.0.0.0', port=5000) +redis_port6379 
-packages: +redis_maxmemory256mb
-  - flask+
 </sxh> </sxh>
  
-Fichier : ''ansible/group_vars/database.yml''+Fichier : ansible/group_vars/backend.yml
  
 <sxh yaml> <sxh yaml>
-container_namedatabase +flask_port5000 
-db_userpostgres +flask_debugtrue 
-db_nameappdb +db_hostpostgresql 
-db_passwordsecret+cache_hostredis
 </sxh> </sxh>
  
-===== 5Playbook =====+Fichier : ansible/group_vars/frontend.yml
  
-Fichier : ''ansible/playbook.yml''+<sxh yaml> 
 +nginx_port: 80 
 +backend_host: flask 
 +backend_port: 5000 
 +</sxh> 
 + 
 + 
 + 
 +===== 6. Role PostgreSQL ===== 
 + 
 +On commence par la base de donnees car les autres services en dependent. 
 + 
 +<WRAP round todo> 
 +Creez le fichier suivant. 
 + 
 +Fichier : ansible/roles/postgresql/tasks/main.yml 
 +</WRAP>
  
 <sxh yaml> <sxh yaml>
 --- ---
-- name: Configuration frontend +- name: Installation de PostgreSQL 
-  hostsfrontend +  apt
-  gather_factsfalse+    name: 
 +      - postgresql 
 +      - postgresql-contrib 
 +      - python3-psycopg2 
 +    state: present 
 +    update_cacheyes
  
-  tasks: +- name: Demarrage de PostgreSQL 
-    - name: Copier la page HTML dans le conteneur +  service
-      community.docker.docker_container_exec+    namepostgresql 
-        container"{{ container_name }}" +    statestarted 
-        command> +    enabled: yes
-          bash -c "echo '{{ html_content }}' > /usr/share/nginx/html/index.html"+
  
-    - name: Recharger nginx +- name: Creation de la base de donnees 
-      community.docker.docker_container_exec+  becomeyes 
-        container: "{{ container_name }}" +  become_user: postgres 
-        commandnginx -s reload+  postgresql_db: 
 +    name: "{{ db_name }}" 
 +    statepresent
  
-- name: Configuration backend +- name: Creation de l'utilisateur applicatif 
-  hostsbackend +  becomeyes 
-  gather_factsfalse+  become_userpostgres 
 +  postgresql_user: 
 +    name: "{{ db_user }}" 
 +    password: "{{ db_password }}" 
 +    state: present 
 +- name: Attribution des privilègees 
 +  become: yes 
 +  become_user: postgres 
 +  postgresql_privs: 
 +    database: "{{ db_name }}" 
 +    role: "{{ db_user }}" 
 +    privs: ALL 
 +    type: database 
 +    state: present
  
-  tasks: +</sxh>
-    - name: Installer les dependances Python +
-      community.docker.docker_container_exec: +
-        container: "{{ container_name }}" +
-        command: pip install {{ packages | join(' ') }}+
  
-    - name: Copier le code Flask +===== 7Role Redis =====
-      community.docker.docker_container_exec: +
-        container: "{{ container_name }}" +
-        command: > +
-          bash -c "cat > /app.py << 'EOF' +
-          {{ flask_app }} +
-          EOF"+
  
-    - name: Demarrer Flask +<WRAP round todo> 
-      community.docker.docker_container_exec: +Creez le fichier suivant.
-        container: "{{ container_name }}" +
-        command: bash -c "nohup python /app.py &"+
  
-- nameConfiguration base de donnees +Fichier ansible/roles/redis/tasks/main.yml 
-  hosts: database +</WRAP>
-  gather_facts: false+
  
-  tasks: +<sxh yaml> 
-    - name: Attendre que PostgreSQL soit pret +--- 
-      community.docker.docker_container_exec+- name: Installation de Redis 
-        container"{{ container_name }}" +  apt
-        command: pg_isready -U {{ db_user }} +    nameredis-server 
-      registerpg_ready +    statepresent 
-      retries: 10 +    update_cacheyes
-      delay: 3 +
-      untilpg_ready.rc == 0+
  
-    - name: Creer la base de donnees applicative +- name: Configuration de Redis 
-      community.docker.docker_container_exec+  lineinfile: 
-        container: "{{ container_name }}" +    path: /etc/redis/redis.conf 
-        commandpsql -U {{ db_user }} -c "CREATE DATABASE {{ db_name }};"+    regexp'^maxmemory ' 
 +    line: "maxmemory {{ redis_maxmemory }}" 
 +  notifyrestart redis 
 + 
 +name: Demarrage de Redis 
 +  service: 
 +    name: redis-server 
 +    state: started 
 +    enabled: yes
 </sxh> </sxh>
  
-==== 5.1 Premier lancement ====+Fichier : ansible/roles/redis/handlers/main.yml
  
-<sxh bash;gutter:false+<sxh yaml
-cd ansible +--- 
-ansible-playbook -i inventory.ini playbook.yml+name: restart redis 
 +  service: 
 +    name: redis-server 
 +    state: restarted
 </sxh> </sxh>
 +
 +<WRAP round help>
 +Questions :
 +  * Qu'est-ce qu'un handler dans Ansible ?
 +  * Quand est-il declenché ?
 +  * Quelle est la différence entre notify et un appel direct à service ?
 +</WRAP>
 +
 +===== 8. Role Flask =====
  
 <WRAP round todo> <WRAP round todo>
-Verifier que les services repondent :+Créez le fichier suivant.
  
-<sxh bash;gutter:false> +Fichier ansible/roles/flask/tasks/main.yml
-curl http://localhost:8080 +
-curl http://localhost:5000 +
-</sxh>+
 </WRAP> </WRAP>
  
-==== 5.2 Deuxieme lancement ====+<sxh yaml> 
 +--- 
 +- name: Installation des dependances Python 
 +  apt: 
 +    name: 
 +      - python3 
 +      - python3-pip 
 +      - python3-venv 
 +    state: present 
 +    update_cache: yes
  
-<WRAP round todo> +- name: Creation du repertoire applicatif 
-Relancer le playbook sans modifier quoi que ce soit :+  file: 
 +    path: /opt/flask 
 +    state: directory 
 +    mode'0755'
  
-<sxh bash;gutter:false> +- nameCreation de l'application Flask 
-ansible-playbook -i inventory.ini playbook.yml+  copy: 
 +    dest: /opt/flask/app.py 
 +    content: | 
 +      from flask import Flask, jsonify 
 +      import os 
 +      import redis 
 +      import psycopg2 
 + 
 +      app = Flask(__name__) 
 + 
 +      @app.route('/health'
 +      def health(): 
 +          return jsonify(status='ok', env=os.environ.get('APP_ENV', 'unknown')) 
 + 
 +      if __name__ == '__main__': 
 +          app.run(host='0.0.0.0', port={{ flask_port }}, debug={{ flask_debug | lower }}) 
 +  notify: restart flask 
 + 
 +name: Installation de Flask et des dependances 
 +  pip: 
 +    name: 
 +      flask 
 +      - redis 
 +      - psycopg2-binary 
 +    executable: pip3 
 + 
 +- name: Creation du service systemd Flask 
 +  copy: 
 +    dest: /etc/systemd/system/flask.service 
 +    content: | 
 +      [Unit] 
 +      Description=Flask Application 
 +      After=network.target 
 + 
 +      [Service] 
 +      Environment=APP_ENV={{ app_env }} 
 +      Environment=DB_HOST={{ db_host }} 
 +      Environment=CACHE_HOST={{ cache_host }} 
 +      ExecStart=/usr/bin/python3 /opt/flask/app.py 
 +      Restart=always 
 + 
 +      [Install] 
 +      WantedBy=multi-user.target 
 +  notify: restart flask 
 + 
 +- name: Demarrage de Flask 
 +  shell: nohup python3 /opt/flask/app.py > /var/log/flask.log 2>&1 & 
 +  args : 
 +    chdir: /opt/flask
 </sxh> </sxh>
  
-Observer attentivement les erreurs.+Fichier : ansible/roles/flask/handlers/main.yml 
 + 
 +<sxh yaml> 
 +--- 
 +- name: restart flask 
 +  shell: pkill -f "python3 /opt/flask/app.py"; nohup python3 /opt/flask/app.py > /var/log/flask.log 2>&1 & 
 +  args : 
 +    chdir: /opt/flask 
 +</sxh> 
 + 
 +===== 9. Role Nginx ===== 
 + 
 +<WRAP round todo> 
 +Créez les fichiers suivants. 
 + 
 +Fichier : ansible/roles/nginx/tasks/main.yml
 </WRAP> </WRAP>
 +
 +<sxh yaml>
 +---
 +- name: Installation de Nginx
 +  apt:
 +    name: nginx
 +    state: present
 +    update_cache: yes
 +
 +- name: Configuration de Nginx
 +  template:
 +    src: nginx.conf.j2
 +    dest: /etc/nginx/sites-available/default
 +    mode: '0644'
 +  notify: restart nginx
 +
 +- name: Demarrage de Nginx
 +  service:
 +    name: nginx
 +    state: started
 +    enabled: yes
 +</sxh>
 +
 +Fichier : ansible/roles/nginx/templates/nginx.conf.j2
 +
 +<sxh js>
 +upstream backend {
 +    server {{ backend_host }}:{{ backend_port }};
 +}
 +
 +server {
 +    listen {{ nginx_port }};
 +    server_name {{ app_domain }};
 +
 +    location / {
 +        proxy_pass http://backend;
 +        proxy_set_header Host $host;
 +        proxy_set_header X-Real-IP $remote_addr;
 +    }
 +
 +    location /health {
 +        proxy_pass http://backend/health;
 +    }
 +}
 +</sxh>
 +
 +Fichier : ansible/roles/nginx/handlers/main.yml
 +
 +<sxh yaml>
 +---
 +- name: restart nginx
 +  service:
 +    name: nginx
 +    state: restarted
 +</sxh>
  
 <WRAP round help> <WRAP round help>
 Questions : Questions :
 +  * Quelle est la difference entre copy et template dans Ansible ?
 +  * Que fait la directive proxy_pass ?
 +  * Pourquoi utilise-t-on le nom du conteneur plutôt que son adresse IP ?
 +</WRAP>
  
-  * Quelles taches echouent ? Pour quelle raison precise ? +===== 10. Playbook principal ===== 
-  * Parmi les taches qui reussissent, lesquelles produisent quand meme un effet indesirable ? + 
-  * Qu'est-ce que cela implique si ce playbook est execute automatiquement dans une pipeline CI/CD ? +<WRAP round todo> 
-  * Comment corrigeriez-vous chaque tache concernee ?+Creez le fichier suivant. 
 + 
 +Fichier : ansible/playbook.yml
 </WRAP> </WRAP>
  
-===== 6Challenge =====+<sxh yaml> 
 +--- 
 +- name: Configuration de la base de donnees 
 +  hosts: db 
 +  become: yes 
 +  roles: 
 +    - postgresql 
 + 
 +- name: Configuration du cache 
 +  hosts: cache 
 +  become: yes 
 +  roles: 
 +    - redis 
 + 
 +- name: Configuration de l'application 
 +  hosts: backend 
 +  become: yes 
 +  roles: 
 +    - flask 
 + 
 +- name: Configuration du reverse proxy 
 +  hosts: frontend 
 +  become: yes 
 +  roles: 
 +    - nginx 
 +</sxh> 
 + 
 +<WRAP round help> 
 +Questions : 
 +  * Pourquoi l'ordre des plays dans le playbook est-il important ? 
 +  * Que se passe-t-il si on configure Nginx avant Flask ? 
 +  * A quoi sert le parametre become ? 
 +</WRAP> 
 + 
 +===== 11Execution et verification =====
  
 <WRAP round todo> <WRAP round todo>
-Ajouter un reverse proxy devant la stack.+Executez le playbook :
  
-Specifications :+  cd ansible/ 
 +  ansible-playbook -i inventory/hosts.yml playbook.yml
  
-  * image nginx:latest +Verifiez que l'application repond :
-  * nom du conteneur : proxy +
-  * port externe : 80 +
-  * connecte a td3-network +
-  * rediriger / vers le frontend et /api vers le backend+
  
-Contrainte le playbook Ansible de configuration du proxy doit etre idempotent.+  curl http://localhost:8090/health
 </WRAP> </WRAP>
  
-===== 7Bonus =====+===== 12Problème volontaire =====
  
 <WRAP round todo> <WRAP round todo>
-Generer l'inventaire Ansible automatiquement depuis les outputs Terraform.+Modifiez le fichier group_vars/frontend.yml et changez backend_host :
  
-<sxh bash;gutter:false> +  backend_hostwronghost
-cd terraform +
-terraform output -json > ../ansible/tf_outputs.json +
-</sxh>+
  
-Ecrire un script qui lit ''tf_outputs.json'' et produit un fichier ''inventory.ini'' valide.+Relancez le playbook, puis testez :
  
-Le resultat doit etre identique a l'inventaire ecrit manuellement en section 3.+  curl http://localhost:8080/health
 </WRAP> </WRAP>
  
 <WRAP round help> <WRAP round help>
-Question :+Questions : 
 +  * Que se passe-t-il et pourquoi ? 
 +  * Comment Ansible vous aide-t-il a identifier le probleme ? 
 +  * Ou dans les logs trouvez-vous l'erreur ? 
 +  * Comment corriger ? 
 +</WRAP>
  
-  * Dans quel cas cet inventaire genere devient-il indispensable par rapport a un inventaire ecrit a la main ?+<WRAP round todo> 
 +Corrigez la valeur de backend_host et relancez le playbook. 
 +Vérifiez que l'application répond correctement.
 </WRAP> </WRAP>
  
 +===== 13. Challenge final =====
 +
 +Vous devez ajouter un nouveau service de monitoring.
 +
 +<WRAP round todo>
 +Sans aide, créez un rôle Ansible pour installer et configurer Netdata sur le conteneur flask.
 +
 +Contraintes :
 +  * Le service doit demarrer automatiquement
 +  * Le port d'écoute doit être defini dans une variable
 +  * Un handler doit gérer le redémarrage
 +  * Le conteneur flask doit exposer le port correspondant dans main.tf
 +
 +Vérifiez que Netdata est accessible depuis votre navigateur.
 +</WRAP>
 +
 +===== Bonus =====
 +
 +<WRAP round todo>
 +  * Ajoutez un tag Ansible sur chaque play pour pouvoir executer uniquement un rôle spécifique
 +  * Créez un fichier ansible.cfg pour éviter de spécifier l'inventaire à chaque commande
 +  * Chiffrez le fichier group_vars/db.yml avec ansible-vault pour protéger le mot de passe
 +</WRAP>
  • eadl/bloc4/fm2/td3.1779584215.txt.gz
  • Dernière modification : il y a 3 jours
  • de jcheron