Vagrant OEL 8 DevOps · VirtualBox · Database Labs

VagrantMulti-Machine Setup

Configure multi-machine Vagrant environments for database labs. Spin up MySQL Master + Replicas + ProxySQL from one Vagrantfile with networking and provisioning.

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.

vagrant up Vagrantfile proxysql 192.168.56.10 master 192.168.56.11 replica1 192.168.56.12 replica2 192.168.56.13
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
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
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
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.