複数のVMを入れたVagrantfileにおいてVM名を指定するとVMが起動しない
Vagrantは最近つかい始めたので、認識間違っている点があればご指摘ください。
環境
- Windows10/11
- Vagrant 2.4.1
- VirtualBox 7.0.8
事象
以下のような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は以下のとおり。
# -*- 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
-
Multi-Machine | Vagrant | HashiCorp Developer
https://developer.hashicorp.com/vagrant/docs/multi-machine ↩︎ -
Configuration - VirtualBox Provider | Vagrant | HashiCorp Developer
https://developer.hashicorp.com/vagrant/docs/providers/virtualbox/configuration#virtual-machine-name ↩︎
Discussion