You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

10 KiB

🎯 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) :

- 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 :

- 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 :

- 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 :

- 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 :

- 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 :

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 :

- 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 :

  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 :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mon site déployé avec Ansible</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <h1>🚀 Bienvenue sur mon serveur !</h1>
        <p>Ce site a été déployé automatiquement avec Ansible.</p>
        <ul>
            <li>✅ Serveur : Nginx</li>
            <li>✅ Sécurité : HTTPS activé</li>
            <li>✅ Protection : Authentification activée</li>
            <li>✅ Automatisation : 100% IaaC</li>
        </ul>
        <p class="footer">Déployé le {{ ansible_date_time.date }} 🎉</p>
    </div>
</body>
</html>

Étape 3.3 : Créer un fichier CSS

Crée files/style.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) :

- 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


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 ! 🎉