Le moyen le plus simple de copier un seul fichier de l'hôte à L'invité Vagabond?
J'ai un cas d'utilisation où je veux parfois copier un seul fichier de ma machine hôte vers L'invité Vagabond.
Je ne veux pas le faire via des provisioners traditionnels (Puppet / Chef) parce que c'est souvent un one-off-Je veux juste quelque chose de rapide à ajouter à mon Vagrantfile.
Je ne veux pas partager un répertoire entier, peut-être parce que je veux écraser un fichier existant sans Nuker un répertoire entier sur l'invité.
Il semble aussi un peu exagéré d'écrire un shell provisioning script, et traiter les échappements potentiels, quand tout ce que je veux faire est de copier un fichier.
Alors, quel est le moyen le plus simple de copier un seul fichier d'hôte en invité?
15 réponses
Au Lieu d'utiliser un shell provisioner de copier le fichier, vous pouvez également utiliser un Vagabond fichier provisioner.
Nom du fournisseur:
"file"
Le provisionneur 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, de sorte que vous pouvez copier des fichiers sur votre machine virtuelle comme vous le feriez normalement avec scp.
Installer via:
vagrant plugin install vagrant-scp
Utilisez-le comme ceci:
vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
Il existe en fait une solution beaucoup plus simple. Voir https://gist.github.com/colindean/5213685/#comment-882885:
" veuillez noter qu'à moins que vous ne souhaitiez spécifiquement scp pour une raison quelconque, le moyen le plus simple de transférer des fichiers de l'hôte vers la machine virtuelle est de les placer dans le même répertoire que le fichier Vagrant - ce répertoire est automatiquement monté sous /vagrant dans la machine virtuelle afin que vous puissiez les copier ou les utiliser directement"
Par défaut, la première instance vagrant utilise le port SSH comme 2222, et son adresse ip est 127.0.0.1 (vous devrez peut-être ajuster le port avec l'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 vagrant. le mot de passe est le même que le nom d'utilisateur qui est vagrant
.
scp -P 2222 your_file vagrant@127.0.0.1:.
Vous pouvez également copier le fichier sur votre hôte local.
scp -P 2222 vagrant@127.0.0.1:/PATH/filename .
Voici mon approche du problème:
Étape 1-Trouvez la clé privée, le port ssh et L'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 vagrant@127.0.0.1:~
J'espère que ça aide,
Ce que j'ai fini par faire était de garder le fichier dans mon répertoire vagrant (automatiquement monté comme / vagrant/) et de le copier avec un provisionneur shell:
command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command
Si vous êtes empêché d'avoir les fichiers 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 modifier /File/To/Copy
pour le ou les fichiers que vous souhaitez copier, puis /Where/To/Put/File
est l'emplacement sur la machine virtuelle que vous souhaitez avoir les fichiers copiés.
Si vous créez ce fichier et l'appelez copyToServer.sh
, Vous pouvez alors exécuter la commande sh
pour pousser ces fichiers.
sh ./copyToServer.sh
Comme note finale, vous ne pouvez pas exécuter ce code provisioner
parce que cela fonctionne sur le serveur invité, alors que ce code s'exécute à partir de L'hôte.
, 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 lescp file vagrant:/path/
. Vous pouvez trouver le chemin d'accès au fichier d'identité en utilisant la commande vagrant ssh-config
.
Vagrant fournit un moyen d'exécuter une commande sur ssh au lieu de se connecter, donc Pour Linux host et guest, vous pouvez utiliser:
- de l'hôte à l'invité:
cat ~/file_on_host.txt | vagrant ssh -c 'cat - > ~/file_on_guest.txt'
- de l'invité à l'hôte:
vagrant ssh -c 'cat ~/file_on_guest.txt' > ~/file_on_host.txt
Pas besoin de plugins ou de rechargements invités. Assurez-vous simplement de fournir vagrant box ID à 'vagrant ssh' si vous n'êtes pas dans le même répertoire que le Vagrantfile. Testé sur Vagrant v1. 8. 1.
Si pour certaines raisons vous n'avez pas la permission d'utiliser
vagrant plugin install vagrant-scp
Il y a une autre façon:
D'abord vagrant up 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 pourriez avoir des machines virtuelles dans votre projet. Il suffit donc de trouver votre machine maîtresse (en général, cette machine virtuelle a le port 2222), et ne faites pas attention aux autres machines information.
Écrivez la commande pour faire la copie:
scp -P xxPortxx /Users/where/is/your/file.txt vagrant@xxHostNamexx:/home/vagrant
À cette pente, vous devrez mettre un mot de passe Vagabond : par défaut c'est "erratique"
Après cela, si vous regardez les fichiers dans votre machine virtuelle:
vagrant ssh xxVirtualMachineNamexx
pwd
ls
Vous aurez le fichier".txt " dans le répertoire de votre machine virtuelle
Allez dans le répertoire où vous avez votre Vagrantfile
Ensuite, modifiez 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é (Machine Vagrant).
Copiez les fichiers que vous devez envoyer à la machine invitée dans le dossier où vous avez votre Vagrantfile
Ensuite, ouvrez Git Bash et cd
dans le répertoire où vous avez votre Vagrantfile
et type:
vagrant scp config.json XXXXXXX:/home/vagrant/
Où XXXXXXX est votre nom vm . Vous pouvez obtenir votre nom de machine virtuelle en exécutant
vagrant global-status
Le plugin Vagrant scp fonctionne si vous connaissez le nom de votre boîte vagrant. Vérifiez vagrant global-status qui fournira votre nom de boîte, puis vous pouvez exécuter:
vagrant global-status
id name provider state directory
------------------------------------------------------------------------
13e680d **default** virtualbox running /home/user
Vagrant scp ~/foobar "nom dans mon cas par défaut":/home/"user"/
Essayez ceci.. vagrant ubuntu 14.04 Cela a fonctionné pour moi.
scp -r -P 2222 vagrant@localhost:/home .
Une autre façon de le faire sans installer quoi que ce soit (vagrant-scp
etc.) Notez que le nom default
doit être utilisé tel quel, puisque vagrant ssh-config
l'émet.
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é à travers les shells. Mais comme cela n'est pas pris en charge par Bash, nous devons recourir à cette solution de contournement.
La meilleure façon de copier le fichier de local à vagrant, pas besoin d'écrire du code ou quelque chose ou des changements de configuration. 1-D'abord le vagabond (Vagabond vers le haut ) 2-Ouvrir cygwin 3-cygwin: allez dans votre dossier où est vagrantfile ou d'où vous lancez le vagrant 4- SSH vagrant 5-Maintenant, cela fonctionnera comme un système normal.