読者です 読者をやめる 読者になる 読者になる

ほわいとぼーど

ぷろぐらまのメモ帳

Vagrantでホストオンリーアダプターでハマった

Vagrantで複数VM立ち上げてIPを設定して使用したい用途があるとします。
例えば今回はCassandraのクラスタをローカルに立ててOpsCenterの機能を
試してみようと思っていたので次のようなVagrantfileを書きました。

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

Vagrant.configure("2") do |config|
  config.vm.box = "centos5.5"

  config.vm.define :opscenter do |ops|
    ops.vm.network :private_network, ip: "192.168.100.1"
    ops.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "2048", "--name", "opscenter"]
    end
  end
  config.vm.define :cassandra1 do |cas|
    cas.vm.network :private_network, ip: "192.168.100.2"
    cas.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1536", "--name", "cassandra-1"]
    end
  end
  config.vm.define :cassandra2 do |cas|
    cas.vm.network :private_network, ip: "192.168.100.3"
    cas.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1536", "--name", "cassandra-2"]
    end
  end
end

すると以下のようなエラーをはいたり、
もしくは起動できてもお目当てのIPアドレスが付いて無かったりしました。

[opscenter] Booting VM...
[opscenter] Waiting for VM to boot. This can take a few minutes.
[opscenter] VM booted and ready for use!
[opscenter] Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/sbin/ifup eth1 2> /dev/null

この現象、ググったらそこそこ出てはくるのですが、
解決方法どおりにしても解決しなかったりで時間が結構かかってしまいました。

上記のログが出るのはVirtualBoxのホストオンリーアダプタ登録と不整合があるからです。(多分)
未登録のサブネットをVagrantfileに指定した場合、
vagrantかVirtualBoxのどちらかわかりませんが、自動的に登録しようとしてくれます。
この時に自動登録されるアドレスがそのサブネットの1番です。
つまり今回の例で言うと192.168.100.1で、
自分でも192.168.100.1を指定していたためにバッティングしておかしなことになったのでしょう。
Vagrantfileには1以外を指定すれば無用な問題は避けられそうです。

例のVagrantfileのアドレスをそれぞれ、
192.168.100.10
192.168.100.20
192.168.100.30
として再度実行すると想定どおりに起動できました。

これって要するに使用するサブネットのデフォルトゲートウェイの定義が必要ってことなのかな?
この事は多分わかってる人には当たり前のことだと思うのですが、
自分には曖昧だったので用語はともかく挙動は理解できてよかったです。
vagrant destroyするとアダプタは自動的に削除されます。
なお、自動登録削除の挙動は環境によって異なるかもしれません。
私の今確認中の環境はWindowss7pro vagrant1.1.4 virtualbox4.2.10です。


自動で登録されない場合はあらかじめ登録しておくことで解決出来ます。

VirtualBox管理画面->ファイル->環境設定->ネットワーク

f:id:a3no:20130615003923j:plain

画面の右のほうにあるプラスボタンを押してアダプタを追加しアドレスを設定します。

f:id:a3no:20130615000103j:plain

これでめでたく、、、と思ってOK押した後にもう一度開いてみたら表示がバグっていた。

f:id:a3no:20130615001330j:plain

起動すると#2のついた別のアダプタを登録してますね、、、

f:id:a3no:20130615002240j:plain

会社と家でも若干挙動が違いそうなので、続きはもう少し調べてみます。