# 🎯 Exercice : AmĂ©liorer le serveur Nginx avec Ansible ## 📋 Objectif de l'exercice Tu vas amĂ©liorer ton projet Ansible actuel en ajoutant 3 fonctionnalitĂ©s importantes : 1. ✅ **HTTPS** (sĂ©curiser le site avec un certificat SSL) 2. ✅ **Authentification** (protĂ©ger l'accĂšs avec login/password) 3. ✅ **DĂ©ployer des pages web** (mettre ton propre site HTML) --- ## 🚀 Partie 1 : Configurer HTTPS avec Let's Encrypt ### đŸ€” C'est quoi HTTPS ? - HTTP = ton site est accessible mais **pas sĂ©curisĂ©** (pas de cadenas 🔓) - HTTPS = ton site est **sĂ©curisĂ©** avec un certificat SSL (cadenas vert 🔒) - Les donnĂ©es sont **chiffrĂ©es** entre le navigateur et le serveur ### 📝 Ce que tu dois faire : #### Étape 1.1 : Installer Certbot Certbot = outil gratuit pour obtenir un certificat SSL **Ajoute cette tĂąche dans `playbook.yml`** (aprĂšs l'installation de Nginx) : ```yaml - name: Installer Certbot pour Let's Encrypt apt: name: - certbot - python3-certbot-nginx state: present ``` **💡 Explication** : - `certbot` = l'outil principal - `python3-certbot-nginx` = plugin pour configurer automatiquement Nginx #### Étape 1.2 : GĂ©nĂ©rer le certificat SSL **Ajoute cette tĂąche** : ```yaml - name: Obtenir un certificat SSL avec Certbot command: certbot --nginx -d defder.fr --non-interactive --agree-tos --email ton-email@exemple.com args: creates: /etc/letsencrypt/live/defder.fr/fullchain.pem ``` **💡 Explication** : - `--nginx` = configure automatiquement Nginx - `-d defder.fr` = ton nom de domaine - `--non-interactive` = pas de questions (automatique) - `--agree-tos` = accepte les conditions - `--email` = **REMPLACE par ton vrai email !** - `creates: ...` = ne refait pas si le certificat existe dĂ©jĂ  #### Étape 1.3 : Renouvellement automatique Les certificats expirent tous les 90 jours. Il faut les renouveler automatiquement. **Ajoute cette tĂąche** : ```yaml - name: Configurer le renouvellement automatique du certificat cron: name: "Renouveler certificat SSL" minute: "0" hour: "3" job: "certbot renew --quiet" ``` **💡 Explication** : - VĂ©rifie chaque jour Ă  3h du matin si le certificat doit ĂȘtre renouvelĂ© - `--quiet` = ne fait pas de bruit dans les logs #### ✅ VĂ©rification Partie 1 Lance ton playbook : `./run.sh` Ensuite, teste dans ton navigateur : `https://defder.fr` - Tu dois voir le **cadenas vert 🔒** - Le site est maintenant sĂ©curisĂ© ! --- ## 🔐 Partie 2 : Ajouter une authentification ### đŸ€” C'est quoi l'authentification ? Une popup qui demande **login + password** avant d'accĂ©der au site. Utile pour protĂ©ger un site privĂ©, un backoffice, etc. ### 📝 Ce que tu dois faire : #### Étape 2.1 : Installer les outils nĂ©cessaires **Ajoute cette tĂąche** : ```yaml - name: Installer apache2-utils pour htpasswd apt: name: apache2-utils state: present ``` **💡 Explication** : - `htpasswd` = outil pour crĂ©er des fichiers de mots de passe #### Étape 2.2 : CrĂ©er un utilisateur avec mot de passe **Ajoute cette tĂąche** : ```yaml - name: CrĂ©er un fichier de mots de passe htpasswd: path: /etc/nginx/.htpasswd name: admin password: "MonMotDePasse123" owner: root group: www-data mode: '0640' ``` **💡 Explication** : - CrĂ©e un fichier `/etc/nginx/.htpasswd` - Utilisateur : `admin` - Mot de passe : `MonMotDePasse123` (**CHANGE-LE !**) - `mode: '0640'` = permissions sĂ©curisĂ©es #### Étape 2.3 : CrĂ©er un fichier de configuration Nginx Tu vas crĂ©er un fichier de config personnalisĂ© pour Nginx. **D'abord, crĂ©e un dossier `templates/` dans ton projet** : ``` iaac/ ├── templates/ │ └── nginx-auth.conf.j2 ├── playbook.yml ├── inventory.yml ... ``` **CrĂ©e le fichier `templates/nginx-auth.conf.j2`** avec ce contenu : ```nginx server { listen 80; server_name defder.fr; # Redirection HTTP vers HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name defder.fr; # Certificats SSL (gĂ©nĂ©rĂ©s par Certbot) ssl_certificate /etc/letsencrypt/live/defder.fr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/defder.fr/privkey.pem; # Dossier racine du site root /var/www/html; index index.html; # AUTHENTIFICATION auth_basic "Zone protĂ©gĂ©e - Connexion requise"; auth_basic_user_file /etc/nginx/.htpasswd; location / { try_files $uri $uri/ =404; } } ``` **💡 Explication** : - Redirige automatiquement HTTP → HTTPS - Active l'authentification avec `auth_basic` - Pointe vers le fichier de mots de passe #### Étape 2.4 : DĂ©ployer la configuration **Ajoute cette tĂąche dans `playbook.yml`** : ```yaml - name: DĂ©ployer la configuration Nginx avec authentification template: src: templates/nginx-auth.conf.j2 dest: /etc/nginx/sites-available/defder notify: Recharger Nginx - name: Activer le site file: src: /etc/nginx/sites-available/defder dest: /etc/nginx/sites-enabled/defder state: link - name: DĂ©sactiver le site par dĂ©faut file: path: /etc/nginx/sites-enabled/default state: absent notify: Recharger Nginx ``` #### Étape 2.5 : Ajouter un handler pour recharger Nginx **À la fin de `playbook.yml`**, ajoute : ```yaml handlers: - name: Recharger Nginx systemd: name: nginx state: reloaded ``` **💡 Explication** : - Un handler = une action qui se dĂ©clenche quand un fichier change - Recharge Nginx quand la config est modifiĂ©e #### ✅ VĂ©rification Partie 2 Lance ton playbook : `./run.sh` Visite `https://defder.fr` → Une popup apparaĂźt ! - Login : `admin` - Password : `MonMotDePasse123` (ou celui que tu as choisi) --- ## 🎹 Partie 3 : DĂ©ployer des pages web personnalisĂ©es ### đŸ€” C'est quoi dĂ©ployer des pages ? Remplacer la page par dĂ©faut de Nginx par **ton propre site HTML**. ### 📝 Ce que tu dois faire : #### Étape 3.1 : CrĂ©er un dossier pour ton site **Dans ton projet, crĂ©e un dossier `files/`** : ``` iaac/ ├── files/ │ ├── index.html │ └── style.css ├── templates/ ├── playbook.yml ... ``` #### Étape 3.2 : CrĂ©er une page HTML **CrĂ©e `files/index.html`** : ```html Mon site dĂ©ployĂ© avec Ansible

🚀 Bienvenue sur mon serveur !

Ce site a été déployé automatiquement avec Ansible.

``` #### Étape 3.3 : CrĂ©er un fichier CSS **CrĂ©e `files/style.css`** : ```css * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; display: flex; justify-content: center; align-items: center; } .container { background: white; padding: 3rem; border-radius: 15px; box-shadow: 0 10px 40px rgba(0,0,0,0.3); max-width: 600px; text-align: center; } h1 { color: #667eea; margin-bottom: 1rem; font-size: 2.5rem; } p { color: #333; margin-bottom: 1rem; font-size: 1.1rem; } ul { list-style: none; margin: 2rem 0; } ul li { background: #f0f0f0; padding: 0.8rem; margin: 0.5rem 0; border-radius: 8px; font-size: 1rem; } .footer { margin-top: 2rem; font-style: italic; color: #667eea; } ``` #### Étape 3.4 : DĂ©ployer les fichiers sur le serveur **Ajoute ces tĂąches dans `playbook.yml`** (avant le handler) : ```yaml - name: CrĂ©er le dossier du site web file: path: /var/www/html state: directory owner: www-data group: www-data mode: '0755' - name: DĂ©ployer la page HTML template: src: files/index.html dest: /var/www/html/index.html owner: www-data group: www-data mode: '0644' - name: DĂ©ployer le fichier CSS copy: src: files/style.css dest: /var/www/html/style.css owner: www-data group: www-data mode: '0644' ``` **💡 Explication** : - `template:` pour index.html = permet d'utiliser des variables Ansible (comme la date) - `copy:` pour style.css = copie simple du fichier - `owner: www-data` = donne les bons droits Ă  Nginx #### ✅ VĂ©rification Partie 3 Lance ton playbook : `./run.sh` Visite `https://defder.fr` : - Entre login/password - Tu vois **ton site personnalisĂ©** ! 🎉 --- ## 🎓 RĂ©sumĂ© de ce que tu as appris | FonctionnalitĂ© | Module Ansible | UtilitĂ© | |---------------|----------------|---------| | **HTTPS** | `command` (certbot) | SĂ©curiser le site | | **Authentification** | `htpasswd` | ProtĂ©ger l'accĂšs | | **Configuration Nginx** | `template` | Personnaliser le serveur | | **DĂ©ploiement de fichiers** | `copy` / `template` | Mettre en ligne ton site | | **Handlers** | `handlers` | Recharger Nginx automatiquement | --- ## 🚀 Pour aller plus loin (Bonus) ### IdĂ©es d'amĂ©liorations : 1. **Plusieurs utilisateurs** : Ajoute plusieurs logins dans htpasswd 2. **Variables** : Mets le nom de domaine, email, etc. dans un fichier `vars.yml` 3. **RĂŽles Ansible** : Organise ton code en rĂŽles (nginx, ssl, web) 4. **CI/CD** : Automatise le dĂ©ploiement avec GitHub Actions 5. **Monitoring** : Ajoute un outil pour surveiller le serveur --- ## 📚 Ressources utiles - **Documentation Ansible** : https://docs.ansible.com - **Certbot** : https://certbot.eff.org - **Nginx** : https://nginx.org/en/docs/ --- ## ✅ Checklist finale - [ ] HTTPS fonctionne (cadenas vert) - [ ] Authentification demande login/password - [ ] Page personnalisĂ©e affichĂ©e - [ ] Certificat SSL se renouvelle automatiquement - [ ] Code versionnĂ© sur Git - [ ] Playbook s'exĂ©cute sans erreur **Bravo ! Tu as créé une infrastructure complĂšte et sĂ©curisĂ©e avec Ansible ! 🎉**