Vagrantで、仮想環境を配布するようなシチュエーションのお話

# やりたいこと

- 複数人で開発環境を共有したり、PHPなどのバージョンが異なるケースについて試験したい。
- 上記のようなことができるサーバを、社内ローカルに用意したい。
- さらに、開発チームのメンバー向けに「標準環境」として必要に応じて配布したい。

# というわけで・・・

- Vagrantを使って、boxとして仮想サーバを配布したい。
- 手元のPCで仮想サーバを構築した。
- それをローカル内の共有サーバに配置し、メンバー内で共有したい。
- ついでに言えば、開発チームのメンバーで必要に応じて仮想環境を共有させたい。（これ使ってね的に）

# 前提条件

- 配布する仮想環境を開発しているマシンを「配布元」、その仮想環境をインポートして同じ環境を使うマシンを「配布先」とします。
- 配布元にも配布先にも、Vagrantがインストールされていて使用できる状態です。
- 私は、配布元、配布先ともに、仮想マシンを動かすツールとしてViatualboxを使っています。
- 配布する仮想マシンのOSは CentOS6.7 (bento)です。

# 実現手順

1. （配布元）配布したい仮想サーバをboxとしてエクスポートする
2. （配布先）boxをインポートし、仮想サーバを作成する
3. （配布先）Vagrantfileなどを修正する

# （配布元）配布したい仮想サーバをboxとしてエクスポートする

配布元のVagrantfileが存在するディレクトリで（を参照して）、`vagrant package` を実施する。

参考：Vagrant日本語ドキュメント

http://raqda.com/vagrant/cli/package.html

```bash:配布元のコマンドライン
$ vagrant package --output demo_cent67.box
```

上記のパターンでは、`demo_cent67.box` というファイル名で出力されます。

# （配布先）boxをインポートし、仮想サーバを作成する

配布先にも、VagrantやVirtualboxなどの環境が整っているとします。


```bash:配布先のコマンドライン
$ vagrant box add lamp_bento demo_cent67.box
```

上記のパターンでは box一覧に、lamp_bentoと言う名前で登録します。

## box一覧への追加を確認

```bash:配布先のコマンドライン
$ vagrant box list
bento/centos-6.7 (virtualbox, 2.2.2)
lamp_plane_bento (virtualbox, 0)
```

上記のように、追加されていれば OK


そして、普通に追加。

```bash:配布先のコマンドライン
$ vagrant init lamp_plane_bento
```

# （配布先）Vagrantfileなどを修正する。

- Vagrantfileは、デフォルトで生成されるので、（配布元）の環境に応じた設定をする必要がある。
- その際に、ネットワーク周りのエラーが発生しやすい。

と言うことで、はまりやすいです。


## Vagrantfile の　修正例


配布先でも、配布元で使っていた環境に合わせたい場合でも、
IPアドレスなどには留意する必要があります。

```ruby:配布元のVagrantfileの例
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-6.7"

  config.vm.provider "virtualbox" do |v|
    v.name = "Hello Vagrant"
    v.cpus = 2
    v.memory = 1024
    v.customize ["modifyvm", :id, "--vram","16"]
  end

  #Private  network
  config.vm.network "public_network", ip: "192.168.100.200", bridge: 'en0: Wi-Fi (AirPort)'
end

```

```ruby:配布先のVagrantfileの例
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-6.7"

  config.vm.provider "virtualbox" do |v|
    v.name = "Hello Vagrant Clone"
    v.cpus = 2
    v.memory = 1024
    v.customize ["modifyvm", :id, "--vram","16"]
  end

  #Private  network
  config.vm.network "public_network", ip: "192.168.100.201", bridge: 'en0: Wi-Fi (AirPort)'
end

```

コピペでやろうと思った？　エラーが出やすいけど。

## ネットワークまわりの警告

配布元で、boxをエクスポートする際に

```bash:配布先のターミナル
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

Device eth1 does not seem to be present, delaying initialization.


Stderr from the command:

```


## 一旦Vagrantのゲストにアクセスし、対応する。

上記のエラーが出ていても、仮想マシン自体は起動しているので `Vagrant ssh` でアクセスすることは可能です。

```bash:仮想マシン上でコマンド入力
$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

仮想マシン上にて、上記コマンド入力後、ターミナル画面で以下のコマンドを入力

```bash:配布先のターミナル
$ vagrant reload
```

新しい設定が反映されます。

これで、「仮想環境を必要に応じて複製、配布」ができるようになりました！

# 参考

Vagrantのboxに少しだけ手を加えたものをboxとして取っておきたい
http://qiita.com/t_cyrill/items/ef9cb2b615bfb326f79c

macで作られたvagrant boxをもらったときに出るネットワークエラーの対処法
http://qiita.com/tarr1124/items/8276e609c0f7cdec79e7