Linux

Ansible — Déployer Nginx

Installer et activer Nginx automatiquement sur tous les serveurs web de l'inventaire grâce à un rôle Ansible minimaliste.

← Retour aux tutoriels Linux
📚 Ce qu'on va faire

Installer Nginx (un serveur web léger et très rapide, alternative à Apache) sur tous vos serveurs en lançant une seule commande. Le rendu final : la page « Welcome to nginx » sur le port 80 de chaque serveur.

⚠ Prérequis
  • Avoir suivi le tuto Ansible — Introduction : ansible.cfg, inventaire avec un groupe web, et ansible web -m ping qui répond pong.
  • Aucun autre serveur web (Apache, Caddy…) ne doit déjà écouter sur le port 80 (étape 4 ci-dessous).
📚 Documentation officielle

Créer la structure du rôle nginx

Depuis la racine de votre projet ansible/ :

mkdir -p roles/nginx/{tasks,handlers,defaults,templates}

Vous obtenez :

roles/nginx/
├── defaults/      (variables par défaut)
├── handlers/      (actions déclenchées à la demande, ex. restart)
├── tasks/         (les tâches à exécuter — c'est ici qu'on écrit)
└── templates/     (fichiers de config dynamiques en .j2)
ⓘ Astuce

Pour créer un squelette complet automatiquement : ansible-galaxy init roles/nginx. Voir le tuto créer un rôle.

Écrire les tâches du rôle

Créez le fichier des tâches :

nano roles/nginx/tasks/main.yml

Et collez ces 3 tâches :

---
- name: apt update
  apt:
    update_cache: yes

- name: install nginx
  apt:
    name: nginx
    state: present

- name: enable and start nginx
  service:
    name: nginx
    state: started
    enabled: yes

Décryptage :

  • update_cache: yes — équivalent de apt update.
  • state: present — installe le paquet s'il manque, sinon ne fait rien.
  • enabled: yes — le service redémarrera automatiquement au prochain boot.

Écrire le playbook

Le playbook applique le rôle aux bons serveurs. Créez-le :

nano playbooks/deploy_nginx.yml

Contenu :

---
- name: Deploy Nginx Web Server
  hosts: web
  become: true

  roles:
    - nginx
  • hosts: web — cible le groupe web de l'inventaire.
  • become: true — exécute en root via sudo (installation de paquet oblige).

S'assurer que le port 80 est libre

Apache et Nginx écoutent par défaut sur le même port. Si Apache (ou un autre serveur web) tourne déjà, Nginx refusera de démarrer.

# Vérifier qui écoute sur le port 80 (sur tous les serveurs)
ansible web -m shell -a "ss -tlnp | grep ':80 ' || echo 'Port 80 libre'"

# Si Apache est installé, le supprimer :
ansible web -m apt -a "name=apache2 state=absent" --become
⚠ Piège classique

Si vous voyez apache2 dans la sortie, supprimez-le ou changez le port d'écoute d'Apache avant de continuer.

Lancer le déploiement

Depuis la racine du projet, trois étapes (de la plus prudente à la vraie exécution) :

# 1️⃣ Vérifier la syntaxe (gratuit)
ansible-playbook playbooks/deploy_nginx.yml --syntax-check

# 2️⃣ « Dry-run » : simule, ne modifie rien
ansible-playbook playbooks/deploy_nginx.yml --check

# 3️⃣ Déployer pour de vrai
ansible-playbook playbooks/deploy_nginx.yml

À la fin, vous devez voir PLAY RECAP avec failed=0 pour chaque serveur.

Vérifier le résultat

  1. Vérifier le service à distance :
    ansible web -m shell -a "systemctl is-active nginx"
    # attendu : active
  2. Tester depuis votre PC (remplaçez l'IP) :
    curl -I http://< votre IP >
    # attendu : HTTP/1.1 200 OK  +  Server: nginx
  3. Ou ouvrez http://< votre IP > dans votre navigateur → page « Welcome to nginx ».
✓ Bravo, Nginx tourne partout !

Le même rôle fonctionne pour 1 ou 1 000 serveurs, sans changer une ligne.

Pour aller plus loin :

  • Ajouter un fichier nginx.conf.j2 dans templates/ pour pousser votre propre config.
  • Ajouter un handler restart nginx dans handlers/main.yml, déclenché par notify: restart nginx après modification de la config.
  • Voir la structure complète d'un rôle.