Vagrant | synced_folder でホストOSとゲストOSの任意のフォルダを同期する

# Vagrant | synced_folder でホストOSとゲストOSの任意のフォルダを同期する

## 概要

Vagrantでは *synced_folder* を利用することによって、  
ホスト・ゲスト間でファイルの同期が可能です。  

例えば、Vagrantで仮想環境を作成したが、  
開発に利用する **IDEやエディタは普段使い慣れたホストOSのものを利用したい** 、  
などといった場合に便利です。  

## 構文

下記の構文でホストとゲストの同期が可能です。  
`options` は0-n個の任意の数を指定可能です。  

~~~ruby
Vagrant.configure("2") do |config|
  # other config here

  config.vm.synced_folder "host_path", "guest_path", options...
end
~~~

## 有効化されるタイミング

`vagrant up` もしくは `vagrant reload` 時に同期が有効化されます

## owner / groupの変更

自動作成されるフォルダの owner / group を app ユーザーに変更する場合は以下。

Vagrantfile

~~~ruby
config.vm.synced_folder "host_path", "guest_path", owner: "app", group: "app"
~~~

## オプション

|option|type|内容|
|:--|:--|:--|
|create|boolean|host_pathが存在しなかった場合に作成するかどうか。デフォルトはfalse|
|disabled|boolean|同期を無効化するかどうか。デフォルトはfalse|
|group|string|synced_folderのgroup指定。デフォルトはSSHユーザー|
|mount_options|array|A list of additional mount options to pass to the mount command.|
|owner|string|synced_folderのowner指定。デフォルトはSSHユーザー|
|type|string|synced_folderの種類|

## サンプル

### 仕様

* ゲストOSは Ubuntu 12.04 LTS
* gitをinstall
* ホストOSのVagrantfileがあるフォルダの一階層上に、git_clonerディレクトリを作成
* ゲストOSの /home/vagrant/git_cloner を作成
* 双方のgit_clonerフォルダを synced_folder で同期する
* ゲストOSの git_cloner ディレクトリに下記のリポジトリを clone する

    https://github.com/tbpgr/git_cloner.git
    ※git_clonerは自作のRuby gemです

### サンプルコード

~~~ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

$script = <<SCRIPT
sudo apt-get update
sudo apt-get -y install git
cd /home/vagrant/
git clone https://github.com/tbpgr/git_cloner.git
SCRIPT

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise64"
  config.vm.box_url = 'http://files.vagrantup.com/'+config.vm.box+'.box'
  config.vm.synced_folder "../git_cloner", "/home/vagrant/git_cloner",
    create: true, owner: "vagrant", group: "vagrant"

  config.vm.provision "shell", inline: "echo 'start provision'"
  config.vm.provision "shell", inline: $script
  config.vm.provision "shell", inline: "echo 'finish provision'"
end
~~~

### VM起動後、同期フォルダの確認

vagrantでゲストOSを起動し、git_cloner ディレクトリが 
owner:vagrant, group vagrant で作成されていることを確認

~~~bash
$ %project_root%/sample
$ vagrant up
$ vagrant ssh

# ここからゲストOS
$ ls -l
drwxrwxrwx 1 vagrant vagrant 4096 Jun 20 12:55 git_cloner
-rwxr-xr-x 1 vagrant vagrant 6487 Sep 14  2012 postinstall.sh
~~~

git_cloner を clone できていることを確認。

~~~bash
$ cd git_cloner
$ ls
bin  Gemfile  git_cloner.gemspec  lib  LICENSE.txt  Rakefile  README.md  spec
~~~

ホストOSに戻り、 git_cloner ディレクトリが作成され、
git_clonerリポジトリの中身も同期できていることを確認する。

~~~bash
$ exit

# ここからホストOS
$ cd ../
$ ls
git_cloner/  sample/
$ cd git_cloner
$ ls
bin/     git_cloner.gemspec  LICENSE.txt  README.md
Gemfile  lib/                Rakefile     spec/
~~~

ホストOSの git_cloner に hoge.txt を追加してみます。

~~~bash
$ echo hoge > hoge.txt
~~~

再度ゲストOSにログインして、git_cloner ディレクトリに
hoge.txt が追加されたことを確認。

~~~bash
$ cd sample
$ vagrant ssh

# ここからゲストOS
$ cd git_cloner
$ ls
bin      git_cloner.gemspec  lib          Rakefile   spec
Gemfile  hoge.txt            LICENSE.txt  README.md
$ cat hoge.txt
hoge
~~~

以上で同期の設定を確認出来ました。

## 参考資料
Vagrant公式サイト  
https://docs.vagrantup.com/v2/synced-folders/basic_usage.html