
Dans ce tutoriel, nous allons voir deux méthodes pour échanger des fichiers entre une machine virtuelle gérée par Vagrant et son hôte.
Travailler avec Vagrant implique régulièrement d’échanger des fichiers entre votre machine hôte et les machines virtuelles gérées. Que ce soit pour déployer des scripts de configuration, synchroniser du code source, récupérer des logs, etc. Il faut savoir que des outils intégrés à Vagrant existent pour cela, les deux principaux sont :
L’utilisation du plugin vagrant-scp pour des transferts ponctuels en ligne de commande.
Les dossiers partagés (synced_folders) pour une synchronisation automatique et transparente.
Nous allons ici étudier les deux méthodes ainsi que l’intérêt de chacune. Les prérequis pour appliquer ce tutoriel sont les suivants :
Vagrant doit être installé et fonctionnel sur votre système ;
Une machine virtuelle Vagrant déjà créée et démarrée.
Utiliser vagrant-scp pour des transferts ponctuels
Installation du plugin
La commande vagrant scp est une commande simple qui copie des fichiers entre votre machine hôte et une VM Vagrant, sans configuration préalable au niveau des VM gérées. Cette commande est utilisable à l’aide d’un plugin. Le plugin vagrant-scp n’est pas inclus par défaut dans Vagrant. Pour l’installer, nous allons exécuter la commande suivante pour l’installer sur l’hôte Vagrant :
vagrant plugin install vagrant-scp
Nous pouvons ensuite vérifier que le plugin est bien installé avec :
$ vagrant plugin list
[…]
vagrant-scp (0.5.9, global)
Comme dans mon exemple, le plugin vagrant-scp doit apparaître dans la liste.
Syntaxe de base vagrant-scp
La commande pour transférer un fichier de l’hôte vers la VM Vagrant est aussi simple que l’utilisation de la commande scp classique sous Linux :
vagrant scp :
Il faut savoir que par défaut au déploiement d’une VM, Vagrant va générer une paire de clés lui permettant d’avoir un accès SSH au système en tant que l’utilisateur vagrant. C’est cette paire de clés qui est utilisée pour le transfert de fichiers via le plugin scp, mais aussi pour l’envoi de commande.
Cela signifie que par défaut, la commande vagrant scp utilise les droits de l’utilisateur vagrant, vous ne pourrez donc pas déposer vos fichiers n’importe où.
Voici un exemple avec un fichier situé dans le dossier courant au niveau de l’hôte :
$ vagrant scp ./mon_script.sh debian1:/home/vagrant/
Mon_script.sh 100% 13 52.4KB/s 00:00
Cette commande a copié le fichier mon_script.sh depuis mon répertoire courant vers /home/vagrant/ dans la VM debian1. On peut ensuite confirmer que le fichier est bien présent au sein de la VM :
$ vagrant ssh debian1 -c “pwd;ls -l”
/home/vagrant
total 8
-rw-r–r– 1 vagrant vagrant 445 Jun 30 20:02 index.html
-rw-r–r– 1 vagrant vagrant 13 Jul 1 20:19 mon_script.sh
Bien sûr, vous pouvez faire l’opération inverse et télécharger un fichier depuis votre VM vers votre hôte aussi facilement :
vagrant scp :
# Exemple
vagrant scp debian1:mon_script.sh ~/
# ou
vagrant scp debian1:/home/vagrant/mon_script.sh ~/
Attention, vagrant-scp ne gère pas nativement les dossiers. Pour contourner ce problème, nous pouvons compresser le dossier avant de le transférer, puis utiliser l’exécution de commande pour faire l’opération inverse. Exemple avec un dossier scripts/ :
# De l’hôte vers la VM
$ tar -czf scripts.tar.gz scripts/ | vagrant scp scripts.tar.gz debian1:/home/vagrant/
scripts.tar.gz 100% 193 386.9KB/s 00:00
$ vagrant ssh debian1 -c “tar zxvf scripts.tar.gz”
$ vagrant ssh debian1 -c “pwd;ls -l”
/home/vagrant
total 16
drwxr-xr-x 2 vagrant vagrant 4096 Jul 1 20:23 scripts
-rw-r–r– 1 vagrant vagrant 193 Jul 1 20:25 scripts.tar.gz
Bonnes pratiques, limites et erreurs courantes
Voici quelques bonnes pratiques pour éviter les erreurs et incompréhensions lors de l’utilisation de cette commande :
Utilisez des chemins absolus pour éviter les erreurs.
Vérifiez le nom de la VM avec vagrant status si vous avez plusieurs VMs.
Assurez-vous que l’utilisateur vagrant dans la VM possède les droits d’écriture sur le chemin de destination.
Aussi, il faut connaître les limites et particularités de la commande, qui peut parfois légèrement différer de la commande scp classique :
vagrant-scp ne gère pas les wildcards (*). Pour copier plusieurs fichiers, utilisez une boucle bash ou tar, comme nous l’avons vu ;
Aucune barre de progression n’est affichée pendant le transfert, l’affichage se fait à la fin du transfert ;
Les fichiers avec des espaces dans leur nom doivent être entourés de guillemets pour éviter d’altérer la commande.
Je vous présente ici quelques erreurs courantes que vous pourrez rencontrer, ainsi que les solutions probables :
ProblèmeSolutionCommand not found: vagrant-scpVérifiez l’installation, sur l’hôte, du plugin avec vagrant plugin list.machine with the name ‘[…]’ was not found configuredUtilisez vagrant status pour lister les VMs disponibles.Permission deniedVérifiez les droits sur le fichier ou le chemin dans la VM avec ls -l.No such file or directoryVérifiez que le chemin source existe (sur l’hôte ou la VM).The provider for this Vagrant-managed machine is reporting that itis not yet ready for SSH.Assurez-vous que la VM est démarrée avec vagrant up.
Passons à présent à une seconde méthode classique pour transférer des fichiers de l’hôte vers une VM gérée par vagrant.
Utiliser les dossiers partagés (synced_folders)
Les dossiers partagés permettent de synchroniser automatiquement un dossier entre votre machine hôte et la VM. Toute modification dans l’un est répercutée dans l’autre, c’est ce qui est habituellement utilisé avec une machine virtuelle “classique”.
Configuration dans le Vagrantfile
Pour activer un dossier partagé, nous allons modifier notre Vagrantfile avant de lancer la VM pour y ajouter la ligne suivante :
config.vm.synced_folder “”, “”
Dans mon exemple, ./dossier_local est le relatif ou absolu du dossier sur mon hôte et /dossier_vm est le chemin de ce même dossier (synchronisé) dans la VM. Exemple de fichier complet :
Vagrant.configure(“2”) do |config|
config.vm.define “debian1” do |debian1|
debian1.vm.box = “debian/bookworm64”
debian1.vm.hostname = “debian1”
debian1.vm.network “private_network”, ip: “192.168.56.101”
# Configuration du dossier partagé
debian1.vm.synced_folder “~/Documents/vagrant_share”, “/mnt/vagrant_share”
debian1.vm.provider “virtualbox” do |vb|
vb.memory = “1024”
vb.cpus = 1
end
end
end
Utilisation des dossiers partagés
Après avoir modifié le Vagrantfile, démarrez ou rechargez la VM pour appliquer les changements :
# Déployer l’environnement ou démarrer un environnement existant
vagrant up
# Recharger un environnement actif pour appliquer la modification
vagrant reload
Dans tous les cas, vous devriez voir dans les logs affichés dans le terminal une ligne telle que celle-ci :
==> debian1: Mounting shared folders…
debian1: /home/mickael/Documents/vagrant_share => /mnt/vargant_share
Ces deux dossiers sont à présent synchronisés, vous pourrez les utiliser comme un dossier d’échange de fichiers entre l’hôte et la machine virtuelle, ou même entre plusieurs machines virtuelles !
Transfert de fichier vie un répertoire partagé vagrant.
Il faut savoir que par défaut, Vagrant synchronise déjà le répertoire du Vagrantfile vers /vagrant dans la VM. Si vous n’en avez pas besoin, vous pouvez ajouter cette configuration dans votre Vagrantfile :
config.vm.synced_folder “.”, “/vagrant”, disabled: true
Vagrant supporte plusieurs mécanismes de synchronisation de fichiers. Le choix dépend de votre OS hôte et de vos besoins en performance. Les utilisateurs avancés peuvent opter pour des méthodes autres que les VirtualBox Shared Folders (par défaut), comme NFS, Rsync ou SMB.
Quelle méthode choisir ?
Nous venons de voir deux méthodes différentes pour effectuer un échange de fichiers entre une VM gérée via Vagrant et son hôte. Voici un petit récapitulatif de ces deux méthodes, ainsi que leurs avantages et limites :
Critèrevagrant-scpDossiers partagés (synced_folders)Type de transfertPonctuel (manuel)Continu (automatique)Facilité d’utilisationSimple pour les fichiers individuelsIdéal pour les dossiers et fichiers fréquentsPerformancesRapide pour les petits fichiersPeut-être lent pour les gros dossiers ou nombreux fichiers (surtout sous VirtualBox)SynchronisationUnidirectionnelle (selon la commande)Bidirectionnelle (selon la configuration)ConfigurationAucune (plugin à installer)Requiert une modification du VagrantCas d’usageTransferts occasionnelsDéveloppement, tests, configurations
En bref, vous pouvez utiliser vagrant-scp si vous avez besoin de transférer un ou quelques fichiers ponctuellement ou que vous préférez une solution simple et directe en ligne de commande ou si vous ne souhaitez pas modifier votre Vagrantfile.
Par contre, vous pouvez utiliser les dossiers partagés si vous travaillez avec des fichiers fréquemment modifiés (ex : code source, logs) et que vous voulez une synchronisation automatique sans intervention manuelle entre l’hôte et la VM ou même entre plusieurs VM.
Conclusion
Les deux méthodes présentées dans ce tutoriel offrent des solutions complémentaires pour transférer des fichiers entre votre machine hôte et une VM Vagrant.
vagrant-scp pour des transferts ponctuels et simples via la ligne de commande.
Les dossiers partagés pour une synchronisation automatique et transparente, surtout dans un contexte de développement ou de tests.
En fonction de vos besoins, vous pouvez choisir l’une ou l’autre méthode, ou même les combiner pour tirer parti de leurs avantages respectifs.
Co-fondateur d’IT-Connect.fr.
Auditeur/Pentester chez Orange Cyberdéfense.
