ホストマシンからVagrantゲストに単一のファイルをコピーしたいというユースケースがあります。
これは1回限りの作業であることが多いため、私は従来のプロビジョニングプログラム(Puppet/Chef)を介してそのようにしたくはありません。
ゲスト上のディレクトリ全体を無効にすることなく既存のファイルを上書きしたいため、ディレクトリ全体を共有したくないのです。
シェルプロビジョニングスクリプトを作成し、ファイルをコピーすることだけが必要な場合に潜在的なエスケープ処理を行うのはやややり過ぎです。
では、ホストからゲストに単一のファイルをコピーする最も簡単な方法は何ですか?
ファイルをコピーするためにシェルプロビジョニングツールを使用する代わりに、Vagrant ファイルプロビジョニングツール を使用することもできます。
プロビジョニング担当者名:
"file"
ファイルプロビジョニングツールを使用すると、ホストマシンからゲストマシンにファイルをアップロードできます。
Vagrant.configure("2") do |config|
# ... other configuration
config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
あなたが最も簡単な方法を尋ねるので、私は vagrant-scp を使うことを勧めます。 scpコマンドがvagrantに追加されているので、通常はscpで行うのと同じようにVMにファイルをコピーできます。
経由でインストールします。
vagrant plugin install vagrant-scp
そのようにそれを使ってください:
vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>
実際にはもっと単純な解決策があります。 https://Gist.github.com/colindean/5213685/#comment-882885 を参照してください。
「何らかの理由でscpが特に必要な場合を除き、ファイルをホストからVMに転送する最も簡単な方法は、ファイルをVagrantfileと同じディレクトリに配置することです。このディレクトリは自動的に次のディレクトリにマウントされます。/[vagrantをVMに追加すると、VMから直接コピーまたは使用できます。 "
デフォルトでは、最初のvagrantインスタンスはSSHポート2222を使用し、そのIPアドレスは127.0.0.1です(実際の仮想ホストでポートを調整する必要があるかもしれません)。
==> default: Forwarding ports...
default: 22 (guest) => 2222 (Host) (adapter 1)
そのため、下記のコマンドを実行してローカルファイルをvagrantインスタンスにコピーすることができます。 passwordはvagrant
であるusernameと同じです。
scp -P 2222 your_file [email protected]:.
ファイルをローカルホストにコピーして戻すこともできます。
scp -P 2222 [email protected]:/PATH/filename .
これが私の問題への取り組みです。
ステップ1 - 秘密鍵、SSHポート、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
ステップ2 - ポートと秘密鍵をscpのパラメータとして使用してファイルを転送します。
scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
someFileName.txt [email protected]:~
それが役立つことを願っています、
私がやってしまったのは私のvagrantディレクトリ(自動的に/ vagrant /としてマウントされている)の中にファイルを保存してシェルプロビジョニングツールでそれをコピーすることでした:
command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :Shell, :inline => command
ファイルを自分のディレクトリに置くことが制限されている場合は、ホストマシンのスクリプトファイルでこのコードを実行できます。
#!/bin/sh
OPTIONS=`vagrant ssh-config | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`
scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File
この設定では、/File/To/Copy
をコピーしたいファイルに変更するだけでよく、/Where/To/Put/File
はファイルをコピーしたいVM上の場所です。
このファイルを作成してcopyToServer.sh
と呼ぶと、sh
コマンドを実行してそれらのファイルをプッシュできます。
sh ./copyToServer.sh
最後の注意として、このコードをprovisioner
として実行することはできません。なぜなら、このコードはHostから実行されるのに対し、Guestサーバー上で実行されるからです。
Vagrantはログインする代わりにsshでコマンドを実行する方法を提供します。そのためLinuxホストとゲストのためにあなたは使用できます:
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
プラグインやゲストのリロードは不要です。 Vagrantfileと同じディレクトリにいない場合は、必ずvagrantボックスIDを 'vagrant ssh'に指定してください。 Vagrant v1.8.1でテスト済み。
~/.ssh/config
にエントリを追加することができます。
Host vagrant
User vagrant
HostName localhost
Port 2222
IdentityFile /home/user_name/.vagrant.d/insecure_private_key
そしてsimplescp file vagrant:/path/
。 vagrant ssh-config
コマンドを使用してIDファイルへのパスを見つけることができます。
vagrant upload localfile
それはvagrantユーザーのホームディレクトリにlocalfileを置きます
何らかの理由であなたが使用許可を得ていない場合
vagrant plugin install vagrant-scp
別の方法があります。
まず yourVagrantProject をvagrantしてから、ターミナルに書き込みます。
vagrant ssh-config
仮想マシンの "HostName"と "Port"に関する情報があります。
場合によっては、プロジェクトにいくつかの仮想マシンを含めることができます。ですから、あなたのマスターマシンを見つけて(一般に、このVMにはポート2222があります)、他のマシンの情報には注意を払わないでください。
コピーするためのコマンドを書く:
scp -P xxPortxx /Users/where/is/your/file.txt vagrant@xxHostNamexx:/home/vagrant
この急勾配であなたはvagrantパスワードを入れなければならないでしょう:デフォルトでそれは "vagrant"です
その後、仮想マシンのファイルを見てください。
vagrant ssh xxVirtualMachineNamexx
pwd
ls
仮想マシンのディレクトリに "file.txt"があります。
Vagrantfile
があるディレクトリに移動します
次に、あなたのVagrantfile
を編集して、以下を追加してください:
config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=774','fmode=775']
"."はあなたのホストマシン上の現在のディレクトリを意味します
"/ vagrant" は、ゲストマシン(Vagrantマシン)の "/ home/vagrant"を表します。
あなたがあなたのVagrantfile
を持っているディレクトリにあなたのcd
を持っているフォルダにゲストマシンに送る必要があるファイルをコピーしてくださいそしてそれから Git Bash そしてVagrantfile
をタイプしてください:
vagrant scp config.json XXXXXXX:/home/vagrant/
xXXXXXXはあなたの vm名です。あなたは、実行することによってあなたのvm名を得ることができます
vagrant global-status
あなたのvagrantボックス名を知っていればvagrant scpプラグインは動作します。あなたのボックス名を提供するvagrant global-statusをチェックしてください。
vagrant global-status
id name provider state directory
------------------------------------------------------------------------
13e680d **default** virtualbox running /home/user
vagrant scp〜/ foobar "私の場合のデフォルト":/ home/"user" /
誰かがWindowsホストからvagrantにファイルを転送したい場合は、この解決策は私のために働いた。
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.
あなたはあなたのvagrantマシンの中のディレクトリを見ることができるはずです。
何もインストールせずにこれを行う別の方法(vagrant-scp
など)vagrant ssh-config
はそれを生成するので、default
という名前をそのまま使用する必要があることに注意してください。
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
scp -F =(vagrant ssh-config) ...
が複数のシェルにまたがって機能している場合、この関数は必要ありません。しかし、これはBashではサポートされていないので、この回避策に頼らなければなりません。
これを試してみてください。vagrant ubuntu 14.04これは私のために働いた。
scp -r -P 2222 vagrant@localhost:/home .
これは良い答えをここで強化することができます
1)はいvagrant-scpをインストール
vagrant plugin install vagrant-scp
2)[vm_name]はオプションです
vagrant scp thisFileExamle.txt :/this/dirVagrant/dir/
3)dirの場合は-rは不要
vagrant scp thisDir :/this/dirVagrant/dir/
4)それはVagrantからファイルをダウンロードするための他の方法を働きます
vagrant scp :/somefile.txt thisLocalDir