Linux

Ansible — Déployer Apache2

Automatiser l'installation et le démarrage d'Apache2 sur tous les serveurs web de l'inventaire grâce à un rôle Ansible réutilisable.

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

Installer Apache2 sur un ou plusieurs serveurs Debian/Ubuntu, automatiquement, en lançant une seule commande depuis votre PC. Pas besoin de se connecter à chaque serveur : Ansible le fait pour nous.

Résultat : votre propre page web servie sur le port 80 de chaque serveur, le service activé au démarrage, et tout ça répétable à l'identique (idempotent : rejouer le playbook ne casse rien).

⚠ Prérequis
  • Avoir suivi le tuto Ansible — Introduction : un dossier ansible/ avec ansible.cfg, un inventaire fonctionnel, et le test ansible all -m ping qui répond pong.
  • Au moins un groupe web défini dans l'inventaire (les serveurs sur lesquels on va installer Apache).
  • Aucun autre serveur web (Nginx, lighttpd…) ne tourne déjà sur le port 80 des cibles, sinon Apache refusera de démarrer.
📚 Documentation officielle

Structure du projet (rappel)

On reprend l'arborescence du tuto d'intro. La nouveauté, c'est qu'on ajoute un rôle apache2 et un playbook deploy_apache2.yml :

ansible/
├── ansible.cfg              ← déjà créé
├── inventories/
│   └── dev/inventory.yml    ← déjà créé
├── playbooks/
│   └── deploy_apache2.yml   ← à créer (étape 5)
└── roles/
    └── apache2/             ← à créer (étape 4)
        ├── defaults/main.yml
        ├── handlers/main.yml
        ├── files/index.html
        └── tasks/main.yml
ⓘ Pourquoi un rôle plutôt qu'un seul gros playbook ?

Pour pouvoir réutiliser le même code partout : si demain vous montez 5 autres serveurs web, vous appliquez le même rôle sans rien réécrire.

Vérifier votre ansible.cfg

Il doit déjà être en place depuis le tuto d'intro. Pour rappel, contenu minimal :

[defaults]
inventory         = inventories/
remote_user       = admin
private_key_file  = /root/.ssh/id_ed25519
host_key_checking = False
roles_path        = roles/

[privilege_escalation]
become        = true
become_method = sudo

Si vous êtes perdu, revenez à l'étape 4 du tuto d'intro.

Vérifier votre inventaire

Vous devez avoir un groupe web avec au moins un serveur. Exemple :

# inventories/dev/inventory.yml
all:
  children:
    web:
      hosts:
        dev-lab:
          ansible_host: < votre IP >

Test obligatoire avant d'aller plus loin — chaque serveur doit répondre pong :

ansible web -m ping
⚠ Si le ping échoue

Inutile de continuer : réglez le problème SSH d'abord (voir le tuto d'intro, étape 6).

Créer le rôle apache2

Depuis la racine du projet ansible/, créez l'arborescence du rôle (on ajoute le dossier files/ pour notre page perso) :

mkdir -p roles/apache2/{tasks,handlers,defaults,files}

4.1 — Votre page web perso. Créez le fichier roles/apache2/files/index.html avec le contenu que vous voulez servir. Exemple minimal :

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Mon serveur Apache</title>
</head>
<body>
  <h1>Déployé avec Ansible 🚀</h1>
  <p>Cette page a été poussée automatiquement par le rôle apache2.</p>
</body>
</html>

4.2 — Les tâches du rôle. Créez le fichier des tâches :

nano roles/apache2/tasks/main.yml

Et collez ces 4 tâches :

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

- name: install apache2
  apt:
    name: apache2
    state: present

- name: Copy html file
  ansible.builtin.copy:
    src: "index.html"
    dest: "/var/www/html/index.html"
    owner: www-data
    group: www-data
    mode: "0644"

- name: enable and start apache2
  ansible.builtin.systemd:
    name: "apache2"
    enabled: true
    state: started
    daemon_reload: true

Décryptage :

  • update_cache: yes — équivalent de apt update.
  • state: present — Ansible vérifie que le paquet est installé. Si oui, il ne fait rien.
  • ansible.builtin.copy — copie votre files/index.html vers /var/www/html/index.html sur la cible, avec le propriétaire www-data et les droits 0644. C'est ce qui remplace la page par défaut d'Apache par la vôtre.
  • ansible.builtin.systemd avec state: started + enabled: true — le service tourne maintenant et redémarrera au prochain boot. daemon_reload: true recharge systemd au cas où.

Créer le playbook

Le playbook établit le lien « quel rôle sur quels serveurs ». Créez le fichier :

nano playbooks/deploy_apache2.yml

Contenu — 4 lignes utiles seulement :

---
- name: Deploy Apache2 Web Server + perso html
  hosts: web
  become: true
  roles:
    - apache2

Décryptage :

  • hosts: web — on cible le groupe web de l'inventaire.
  • become: true — on passe en root (sudo) car installer un paquet nécessite des droits.
  • roles: - apache2 — on applique le rôle créé à l'étape 4.

Lancer le déploiement

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

# 1️⃣ Validation syntaxique (gratuit, ne touche à rien)
ansible-playbook playbooks/deploy_apache2.yml --syntax-check

# 2️⃣ « Dry-run » : simule sans rien modifier
ansible-playbook playbooks/deploy_apache2.yml --check

# 3️⃣ Déploiement réel
ansible-playbook playbooks/deploy_apache2.yml

Sortie attendue à la fin — le récapitulatif PLAY RECAP :

PLAY RECAP ******************************************
dev-lab : ok=5  changed=4  unreachable=0  failed=0
  • changed=4 au premier passage (les 4 tâches ont fait quelque chose).
  • changed=0 si vous le relancez (idempotence : rien à refaire).

Vérifier le résultat

  1. Vérifier le service à distance via Ansible :
    ansible web -m shell -a "systemctl is-active apache2"
    # attendu : active
  2. Tester la page depuis votre PC :
    curl -I http://< votre IP >
    # attendu : HTTP/1.1 200 OK  +  Server: Apache
  3. Ou simplement ouvrir http://< votre IP > dans votre navigateur → vous devez voir votre page perso (celle de files/index.html), et non plus la page « Apache2 Ubuntu Default Page ».
⚠ Aucune réponse ?
  • Pare-feu de la cible bloque le port 80 : ansible web -m ufw -a "rule=allow port=80" --become.
  • Port déjà utilisé par Nginx : ansible web -m apt -a "name=nginx state=absent" --become.
✓ Bravo, c'est fait !

Apache2 est installé, démarré et activé au boot sur tous les serveurs du groupe web. Le playbook est idempotent : relancez-le tant que vous voulez, il ne refera rien si tout est en place.

Pour aller plus loin :