Dans certains cas, je souhaite parfois copier un seul fichier de mon ordinateur hôte vers l'invité Vagrant.
Je ne veux pas le faire via les fournisseurs traditionnels (Puppet/Chef), car il s'agit souvent d'un travail ponctuel - je veux juste quelque chose à ajouter rapidement à mon fichier Vagrant.
Je ne veux pas partager un répertoire entier, peut-être parce que je veux écraser un fichier existant sans modifier un répertoire entier sur l'invité.
Il semble également un peu exagéré d'écrire un script d'approvisionnement du shell et de gérer les échappées potentielles, alors que tout ce que je veux faire est de copier un fichier.
Alors, quel est le moyen le plus simple de copier un seul fichier de l'hôte à l'invité?
Au lieu d'utiliser un approvisionneur Shell pour copier le fichier, vous pouvez également utiliser un Vagrant approvisionneur de fichiers .
Nom du fournisseur:
"file"
Le fournisseur de fichiers vous permet de télécharger un fichier de la machine hôte vers la machine invitée.
Vagrant.configure("2") do |config|
# ... other configuration
config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
Puisque vous demandez le moyen le plus simple, je suggère d'utiliser vagrant-scp . Il ajoute une commande scp à vagrant afin que vous puissiez copier des fichiers sur votre VM comme vous le feriez normalement avec scp.
Installer via:
vagrant plugin install vagrant-scp
Utilisez-le comme suit:
vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
Il existe en réalité une solution beaucoup plus simple. Voir https://Gist.github.com/colindean/5213685/#comment-882885 :
"Veuillez noter que, sauf si vous souhaitez spécifiquement scp pour une raison quelconque, le moyen le plus simple de transférer des fichiers de l'hôte vers VM consiste simplement à les placer dans le même répertoire que le fichier Vagrant - ce répertoire est automatiquement monté sous/vagrant. dans la VM pour que vous puissiez les copier ou les utiliser directement à partir de la VM. "
Par défaut, la première instance vide utilise le port ssh 2222 et son adresse ip est 127.0.0.1 (vous devrez peut-être ajuster le port avec un hôte virtuel réel).
==> default: Forwarding ports...
default: 22 (guest) => 2222 (Host) (adapter 1)
Vous pouvez donc exécuter la commande ci-dessous pour copier votre fichier local dans une instance vagabonde. le mot de passe est le même que le nom d'utilisateur, qui est vagrant
.
scp -P 2222 your_file [email protected]:.
Vous pouvez également copier le fichier sur votre hôte local.
scp -P 2222 [email protected]:/PATH/filename .
Voici mon approche du problème:
Étape 1 - Recherchez la clé privée, le port ssh et l'adresse IP:
root@vivi:/opt/boxes/jessie# vagrant ssh-config
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /root/.vagrant.d/insecure_private_key
IdentitiesOnly yes
LogLevel FATAL
Étape 2 - Transférer le fichier en utilisant le port et la clé privée comme paramètres pour scp:
scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
someFileName.txt [email protected]:~
J'espère que ça aide,
Ce que j'ai fini par faire est de garder le fichier dans mon répertoire vagrant (automatiquement monté en tant que/vagrant /) et de le copier avec un approvisionneur Shell:
command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :Shell, :inline => command
Si vous ne souhaitez pas que les fichiers se trouvent dans votre répertoire, vous pouvez exécuter ce code dans un fichier de script à partir de la machine hôte.
#!/bin/sh
OPTIONS=`vagrant ssh-config | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`
scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File
Dans cette configuration, il vous suffit de changer /File/To/Copy
pour le ou les fichiers que vous souhaitez copier, puis /Where/To/Put/File
correspond à l'emplacement sur la VM dans laquelle vous souhaitez copier les fichiers.
Si vous créez ce fichier et que vous l'appelez copyToServer.sh
, vous pouvez ensuite exécuter la commande sh
pour envoyer ces fichiers.
sh ./copyToServer.sh
Pour terminer, vous ne pouvez pas exécuter ce code en tant que provisioner
car il s’exécute sur le serveur invité alors que ce code s’exécute à partir de l’hôte.
Vagrant offre un moyen d'exécuter une commande sur ssh au lieu de se connecter. Par conséquent, pour l'hôte et l'invité Linux, vous pouvez utiliser:
cat ~/file_on_Host.txt | vagrant ssh -c 'cat - > ~/file_on_guest.txt'
vagrant ssh -c 'cat ~/file_on_guest.txt' > ~/file_on_Host.txt
Pas besoin de plugins ou de recharges d'invités. Assurez-vous simplement de fournir un identifiant de boîte à vagrant à 'vagrant ssh' si vous ne vous trouvez pas dans le même répertoire que Vagrantfile. Testé sur Vagrant v1.8.1.
Vous pouvez ajouter une entrée dans ~/.ssh/config
:
Host vagrant
User vagrant
HostName localhost
Port 2222
IdentityFile /home/user_name/.vagrant.d/insecure_private_key
et le simplescp file vagrant:/path/
. Vous pouvez trouver le chemin d'accès au fichier d'identité à l'aide de la commande vagrant ssh-config
.
si pour certaines raisons vous n'avez pas la permission d'utiliser
vagrant plugin install vagrant-scp
il existe un autre moyen:
Commencez par vagabonder yourVagrantProject, puis écrivez dans le terminal:
vagrant ssh-config
vous aurez des informations sur "HostName" et "Port" de votre machine virtuelle.
Dans certains cas, vous pouvez avoir des machines virtuelles dans votre projet. Il suffit donc de trouver votre machine principale (en général, ce VM a le port 2222), et ne faites pas attention aux informations des autres machines.
écrivez la commande pour faire la copie:
scp -P xxPortxx /Users/where/is/your/file.txt vagrant@xxHostNamexx:/home/vagrant
A ce raide, vous devrez mettre un mot de passe vagabond: Par défaut c'est "vagabond"
après cela, si vous regardez les fichiers de votre machine virtuelle:
vagrant ssh xxVirtualMachineNamexx
pwd
ls
vous aurez le "fichier.txt" dans le répertoire de votre machine virtuelle
vagrant upload localfile
qui mettra localfile dans le répertoire principal de l'utilisateur du vagabond
Allez dans le répertoire où vous avez votre Vagrantfile
Ensuite, éditez votre Vagrantfile
et ajoutez ce qui suit:
config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=774','fmode=775']
"." signifie le répertoire dans lequel vous vous trouvez actuellement sur votre machine hôte
"/ vagrant" fait référence à "/ home/vagrant" sur la machine invitée (machine vagabonde).
Copiez les fichiers que vous devez envoyer sur la machine invitée dans le dossier où se trouve votre Vagrantfile
Ouvrez ensuite Git Bash et cd
dans le répertoire où vous avez votre Vagrantfile
et tapez:
vagrant scp config.json XXXXXXX:/home/vagrant/
où XXXXXXX est votre nom vm . Vous pouvez obtenir votre nom de vm en lançant
vagrant global-status
vagrant scp plugin fonctionne si vous connaissez le nom de votre boîte de vagabond . vérifiez vagrant global-status qui fournira le nom de votre boîte pour pouvoir lancer:
vagrant global-status
id name provider state directory
------------------------------------------------------------------------
13e680d **default** virtualbox running /home/user
vagrant scp ~/foobar "nom dans mon cas, valeur par défaut":/home/"utilisateur" /
Si quelqu'un souhaite transférer un fichier de Windows Host vers vagrant, cette solution a fonctionné pour moi.
1. Make sure to install **winscp** on your windows system
2. run **vagrant up** command
3. run **vagrant ssh-config** command and note down below details
4. Enter Hostname, Port, Username: vagrant, Password: vagrant in winscp and select **SCP**, file protocol
5. In most cases, hostname: 127.0.0.1, port: 2222, username: vagrant, password: vagrant.
Vous devriez pouvoir voir des répertoires dans votre machine à vagabond.
Essayez ceci .. vagabond Ubuntu 14.04 Cela a fonctionné pour moi.
scp -r -P 2222 vagrant@localhost:/home .
Une autre façon de faire cela sans rien installer (vagrant-scp
etc.) Notez que le nom default
doit être utilisé tel quel, puisque vagrant ssh-config
émet cela.
vg_scp() {
tmpfile=$(mktemp /tmp/vagrant-ssh-config.XXXX)
vagrant ssh-config > $tmpfile
scp -F $tmpfile "$@"
rm $tmpfile
}
# Copy from local to remote
vg_scp somefile default:/tmp
# Copy from remote to local
vg_scp default:/tmp/somefile ./
# Copy a directory from remote to local
vg_scp -r default:/tmp ./tmp
La fonction ne serait pas nécessaire si scp -F =(vagrant ssh-config) ...
aurait fonctionné sur plusieurs obus. Mais comme cela n’est pas pris en charge par Bash, nous devons recourir à cette solution de contournement.
Cela peut être une amélioration pour de bonnes réponses ici
1) Oui installer vagrant-scp
vagrant plugin install vagrant-scp
2) [nom_mv] est facultatif
vagrant scp thisFileExamle.txt :/this/dirVagrant/dir/
3) pas besoin de -r en cas de dir
vagrant scp thisDir :/this/dirVagrant/dir/
4) cela fonctionne dans l'autre sens pour télécharger des fichiers de Vagrant
vagrant scp :/somefile.txt thisLocalDir