🍱

複数のVMを入れたVagrantfileにおいてVM名を指定するとVMが起動しない

2024/10/24に公開

Vagrantは最近つかい始めたので、認識間違っている点があればご指摘ください。

環境

  • Windows10/11
  • Vagrant 2.4.1
  • VirtualBox 7.0.8

事象

以下のようなVagrantfileを用意する。

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
 config.vm.box = "bento/ubuntu-22.04"
# 1つ目のVMの設定
 config.vm.define "host1" do |host1|
   host1.vm.hostname = "ubuntu-host1"
   host1.vm.network "private_network", ip: "192.168.57.2"

   config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.name = "ubuntu-host1"
   end
 end

# 2つ目のVMの設定
 config.vm.define "host2" do |host2|
   host2.vm.hostname = "ubuntu-host2"
   host2.vm.network "private_network", ip: "192.168.57.3"

   config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.name = "ubuntu-host2"
   end

 end
end

ひとつのVagrantfileで複数のVMを同時に起動する設定にしている[1]
特筆すべき点は、それぞれのVMに対して

config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.name = "ubuntu-host1"
 end

で、各VMの名前をつけている(ubuntu-host1, ubuntu-host2)ことである[2]
Virtual Machine NameはVirtualBoxのGUI上で確認できるVM名である(ホスト名ではない)。

このVagrantfileに対してvagrant upを実行すると、

A VirtualBox machine with the name 'ubuntu-host2' already exists.
Please use another name or delete the machine with the existing
name, and try again.

と怒られて正常にupしない。
正確には、この状態でvagrant statusを実行すると

$  vagrant status                                                                   
Current machine states:

host1                     running (virtualbox)
host2                     poweroff (virtualbox)

となり、host2(VirtualBox的にはubuntu-host2)はVMが作成されているものの起動していない状態となっている。

ところが、VirtualBoxのGUIを開いてみると、

逆にubuntu-host2(Vagrantfileにおけるhost1)は起動しており、host2が見当たらない。

わかっていること

  • この事象はOSを問わず発生する
    • bento/rockylinux9とbento/ubuntu-22.04を試したが、どちらもダメ
  • 3台以上のVMを同時に設定したVagrantfileでも同じ事象が発生する
    • Vagrantfile上の最後のVM(この場合はhost2)に対してエラーが出るっぽい
  • 単純にvb.nameを削除すると起動する
    • VirtualBox上ではランダムな名前が与えられる
    • 管理上これで困ることはないのだが、ちょっと気持ち悪い……

色々調べてみたが、同様の事象は見当たらず原因は不明。
直感的にはVagrantfileの最後のVMだけが先走って起動して、Vagrantの管轄から外れてしまっているように見える。

原因

Vagrantfileの書き方が間違っていた。
config.vm.define "host1" do |host1|のブロック内でVirtualBox固有の設定を定義するとき、config.vm.providerとしてしまっていた。
正しくは親ブロックの識別子であるhost1を使ってhost1.vm.providerと書く。

修正後のVagrantfileは以下のとおり。

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
 config.vm.box = "bento/ubuntu-22.04"
# 1つ目のVMの設定
 config.vm.define "host1" do |host1|
   host1.vm.hostname = "ubuntu-host1"
   host1.vm.network "private_network", ip: "192.168.57.2"

   host1.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.name = "ubuntu-host1"
   end
 end

# 2つ目のVMの設定
 config.vm.define "host2" do |host2|
   host2.vm.hostname = "ubuntu-host2"
   host2.vm.network "private_network", ip: "192.168.57.3"

   host2.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.name = "ubuntu-host2"
   end

 end
end
脚注
  1. Multi-Machine | Vagrant | HashiCorp Developer
    https://developer.hashicorp.com/vagrant/docs/multi-machine ↩︎

  2. Configuration - VirtualBox Provider | Vagrant | HashiCorp Developer
    https://developer.hashicorp.com/vagrant/docs/providers/virtualbox/configuration#virtual-machine-name ↩︎

Discussion