Multi-Machine Vagrant Setup
Vagrant's multi-machine feature lets you define and manage multiple VMs from a single Vagrantfile. This is perfect for database lab environments — spin up a complete MySQL Master + Replica + ProxySQL stack with one vagrant up command.
Architecture
Basic Multi-Machine Vagrantfile
Ruby — Multi-Machine Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# Shared box
config.vm.box = "generic/oracle8"
# Disable default synced folder
config.vm.synced_folder ".", "/vagrant", disabled: true
# ── PROXYSQL ──────────────────────────────────────────
config.vm.define "proxysql" do |node|
node.vm.hostname = "proxysql"
node.vm.network "private_network", ip: "192.168.56.10"
node.vm.network "forwarded_port", guest: 6033, host: 16033
node.vm.network "forwarded_port", guest: 6032, host: 16032
node.vm.provider "virtualbox" do |vb|
vb.name = "ProxySQL"
vb.memory = 1024
vb.cpus = 1
end
node.vm.provision "shell", path: "scripts/install_proxysql.sh"
end
# ── MYSQL MASTER ──────────────────────────────────────
config.vm.define "master" do |node|
node.vm.hostname = "mysql-master"
node.vm.network "private_network", ip: "192.168.56.11"
node.vm.network "forwarded_port", guest: 3306, host: 13306
node.vm.provider "virtualbox" do |vb|
vb.name = "MySQL-Master"
vb.memory = 2048
vb.cpus = 2
end
node.vm.provision "shell",
path: "scripts/install_mysql.sh",
args: ["master", "192.168.56.11"]
end
# ── MYSQL REPLICA 1 ───────────────────────────────────
config.vm.define "replica1" do |node|
node.vm.hostname = "mysql-replica1"
node.vm.network "private_network", ip: "192.168.56.12"
node.vm.network "forwarded_port", guest: 3306, host: 13307
node.vm.provider "virtualbox" do |vb|
vb.name = "MySQL-Replica1"
vb.memory = 2048
vb.cpus = 2
end
node.vm.provision "shell",
path: "scripts/install_mysql.sh",
args: ["replica", "192.168.56.12"]
end
# ── MYSQL REPLICA 2 ───────────────────────────────────
config.vm.define "replica2" do |node|
node.vm.hostname = "mysql-replica2"
node.vm.network "private_network", ip: "192.168.56.13"
node.vm.network "forwarded_port", guest: 3306, host: 13308
node.vm.provider "virtualbox" do |vb|
vb.name = "MySQL-Replica2"
vb.memory = 2048
vb.cpus = 2
end
node.vm.provision "shell",
path: "scripts/install_mysql.sh",
args: ["replica", "192.168.56.13"]
end
end
Multi-Machine Commands
BASH — Multi-Machine Commands
# Start ALL machines
vagrant up
# Start specific machine only
vagrant up master
vagrant up proxysql
# SSH into specific machine
vagrant ssh master
vagrant ssh replica1
vagrant ssh proxysql
# Status of all machines
vagrant status
# Stop specific machine
vagrant halt replica2
# Stop all machines
vagrant halt
# Restart specific machine
vagrant reload master
# Destroy specific machine
vagrant destroy replica2 --force
# Destroy all machines
vagrant destroy --force
# Provision specific machine
vagrant provision master
# Run provisioner on all machines
vagrant provision
Using Loops for Identical Nodes
Ruby — Loop for Multiple Replicas
# DRY approach — loop for multiple replicas
Vagrant.configure("2") do |config|
config.vm.box = "generic/oracle8"
# Define replicas using a loop
(1..3).each do |i|
config.vm.define "replica#{i}" do |node|
node.vm.hostname = "mysql-replica#{i}"
node.vm.network "private_network", ip: "192.168.56.#{10 + i}"
node.vm.network "forwarded_port",
guest: 3306,
host: 13300 + i
node.vm.provider "virtualbox" do |vb|
vb.name = "MySQL-Replica#{i}"
vb.memory = 2048
vb.cpus = 2
end
node.vm.provision "shell",
path: "scripts/install_mysql.sh",
args: ["replica#{i}", "192.168.56.#{10 + i}"]
end
end
end
Boot Order Control
Ruby — Boot Order
# Control which machine boots first using primary flag
config.vm.define "master", primary: true do |node|
# This VM boots first when running vagrant up without specifying a machine
end
# autostart: false — this VM does NOT start with vagrant up
config.vm.define "replica2", autostart: false do |node|
# Only starts with: vagrant up replica2
end
💡 Note: By default all machines start in parallel. Use --no-parallel flag if you need sequential boot: vagrant up --no-parallel — important when master must be running before replicas configure replication.