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 :
- ✅ HTTPS (sécuriser le site avec un certificat SSL)
- ✅ Authentification (protéger l'accès avec login/password)
- ✅ 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 principalpython3-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 fichierowner: 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 :
- Plusieurs utilisateurs : Ajoute plusieurs logins dans htpasswd
- Variables : Mets le nom de domaine, email, etc. dans un fichier
vars.yml - Rôles Ansible : Organise ton code en rôles (nginx, ssl, web)
- CI/CD : Automatise le déploiement avec GitHub Actions
- 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 ! 🎉