RousselTMLEARNING

Article · Vagrant : de la découverte à l'expertise

Bonnes pratiques Vagrant

1. Principes #

Reproductible, jetable, versionné.

Les règles d'or #

Cycle de vie Vagrant
Un environnement qu'on ne peut pas détruire et recréer sereinement n'est pas reproductible.
  • Versionnez le Vagrantfile et les scripts de provisioning avec le code du projet.
  • Épinglez la version de la box (config.vm.box_version) pour que toute l'équipe ait le même socle.
  • Provisionnez de façon idempotente (Ansible, scripts rejouables) : vagrant provision doit pouvoir être relancé.
  • Ne stockez aucune donnée précieuse dans la VM : elle doit pouvoir être détruite à tout moment.

2. Un Vagrantfile propre #

Variables, boxes épinglées et ressources.

Exemple multi-machines #

# Vagrantfile
Vagrant.require_version ">= 2.4.0"

NODES = {
  "web" => { ip: "192.168.56.11", cpus: 1, memory: 1024 },
  "db"  => { ip: "192.168.56.12", cpus: 2, memory: 2048 },
}

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-24.04"
  config.vm.box_version = "202407.22.0"
  config.vm.box_check_update = false
  config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: [".git/", "node_modules/"]

  NODES.each do |name, cfg|
    config.vm.define name do |node|
      node.vm.hostname = "#{name}.lab"
      node.vm.network "private_network", ip: cfg[:ip]
      node.vm.provider "virtualbox" do |vb|
        vb.name = "lab-#{name}"
        vb.cpus = cfg[:cpus]
        vb.memory = cfg[:memory]
        vb.linked_clone = true            # démarrage plus rapide, moins d'espace disque
      end
    end
  end

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provision/site.yml"
    ansible.groups = { "webservers" => ["web"], "dbservers" => ["db"] }
  end
end

3. Commandes du quotidien #

Travailler efficacement.

Cycle de travail #

vagrant validate                               # vérifier le Vagrantfile
vagrant up --provider=virtualbox                # créer et démarrer
vagrant up web --no-provision                   # une seule machine, sans re-provisionner
vagrant status && vagrant global-status --prune
vagrant ssh web -c "systemctl status nginx"
vagrant provision web                           # rejouer le provisioning
vagrant reload --provision                      # redémarrer en réappliquant la config
vagrant snapshot save web avant-migration       # point de restauration
vagrant snapshot restore web avant-migration
vagrant halt / vagrant suspend / vagrant destroy -f
vagrant box list && vagrant box outdated && vagrant box prune
Bonne Pratique : Prenez un snapshot avant toute opération risquante : restaurer prend quelques secondes, bien moins que reconstruire.

Performance et alternatives #

  • Utilisez linked clones et des boxes légères (bento, generic).
  • Préférez rsync ou nfs à vboxsf pour les gros dossiers partagés.
  • Sur Linux, le provider libvirt (KVM) est plus performant que VirtualBox.
vagrant plugin list
vagrant plugin install vagrant-libvirt vagrant-hostmanager
VAGRANT_DEFAULT_PROVIDER=libvirt vagrant up
VAGRANT_LOG=debug vagrant up 2> vagrant.log          # diagnostic
Erreur Courante : Ne laissez pas des VM oubliées consommer de la RAM : vagrant global-status liste toutes les machines, quel que soit le dossier.

Schéma de référence et vérification rapide #

Visualiser le principe et le contrôler en ligne de commande.

Schéma de référence #

Architecture Vagrant
Le Vagrantfile est la seule source de vérité.
vagrant status
vagrant ssh-config web
vagrant box list

📄 Bonnes pratiques Vagrant : des environnements reproductibles et rapides →

Mon suivi

  • ⏱ Durée estimée : ≈ 9 min

Connectez-vous pour suivre votre progression et prendre des notes. Se connecter

✉️ Poser une question

Articles recommandés

Linux vs Unix : Le Guide Complet des Commandes et Distributions

Comprenez les différences entre Linux et Unix, explorez les distributions (serveur, desktop, ligh...

Ansible : l'inventaire (statique, dynamique, groupes et variables)

Comprendre et maîtriser l'inventaire Ansible : fichiers INI et YAML, groupes, variables d'hôte et...

Ansible : les commandes Ad-Hoc

Exécuter des actions immédiates sur un parc de serveurs avec ansible : modules ping, command, she...

Ansible : structurer son code avec les rôles

Créer, organiser et réutiliser des rôles Ansible : arborescence, defaults, tasks, handlers, templ...

Ansible : générer des fichiers dynamiques avec Jinja2 et les facts

Créer des fichiers de configuration dynamiques : templates Jinja2, variables, facts, filtres, bou...

Ansible : gérer la sécurité (Vault, SSH, privilèges et secrets)

Sécuriser Ansible : Ansible Vault, authentification SSH par clés, become et sudo, no_log, durciss...

Ansible : gérer son infrastructure avec des playbooks (Infrastructure as Code)

Écrire des playbooks de production : structure d'un projet, plays, handlers, tags, strategy seria...

Ansible : piloter ses automatisations avec une interface graphique (AWX, Semaphore, AAP)

Comparer et installer les interfaces graphiques d'Ansible : AWX, Ansible Automation Platform, Sem...

Ansible : aller plus loin (tests, qualité, CI/CD et performance)

Industrialiser Ansible : ansible-lint, yamllint, Molecule, intégration continue, collections, exe...