てくてくテック☆

千里の道も一歩から。テック(Tech)の道をてくてく歩く。

Vagrant の Rsync Synced Folders を設定して、ホスト側とゲスト側のディレクトリを同期する

以下の「Vagrant と VirtualBox で自由に汚せるローカル環境を構築する」と「Vagrant と VirtualBox 作ったローカル環境に Ruby をインストールする」の続きです。

teku2tech.hateblo.jp

teku2tech.hateblo.jp   

Vagrant では Vagrantfile のあるディレクトリと Vagrant 上の /vagrant が同期されています。
Vagrant 上で触りたいファイルなどがあったら、Vagrantfile のあるディレクトリにコピー(または、移動)しておく必要があるのですが、Vagrantfile のあるディクレトリ以外で作業していた場合、ファイルに手を加えるたびにこれをやるのは結構めんどくさい!
(もちろん、コピーや移動しなくても、Vagrantfile と同じディレクトリで作業したり、最初から Vagrant 上で作業するという方法もありますが。。)

なので、VagrantRsync Synced Folders を使って、ホスト(MacWindows などのローカル)上の特定のディレクトリに変更があったら、自動でゲスト(Vagrant)上のディレクトリに同期されるようにしたいと思います。
 

VagrantFile の設定

VagrantFile で config.vm.synced_folder がコメントアウトされている箇所があるので、以下のとおり、設定を追加します。

Vagrant.configure("2") do |config|
  config.vm.synced_folder "~/vagrant", "/home/vagrant",
    type: "rsync",
    rsync__exclude: [".git/"]
end

config.vm.synced_folder の後に "ホスト側のパス"、"ゲスト側のパス" の順、type に "rsync" を指定すれば、ディレクトリの同期ができます。
上記の設定例だと、Mac 上の ~/vagrant に変更が入ったら、Vagrant 上の /home/vagrant に同期しますよ、という意味になります)

rsync__exclude はオプションなので、指定してもしなくてもどちらでも OK!
設定したい場合は以下を参考にしつつ、お好みでどうぞー。
(ちなみに rsync__exclude は同期の対象外にしたいものを指定できるオプションです。上記の設定例だと、~/vagrant/.git/ 内は /home/vagrant に同期されなくなります)

オプションに詳細についてはこちら↓

ディレクトリの同期

vagrant up すると、そのタイミングでホスト側とゲスト側のディレクトリが同期されます。

$ vagrant up

この後、同期しようとするたびに毎回 vagrant up するのは大変なので、ホスト側のディレクトリに変更が入ったら、自動でゲスト側のディレクトリにも同期するために、続けて以下のコマンドを実行します。

$ vagrant rsync-auto

 

たったこれだけでホスト上のファイルに何か変更が入るたびにゲスト上にも反映されるので、とっても便利ー!
 

参考

ちなみに、設定を行うにあたり、以下を参考にさせていただきました。
 

2017/12/19 追記:

type に rsync を指定した場合、ホストからゲストの一方向しか同期されないことが判明。。
ホスト側でしか作業しない(ホスト側を正としたい)場合はこれでもいいですが、ゲスト側で行った変更をホスト側にも反映したい(双方向で同期したい)場合は、Vagrantfile を以下のようにします。

Vagrant.configure("2") do |config|
  config.vm.synced_folder "~/vagrant", "/home/vagrant"
end

こうすると、vagrant rsync-auto しなくても自動でホスト側とゲスト側が双方向同期に!