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.
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).
ansible/ avec ansible.cfg, un inventaire fonctionnel, et le test ansible all -m ping qui répond pong.web défini dans l'inventaire (les serveurs sur lesquels on va installer Apache).apt (installation de paquets)service (gestion des services)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
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.
ansible.cfgIl 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.
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
Inutile de continuer : réglez le problème SSH d'abord (voir le tuto d'intro, étape 6).
apache2Depuis 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ù.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.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).ansible web -m shell -a "systemctl is-active apache2"
# attendu : active
curl -I http://< votre IP >
# attendu : HTTP/1.1 200 OK + Server: Apache
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 ».ansible web -m ufw -a "rule=allow port=80" --become.ansible web -m apt -a "name=nginx state=absent" --become.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 :