Vagrantの/etc/hosts系プラグインを比べてみた(vagrant-hostmanager / vagrant-hostsupdater / vagrant-hosts)

[ここ][plugins]に載ってる/etc/hosts系のプラグインについて調べてみた。

[plugins]:https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins#etchosts-approach
[hostmaster]:https://github.com/mosaicxm/vagrant-hostmaster
[hostmanager]:https://github.com/smdahlen/vagrant-hostmanager
[hostsupdater]:https://github.com/cogitatio/vagrant-hostsupdater
[hosts]:https://github.com/adrienthebo/vagrant-hosts
[flow]:https://github.com/DemandCube/vagrant-flow

[multi-machine]:https://docs.vagrantup.com/v2/multi-machine/index.html

# どんなプラグインか？

Vagrantfileに書かれたVMのIPアドレスとホスト名から、ホストOSまたはゲストOSの/etc/hostsを設定してくれる。
これらを使うとゲストOSにアクセスするときにIPアドレスではなくホスト名を使うことができる。

大別するとホストOSのhostsを設定するものとゲストOSのhostsを設定するものがある。

ホストOSのhosts設定は、例えばVMでDBサーバーを構築してホストOSからゲストOSへアクセスするような用途で使用する。

ゲストOSのhosts設定は、[複数VM構成][multi-machine]でDBサーバーとWebサーバーを構築してWebサーバーからDBサーバーを使用する、というようなゲストOSから別のゲストOSをアクセスするような用途で使用する。

|プラグイン名|ホストOSの<br/>hosts設定|ゲストOSの<br/>hosts設定|備考|
|:----------------|:-:|:-:|:---|
|[vagrant-hostmaster][hostmaster]    | ○ | ○ |最新のVagrant1.7.1で動かなかったので未検証|
|[vagrant-hostmanager][hostmanager]  | ○ | ○ |
|[vagrant-hostsupdater][hostsupdater]| ○ |   |
|[vagrant-hosts][hosts]              |   | ○ |
|[vagrant-flow][flow]                |   | ○ |ちょっと用途が違うようなので未検証|

# vagrant-hostmanager

ゲストOSとホストOSの/etc/hostsを設定するプラグイン。

## インストール

```bash
vagrant plugin install vagrant-hostmanager
```

## 使い方

Vagrantfileにホスト名とプライベートネットワークでIPアドレスを指定しておく。

```rb:Vagrantfile
  config.vm.define "node1" do |node|
    node.vm.hostname = "node1"
    node.vm.network "private_network", ip: "192.168.33.11"
  end
  config.vm.define "node2" do |node|
    node.vm.hostname = "node2"
    node.vm.network "private_network", ip: "192.168.33.12"
  end
```

VMを起動してから`vagrant hostmanager`を実行すると、ゲストOSの/etc/hostsにゲストOSの情報を書き込まれる。

```bash
$ vagrant up
Bringing machine 'node1' up with 'virtualbox' provider...
Bringing machine 'node2' up with 'virtualbox' provider...
:
$ vagrant hostmanager
[node1] Updating /etc/hosts file...
[node2] Updating /etc/hosts file...
```

```:ゲストOSの/etc/hosts
## vagrant-hostmanager-start
192.168.33.11	node1 
192.168.33.12	node2 
## vagrant-hostmanager-end
```

デフォルトでは`vagrant hostmanager`を実行しないと動作しないが、Vagrantfileに以下の行を追加しておけば`vagrant up`時に自動的にhosts設定を行ってくれる。

```rb:Vagrantfile
config.hostmanager.enabled = true
```

以下の行を追加すると、ホストOSのhostsへも追加してくれる。

```rb:Vagrantfile
config.hostmanager.manage_host = true
```

`vagrant destroy`するとhostsから削除される。

```bash:
$ vagrant destroy -f
==> node2: Forcing shutdown of VM...
==> node2: Destroying VM and associated drives...
==> node2: Updating /etc/hosts file on active guest machines...
==> node2: Updating /etc/hosts file on host machine (password may be required)...
==> node1: Forcing shutdown of VM...
==> node1: Destroying VM and associated drives...
==> node1: Updating /etc/hosts file on active guest machines...
==> node1: Updating /etc/hosts file on host machine (password may be required)...
```

エイリアスにも対応している。

```rb:Vagrantfile
node.hostmanager.aliases = %w(alias1 alias2)
```  
```
192.168.33.11	node1 alias1 alias2
```


# vagrant-hostsupdater

VMの起動/停止を行った時に、ホストOSの/etc/hostsへゲストOSの情報を追加/削除してくれる。
Vagrantfileに特別なオプションを設定する必要がないので便利。

ただしゲストOSのhosts書き換えには未対応。

## インストール

```bash
vagrant plugin install vagrant-hostsupdater
```

## 使い方

Vagrantfileにホスト名とプライベートネットワークでIPアドレスを指定しておく。

```rb:Vagrantfile
  config.vm.network :private_network, ip: "192.168.3.10"
  config.vm.hostname = "www.testing.de"
  config.hostsupdater.aliases = ["alias.testing.de", "alias2.somedomain.com"]
```

`vagrant up`すると/etc/hostsに以下のような形が追加される。

```/etc/hosts
192.168.3.10  www.testing.de  # VAGRANT: 46578ee9ed1fb5802248fcde434beb13 (default) / c33ad775-b720-403a-942b-b6ae3aa4bdf6
192.168.3.10  alias.testing.de  # VAGRANT: 46578ee9ed1fb5802248fcde434beb13 (default) / c33ad775-b720-403a-942b-b6ae3aa4bdf6
192.168.3.10  alias2.somedomain.com  # VAGRANT: 46578ee9ed1fb5802248fcde434beb13 (default) / c33ad775-b720-403a-942b-b6ae3aa4bdf6
```

`vagrant halt`または`vagrant destory`を実行するとhostsから削除される。

# vagrant-hosts

ゲストOSのhostsを設定するプラグイン。

## インストール

```bash
vagrant plugin install vagrant-hosts
```

## 使い方

Vagrantfileに`node.vm.provision :hosts`を書いておくと、プロビジョニング実行時に/etc/hostsを設定してくれる。

```rb:Vagrantfile
  config.vm.define "node1" do |node|
    node.vm.hostname = "node1"
    node.vm.network "private_network", ip: "192.168.33.11"
    node.vm.provision :hosts
  end
  config.vm.define "node2" do |node|
    node.vm.hostname = "node2"
    node.vm.network "private_network", ip: "192.168.33.12"
    node.vm.provision :hosts
  end
```

VM未作成の状態から`vagrant up`して各ゲストOSのhostsを確認してみる。

```:node1の/etc/hosts
192.168.33.11 node1
```
```:node2の/etc/hosts
192.168.33.11 node1
192.168.33.12 node2
```

あれ？node1のhostsにnode2の情報がない。。。
node1のプロビジョニングが実行されたタイミングではnode2がまだ未作成だからだろうか？

`vagrant provision`してから再度確認するとちゃんと書き込まれていた。

```:node1の/etc/hosts
192.168.33.11 node1
192.168.33.12 node2
```
```:node2の/etc/hosts
192.168.33.11 node1
192.168.33.12 node2
```

VM以外のホストを追加することもできる。

```rb:Vagrantfile
    node.vm.provision :hosts do |provisioner|
      provisioner.autoconfigure = true
      provisioner.add_host '172.16.3.10', ['yum.mirror.local']
    end
```

# 感想

vagrant-hostmanagerがゲストOS/ホストOS両方のhosts設定に対応していてオプションも色々あるので一番オススメ。
だけどVagrantfileにオプションを追加しないと自動では設定してくれない。

vagrant-hostsupdaterは特別な設定をしなくてもいいので、ホストOSのhosts設定だけ必要なら使い易い。

というわけで、ホストOSのhosts設定はvagrant-hostsupdater、ゲストOSのhosts設定はvagrant-hostmanagerと２つ併用するのがベストだと思う。