⚙️ Provisioning — Vagrant & Ansible

Bloc 2 Module 2.4 BTS SIO SISR
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Administration Systèmes & Cloud
ModuleM2.4 — Virtualisation & Cloud
PrérequisVirtualisation (C2.4.1), Conteneurisation Docker (C2.4.2)

🎯 Objectifs

  • Créer des environnements virtuels reproductibles avec Vagrant
  • Automatiser le provisioning et la configuration avec Ansible
  • Écrire des Vagrantfiles et des playbooks Ansible
  • Combiner Vagrant et Ansible pour déployer des infrastructures complètes
  • Comprendre l'approche Infrastructure as Code (IaC)

📖 Vagrant — Environnements virtuels reproductibles

Qu'est-ce que Vagrant ?

Vagrant est un outil open source développé par HashiCorp qui permet de créer, configurer et gérer des machines virtuelles de manière automatisée et reproductible. Au lieu de configurer manuellement une VM dans VirtualBox ou VMware, on décrit l'environnement souhaité dans un fichier texte appelé Vagrantfile.

L'intérêt principal : chaque membre d'une équipe peut recréer exactement le même environnement en une seule commande (vagrant up). Fini les « ça marche sur ma machine » !

Architecture de Vagrant

  • Vagrantfile : fichier Ruby décrivant la configuration de la VM (OS, réseau, provisioning)
  • Providers : backends de virtualisation (VirtualBox, VMware, Hyper-V, libvirt)
  • Boxes : images de base pré-packagées (ex: ubuntu/jammy64, debian/bookworm64, generic/rocky9)
  • Provisioners : outils de configuration automatique (Shell, Ansible, Puppet, Chef)
  • Synced folders : dossiers partagés entre l'hôte et la VM

Commandes essentielles

# Initialiser un projet Vagrant
vagrant init ubuntu/jammy64

# Démarrer la VM (télécharge la box si nécessaire)
vagrant up

# Se connecter en SSH à la VM
vagrant ssh

# Arrêter la VM (sans la supprimer)
vagrant halt

# Redémarrer la VM
vagrant reload

# Relancer uniquement le provisioning
vagrant provision

# Supprimer complètement la VM
vagrant destroy -f

# Voir l'état de toutes les VMs
vagrant status
vagrant global-status

Exemple de Vagrantfile

Vagrant.configure("2") do |config|
  # Image de base
  config.vm.box = "ubuntu/jammy64"
  config.vm.hostname = "srv-web"

  # Réseau : IP privée sur un réseau host-only
  config.vm.network "private_network", ip: "192.168.56.10"

  # Port forwarding : accès au port 80 de la VM via le port 8080 de l'hôte
  config.vm.network "forwarded_port", guest: 80, host: 8080

  # Dossier partagé
  config.vm.synced_folder "./site", "/var/www/html"

  # Ressources de la VM
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 2048
    vb.cpus = 2
    vb.name = "srv-web-ubuntu"
  end

  # Provisioning avec un script Shell
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y nginx
    systemctl enable nginx
    systemctl start nginx
  SHELL
end

Vagrantfile multi-machines

Vagrant permet de décrire plusieurs VMs dans un même fichier, idéal pour simuler une infrastructure complète :

Vagrant.configure("2") do |config|

  # Serveur Web
  config.vm.define "web" do |web|
    web.vm.box = "ubuntu/jammy64"
    web.vm.hostname = "srv-web"
    web.vm.network "private_network", ip: "192.168.56.10"
    web.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
    end
  end

  # Serveur Base de données
  config.vm.define "db" do |db|
    db.vm.box = "ubuntu/jammy64"
    db.vm.hostname = "srv-db"
    db.vm.network "private_network", ip: "192.168.56.11"
    db.vm.provider "virtualbox" do |vb|
      vb.memory = 2048
      vb.cpus = 2
    end
  end

  # Serveur de supervision
  config.vm.define "monitor" do |mon|
    mon.vm.box = "ubuntu/jammy64"
    mon.vm.hostname = "srv-monitor"
    mon.vm.network "private_network", ip: "192.168.56.12"
    mon.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
    end
  end

end
💡 Astuce

Utilisez vagrant up web pour ne démarrer qu'une seule VM du Vagrantfile multi-machines, ou vagrant ssh db pour vous connecter directement à la VM db.

Boxes Vagrant

Les boxes sont des images de base téléchargées depuis le Vagrant Cloud. Quelques boxes populaires :

BoxOSUsage
ubuntu/jammy64Ubuntu 22.04 LTSServeurs web, développement
debian/bookworm64Debian 12Serveurs stables, minimalistes
generic/rocky9Rocky Linux 9Alternative à CentOS / RHEL
gusztavvargadr/windows-server-2022-standardWindows Server 2022Active Directory, services Windows

📖 Ansible — Automatisation et gestion de configuration

Qu'est-ce qu'Ansible ?

Ansible est un outil d'automatisation IT open source développé par Red Hat. Il permet de configurer des serveurs, déployer des applications et orchestrer des tâches de manière déclarative. Sa particularité : il est agentless (sans agent) — il se connecte aux machines cibles via SSH (Linux) ou WinRM (Windows) sans rien installer dessus.

Concepts fondamentaux

  • Inventaire (inventory) : liste des machines cibles, organisées en groupes
  • Playbook : fichier YAML décrivant les tâches à exécuter sur les cibles
  • Rôle : ensemble structuré de tâches, variables, templates et handlers réutilisable
  • Module : unité de travail (ex: apt, copy, service, user, template)
  • Task : une action unitaire utilisant un module
  • Handler : tâche déclenchée conditionnellement (ex: redémarrer un service après une modification)
  • Facts : variables automatiquement collectées sur les hôtes (OS, IP, RAM...)

Fichier d'inventaire

# inventory.ini
[webservers]
srv-web ansible_host=192.168.56.10

[dbservers]
srv-db ansible_host=192.168.56.11

[monitoring]
srv-monitor ansible_host=192.168.56.12

[all:vars]
ansible_user=vagrant
ansible_ssh_private_key_file=.vagrant/machines/web/virtualbox/private_key

Premier playbook

# playbook.yml
---
- name: Installer et configurer Nginx
  hosts: webservers
  become: yes   # exécuter en root (sudo)

  tasks:
    - name: Mettre à jour le cache apt
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Installer Nginx
      apt:
        name: nginx
        state: present

    - name: Copier la page d'accueil
      copy:
        src: files/index.html
        dest: /var/www/html/index.html
        owner: www-data
        group: www-data
        mode: '0644'
      notify: Redémarrer Nginx

    - name: S'assurer que Nginx est démarré et activé
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Redémarrer Nginx
      service:
        name: nginx
        state: restarted

Commandes Ansible

# Tester la connexion à tous les hôtes
ansible all -i inventory.ini -m ping

# Exécuter une commande ad-hoc sur les serveurs web
ansible webservers -i inventory.ini -m shell -a "df -h"

# Lancer un playbook
ansible-playbook -i inventory.ini playbook.yml

# Lancer un playbook en mode check (simulation, sans modification)
ansible-playbook -i inventory.ini playbook.yml --check

# Lancer un playbook avec verbosité
ansible-playbook -i inventory.ini playbook.yml -vvv

# Lister les facts d'un hôte
ansible srv-web -i inventory.ini -m setup

Modules Ansible les plus utilisés

ModuleDescriptionExemple
apt / yumGérer les paquetsapt: name=nginx state=present
serviceGérer les services systemdservice: name=nginx state=started
copyCopier un fichier vers la ciblecopy: src=file.conf dest=/etc/
templateCopier un fichier Jinja2 avec variablestemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
userGérer les utilisateursuser: name=deploy state=present
fileGérer fichiers/répertoiresfile: path=/data state=directory mode=0755
lineinfileModifier une ligne dans un fichierlineinfile: path=/etc/hosts line="..."
command / shellExécuter une commandeshell: "ufw allow 80/tcp"
firewalld / ufwGérer le firewallufw: rule=allow port=443
docker_containerGérer des conteneurs Dockerdocker_container: name=web image=nginx

Variables et templates Jinja2

Ansible utilise le moteur de templates Jinja2 pour générer dynamiquement des fichiers de configuration :

# vars/main.yml
---
server_name: "cours.iris.a3n.fr"
http_port: 80
max_connections: 1024
# templates/nginx.conf.j2
server {
    listen {{ http_port }};
    server_name {{ server_name }};

    worker_connections {{ max_connections }};

    location / {
        root /var/www/html;
        index index.html;
    }
}

Structure d'un rôle Ansible

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml        # Tâches principales
    ├── handlers/
    │   └── main.yml        # Handlers (redémarrages...)
    ├── templates/
    │   └── nginx.conf.j2   # Templates Jinja2
    ├── files/
    │   └── index.html      # Fichiers statiques
    ├── vars/
    │   └── main.yml        # Variables du rôle
    ├── defaults/
    │   └── main.yml        # Variables par défaut (surchargeables)
    └── meta/
        └── main.yml        # Métadonnées et dépendances

Un playbook utilisant des rôles :

# site.yml
---
- name: Configurer les serveurs web
  hosts: webservers
  become: yes
  roles:
    - webserver

- name: Configurer les bases de données
  hosts: dbservers
  become: yes
  roles:
    - mysql

📖 Combiner Vagrant et Ansible

Le duo parfait

La combinaison Vagrant + Ansible est un workflow très puissant pour le BTS SIO SISR :

  • Vagrant crée les VMs (l'infrastructure)
  • Ansible configure les VMs (le provisioning)

On obtient ainsi une infrastructure complète reproductible en une seule commande : vagrant up crée les VMs puis lance automatiquement les playbooks Ansible.

Vagrantfile avec provisioning Ansible

Vagrant.configure("2") do |config|

  config.vm.define "web" do |web|
    web.vm.box = "ubuntu/jammy64"
    web.vm.hostname = "srv-web"
    web.vm.network "private_network", ip: "192.168.56.10"
    web.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
    end
  end

  config.vm.define "db" do |db|
    db.vm.box = "ubuntu/jammy64"
    db.vm.hostname = "srv-db"
    db.vm.network "private_network", ip: "192.168.56.11"
    db.vm.provider "virtualbox" do |vb|
      vb.memory = 2048
    end
  end

  # Provisioning Ansible (lancé après la dernière VM)
  config.vm.define "db" do |db|
    db.vm.provision "ansible" do |ansible|
      ansible.playbook = "site.yml"
      ansible.inventory_path = "inventory.ini"
      ansible.limit = "all"
    end
  end

end
💡 Conseil BTS SIO

Vagrant + Ansible est le combo idéal pour vos TP et projets. Vous pouvez versionner votre Vagrantfile et vos playbooks dans Git, et tout le monde peut recréer l'environnement identique. C'est une compétence très recherchée en entreprise pour les profils SISR.

📖 Comparaison des outils de provisioning

CritèreVagrantAnsibleDocker Compose
TypeGestion de VMsGestion de configurationOrchestration de conteneurs
CibleMachines virtuellesServeurs (physiques, VMs, cloud)Conteneurs Docker
AgentNécessite un provider (VirtualBox...)Agentless (SSH)Nécessite Docker Engine
LangageRuby (Vagrantfile)YAML (playbooks)YAML (docker-compose.yml)
IdempotenceOui (crée si absent)Oui (natif)Oui
Usage idéalEnvironnements de dev/TPConfiguration de serveurs en productionDéploiement d'applications conteneurisées
IsolationComplète (VM)Aucune (configure l'existant)Conteneur (processus isolé)

📖 Infrastructure as Code (IaC)

Vagrant et Ansible s'inscrivent dans la philosophie Infrastructure as Code : l'infrastructure est décrite dans des fichiers texte versionnés, ce qui apporte :

  • Reproductibilité : même résultat à chaque exécution
  • Traçabilité : historique des modifications via Git
  • Collaboration : les fichiers sont partagés et revus en équipe
  • Automatisation : déploiement en une commande
  • Documentation vivante : le code décrit l'infrastructure réelle
⚠️ Attention

Ne stockez jamais de mots de passe ou de clés privées en clair dans vos fichiers IaC. Utilisez ansible-vault pour chiffrer les secrets : ansible-vault encrypt vars/secrets.yml

📝 QCM — Testez vos connaissances

  1. Qu'est-ce que Vagrant ?
  2. Quel fichier configure un environnement Vagrant ?
  3. Qu'est-ce qu'un playbook Ansible ?
  4. Ansible nécessite-t-il un agent sur les machines cibles ?
  5. Quelle commande lance un environnement Vagrant ?
  6. Qu'est-ce qu'un rôle Ansible ?
  7. Quel est l'avantage de combiner Vagrant et Ansible ?
📝 Afficher les corrections
  1. Un outil de gestion d'environnements de développement virtualisés — Vagrant automatise la création et configuration de machines virtuelles via un Vagrantfile.
  2. Le Vagrantfile — Le Vagrantfile est un script Ruby décrivant les VM, leurs ressources et leur provisioning.
  3. Un fichier YAML décrivant les tâches d'automatisation — Le playbook définit les hôtes cibles et les tâches à exécuter dans l'ordre.
  4. Non, il est agentless — Ansible se connecte via SSH (Linux) ou WinRM (Windows) sans agent installé sur les cibles.
  5. vagrant up — vagrant up crée et démarre les VM définies dans le Vagrantfile.
  6. Un ensemble réutilisable de tâches organisées — Les rôles structurent le code Ansible en tasks, handlers, templates, files et defaults.
  7. Vagrant crée les VM, Ansible les configure automatiquement — Vagrant provisionne les VM avec Ansible pour obtenir un environnement reproductible en une commande.
💡 À retenir

Vagrant permet de créer des VMs reproductibles en une commande. Ansible automatise la configuration des serveurs de manière agentless via SSH. Ensemble, ils forment un workflow IaC complet : Vagrant crée l'infrastructure, Ansible la configure. Ces outils sont essentiels pour le technicien SISR en entreprise.

← Cours précédent Cours suivant →