Vagrant OEL 8 DevOps · Parallels · Database Labs

VagrantMulti-Machine with Parallels

Complete multi-machine Vagrant setup with Parallels on macOS. ProxySQL + MySQL Master + Replicas lab, snapshot management and Apple Silicon performance tips.

Running a multi-VM database lab with Parallels on Mac gives excellent performance — especially on Apple Silicon. This page shows complete multi-machine Vagrantfile configurations for common database lab scenarios using the Parallels provider.

Ruby — Multi-Machine Parallels Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Lab: ProxySQL + MySQL Master + 2 Replicas on Parallels

PARALLELS_OPTS = {
  update_guest_tools:          false,
  check_guest_tools:           false,
  optimize_power_consumption:  false
}

NODES = [
  { name: "proxysql",  ip: "192.168.56.10", mem: 1024, cpu: 1, fwd: [[6033, 16033], [6032, 16032]] },
  { name: "master",    ip: "192.168.56.11", mem: 4096, cpu: 2, fwd: [[3306, 13306]] },
  { name: "replica1",  ip: "192.168.56.12", mem: 4096, cpu: 2, fwd: [[3306, 13307]] },
  { name: "replica2",  ip: "192.168.56.13", mem: 4096, cpu: 2, fwd: [[3306, 13308]] },
]

Vagrant.configure("2") do |config|
  config.vm.box              = "generic/oracle8"
  config.vm.box_check_update = false

  NODES.each do |node|
    config.vm.define node[:name] do |vm|
      vm.vm.hostname = node[:name]
      vm.vm.network "private_network", ip: node[:ip]

      node[:fwd].each do |guest_port, host_port|
        vm.vm.network "forwarded_port", guest: guest_port, host: host_port
      end

      vm.vm.provider "parallels" do |prl|
        prl.name   = "DB-Lab-#{node[:name]}"
        prl.memory = node[:mem]
        prl.cpus   = node[:cpu]
        PARALLELS_OPTS.each { |k, v| prl.send("#{k}=", v) }
      end

      vm.vm.provision "shell",
        path: "scripts/provision_#{node[:name]}.sh",
        args: [node[:ip]]
    end
  end
end
BASH — Multi-Machine Commands
# Set default provider (add to ~/.zshrc permanently)
export VAGRANT_DEFAULT_PROVIDER=parallels

# Start all VMs
vagrant up

# Start specific VM
vagrant up master

# Start in sequence (master first, then replicas)
vagrant up --no-parallel master
vagrant up --no-parallel replica1
vagrant up --no-parallel replica2

# SSH into machines
vagrant ssh master
vagrant ssh replica1
vagrant ssh proxysql

# Status of all
vagrant status

# Stop all
vagrant halt

# Destroy all
vagrant destroy --force
BASH — Lab Snapshots
# Snapshot all machines at once (save lab state)
for vm in proxysql master replica1 replica2; do
    vagrant snapshot save $vm "lab-baseline"
done

# Restore all machines
for vm in proxysql master replica1 replica2; do
    vagrant snapshot restore $vm "lab-baseline"
done

# List snapshots for all machines
for vm in proxysql master replica1 replica2; do
    echo "=== $vm ==="
    vagrant snapshot list $vm
done
  • Start VMs in --no-parallel mode when order matters (master before replicas)
  • Use linked_clone: true in Parallels provider to save disk space
  • Set optimize_power_consumption: false for consistent CPU performance
  • On Apple Silicon, allocate performance cores — set cpus to even numbers
  • Use private_network for inter-VM communication — much faster than port forwarding
Ruby — Linked Clone
# Linked clone saves disk — each VM shares base disk
config.vm.provider "parallels" do |prl|
  prl.linked_clone = true   # saves ~10GB per VM
end
💡 Note: On Apple Silicon Macs running 4 VMs simultaneously, total RAM usage is roughly: VM RAM + 10% overhead per VM. For 4 VMs at 4GB each, plan for ~18GB available RAM on your Mac.