Contactez-nous

Objectif : automatiser l'installation d'un serveur web, sa configuration et le déploiement d'une page d'accueil

Découvrez comment automatiser intégralement avec Ansible l'installation d'un serveur web (Nginx/Apache), sa configuration de base, et le déploiement d'une page d'accueil.

Définir la cible : un déploiement web entièrement automatisé

L'objectif de cet exercice est de réaliser un cycle complet d'automatisation pour mettre en place un service web fonctionnel. Cela signifie que nous ne voulons pas seulement installer un logiciel, mais orchestrer toutes les étapes nécessaires pour qu'un utilisateur puisse accéder à une page web via son navigateur. Ce processus comprend typiquement trois grandes phases que nous allons confier à Ansible :

  1. Installation du serveur web : Sélectionner et installer un logiciel serveur web (par exemple, Nginx ou Apache) sur un noeud géré.
  2. Configuration du serveur web : S'assurer que le serveur web est correctement configuré pour servir du contenu, qu'il est démarré et qu'il se lancera automatiquement au redémarrage du système.
  3. Déploiement du contenu : Copier une page d'accueil simple (un fichier HTML) vers l'emplacement approprié sur le serveur pour qu'elle soit accessible.

Atteindre cet objectif démontre la capacité d'Ansible à gérer non seulement des tâches unitaires mais aussi des flux de travail complets, transformant une machine "nue" en un serveur applicatif opérationnel. C'est un pas essentiel vers des pratiques comme l'Infrastructure as Code (IaC) et le déploiement continu.

L'automatisation de ce processus permet de gagner en rapidité, en fiabilité (en évitant les erreurs manuelles) et en reproductibilité. Que vous déployiez sur un seul serveur de test ou sur des dizaines de serveurs de production, le playbook Ansible garantit que le résultat sera identique à chaque fois.

Phase 1 : Installation automatisée du serveur web

La première étape de notre automatisation consiste à installer le logiciel serveur web. Ansible offre des modules spécifiques pour les gestionnaires de paquets les plus courants (apt pour Debian/Ubuntu, yum/dnf pour RHEL/CentOS/Fedora) ainsi qu'un module générique package. Le choix du module dépend de la spécificité que vous souhaitez et de la portabilité de votre playbook.

Dans un playbook Ansible, cette tâche ressemblerait à ceci pour Nginx sur un système Debian/Ubuntu :

- name: Installer Nginx
  ansible.builtin.apt:
    name: nginx
    state: present
    update_cache: yes # Bonne pratique pour s'assurer que la liste des paquets est à jour

L'option state: present assure que le paquet sera installé s'il ne l'est pas, et ne fera rien s'il est déjà présent (idempotence). update_cache: yes exécute l'équivalent d'un apt update avant l'installation.

Pour une approche plus portable, le module package peut être utilisé :

- name: Installer le serveur web (Nginx par exemple)
  ansible.builtin.package:
    name: nginx  # ou apache2 pour Apache sur Debian/Ubuntu, httpd sur CentOS
    state: present

Ansible tentera alors d'utiliser le gestionnaire de paquets approprié du système cible. Cette phase doit également inclure l'élévation de privilèges (become: true au niveau du jeu ou de la tâche) car l'installation de logiciels requiert des droits d'administration.

Phase 2 : Configuration et gestion du service web

Une fois le serveur web installé, il faut s'assurer qu'il est correctement configuré et qu'il fonctionne. Pour une configuration de base, cela implique au minimum de vérifier que le service est démarré et qu'il est configuré pour se lancer automatiquement au démarrage du système.

Ansible fournit le module service (ou le plus récent systemd si vous ciblez spécifiquement des systèmes utilisant systemd) pour gérer les services :

- name: S'assurer que le service Nginx est démarré et activé
  ansible.builtin.service:
    name: nginx # ou apache2/httpd selon le serveur web
    state: started
    enabled: yes
  • state: started : Garantit que le service est en cours d'exécution. S'il est arrêté, Ansible le démarrera.
  • enabled: yes : S'assure que le service est configuré pour démarrer automatiquement avec le système.

Pour des configurations plus avancées, cette phase pourrait inclure la modification des fichiers de configuration du serveur web. Ansible propose les modules copy, template (pour utiliser des modèles Jinja2 et injecter des variables), ou lineinfile et blockinfile pour des modifications ciblées de fichiers existants. Par exemple, on pourrait vouloir changer le port d'écoute par défaut ou configurer des hôtes virtuels. Pour notre objectif de déploiement d'une page simple, la configuration par défaut du serveur web est souvent suffisante.

Phase 3 : Déploiement de la page d'accueil

La dernière phase de notre automatisation est le déploiement du contenu réel, c'est-à-dire notre page d'accueil. Il s'agit typiquement de copier un fichier HTML depuis le noeud de contrôle Ansible vers le répertoire racine des documents (document root) du serveur web sur le noeud géré.

Le module copy est parfait pour cette tâche :

- name: Déployer la page d'accueil
  ansible.builtin.copy:
    src: files/index.html  # Chemin vers notre fichier HTML local (relatif au playbook)
    dest: /var/www/html/index.html # Chemin de destination sur le serveur
    owner: www-data              # Propriétaire du fichier (ex: pour Nginx/Apache sur Debian)
    group: www-data              # Groupe du fichier
    mode: '0644'                 # Permissions du fichier

Il est crucial de connaître le chemin du document root de votre serveur web (par exemple, /var/www/html/ pour Nginx/Apache sur Debian/Ubuntu, ou /usr/share/nginx/html/ pour Nginx sur CentOS). Les permissions et la propriété (owner, group) du fichier doivent également être correctes pour que le serveur web puisse lire et servir le fichier.

Souvent, une modification du contenu du site nécessite un redémarrage ou un rechargement de la configuration du serveur web pour qu'elle soit prise en compte. Ansible gère cela élégamment avec les "handlers". La tâche de copie peut notifier un handler qui se chargera de redémarrer le service Nginx uniquement si le fichier a été effectivement modifié :

# Dans la tâche de copy:
  notify:
    - Restart Web Server

# Dans la section handlers du playbook:
handlers:
  - name: Restart Web Server
    ansible.builtin.service:
      name: nginx # ou apache2/httpd
      state: restarted

En combinant ces trois phases dans un seul playbook Ansible, nous atteignons notre objectif d'automatiser complètement la mise en place d'un serveur web de base avec une page d'accueil. Ce playbook devient alors un outil puissant et fiable pour provisionner rapidement des environnements web.