複数VMを名前で相互接続

Vagrantにおいて表題の通り。先日のエントリではhostnameの設定までしかできていなかったので、次は名前でお互いにアクセスできるようにする。

■ 環境

  • Vagrant 1.7.4
  • CentOS 6.6

■ vagrant-hosts プラグイン

vagrant-hosts“というプラグインがあるそうなので試してみる。

$ vagrant plugin install vagrant-hosts

また、Vagrantfileには下記のように追記した。

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

Vagrant.configure(2) do |config|
  config.vm.box = "chef/centos-6.6"
  config.vm.define "zoo1" do |zoo|
    zoo.vm.hostname = "zoo1"
    zoo.vm.provision :hosts
  end
  config.vm.define "zoo2" do |zoo|
    zoo.vm.hostname = "zoo2"
    zoo.vm.provision :hosts
  end
end

`vagrant up`時に下記のようにログに出力されている。

$ vagrant up
  :
==> zoo1: Running provisioner: hosts...
  :
==> zoo2: Running provisioner: hosts...
$

これでVMの/etc/hostsファイルにお互いが記載されるのかと思ったのだが…、予想とは違う動きをした。

$ vagrant ssh zoo1
[vagrant@zoo1 ~]$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 zoo1
[vagrant@zoo1 ~]$ logout
Connection to 127.0.0.1 closed.
$ vagrant ssh zoo2
[vagrant@zoo2 ~]$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 zoo2
[vagrant@zoo2 ~]$ 

どちらもお互いの記載がない…。ネットワークの設定を入れなければならない?と思い、下記のようにVagrantfileにネットワーク設定を追記した。固定IPにはしたくなかったのでDHCPで取得するようにしている。

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

Vagrant.configure(2) do |config|
  config.vm.box = "chef/centos-6.6"
  config.vm.define "zoo1" do |zoo|
    zoo.vm.hostname = "zoo1"
    zoo.vm.network "private_network", type: "dhcp"
    zoo.vm.provision :hosts
  end
  config.vm.define "zoo2" do |zoo|
    zoo.vm.hostname = "zoo2"
    zoo.vm.network "private_network", type: "dhcp"
    zoo.vm.provision :hosts
  end
end

これで起動したところ、少々動作が変わった。

$ vagrant ssh zoo1
[vagrant@zoo1 ~]$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 zoo1
 zoo1
[vagrant@zoo1 ~]$ logout
Connection to 127.0.0.1 closed.
$ vagrant ssh zoo2
[vagrant@zoo2 ~]$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 zoo2
 zoo1
 zoo2
[vagrant@zoo2 ~]$ 
  1. zoo1の/etc/hostsファイルにzoo2の記載が無い
  2. zoo1, zoo2共にIPが設定されていない

zoo2の/etc/hostsファイルにはzoo1/zoo2共に記載されていた。起動順序としてzoo1から起動されるので、zoo1の起動時にはzoo2が起動されていない為、zoo2のIPが判明せずに記載することができない、ということのような気がする。zoo2の起動時にはzoo1はもちろん既に起動している為、IPが判明するので記載できる。

また、IPを固定にせずDHCPにしている為、書けないのかもしれない…。

provisionerを再度実行してみる。

$ vagrant provision
==> zoo1: Running provisioner: hosts...
==> zoo2: Running provisioner: hosts...
$

この状態で再度/etc/hostsファイルを確認した。

$ vagrant ssh zoo1
[vagrant@zoo1 ~]$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 zoo1
 zoo1
 zoo2
[vagrant@zoo1 ~]$ logout
Connection to 127.0.0.1 closed.
$ vagrant ssh zoo2
[vagrant@zoo2 ~]$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 zoo2
 zoo1
 zoo2
[vagrant@zoo2 ~]$ 

zoo1の/etc/hostsファイルにzoo2の記載も増えたが、やはりIPは記載してくれていない。

これではやりたいことができないのでvagrant-hostsプラグインは削除することにした。別のプラグインを探ってみることにする。

$ vagrant plugin uninstall vagrant-hosts
Uninstalling the 'vagrant-hosts' plugin...
$

以上。

■ 関連