ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

VagrantでVirtualBox providerで動かすUbuntu 16.04が1つ以上起動できない問題に対応するには

最近、Vagrantネタばっかりですね。まあいいですけど。

Vagrant 1.8.5とVirtualBox 5.1.4で次のようなVagrantfileで二つ目の仮想マシンを起動しようとするとちょっと困ったことになります。

#Ubuntu Xenial
 config.vm.define :xenial1 do |xenial1|
  xenial1.vm.box = "xenial"
  xenial1.vm.hostname = "xenial1"
  xenial1.vm.network "private_network", ip: "192.168.0.220"
 end

 config.vm.define :xenial2 do |xenial2|
  xenial2.vm.box = "xenial"
  xenial2.vm.hostname = "xenial2"
  xenial2.vm.network "private_network", ip: "192.168.0.221"
 end

起動!

# vagrant up xenial1 xenial2

残念ながらこんなエラーが出て起動しませんでした。

==> xenial2: Importing base box 'xenial'...
==> xenial2: Matching MAC address for NAT networking...
A VirtualBox machine with the name 'ubuntu-xenial-16.04-cloudimg' already exists.
Please use another name or delete the machine with the existing
name, and try again.

Trustyのイメージはこの設定だけでも想定通り動いたのですが、Xenialのイメージはなんか変みたいです。 エラーでググると次のような情報を発見。

stackoverflow.com

つまり、次のように設定ごとにvb.nameを書いてあげると、同じboxで複数のUbuntu Xenial(16.04)を起動できるようです。本来は起動した時に自動的に「Vagrantfileが配置されたフォルダ名+config.vm.defineのところに書いた名前」に書き変わるのですが、Xenialの公式イメージだとその変更がうまくいかないので、一意な名前に手動で書き換えてあげる必要があるようです。

 config.vm.define :xenial3 do |xenial3|
    config.vm.provider "virtualbox" do |vb|  ←追記
     vb.name = "xenial3"                             ←追記
    end                                                     ←追記
  xenial3.vm.box = "xenial"
  xenial3.vm.hostname = "xenial3"
  xenial3.vm.network "private_network", ip: "192.168.0.222"
 end

同じような設定でxenial1-xenial3を作って、vagrant up xenial1 xenial2 xenial3と実行したところ、3つとも仮想マシンが作られて起動したことを確認しています。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。