Sat, December 27, 2025 ยท 2 min read

Modular vagrant file

Modular vagrant file

As the number of VMโ€™s required increased in my Vagrant file it started growing very large. One approach to simplify this would be having a directory with all the config files .rb, explicitly call them. This also saves additional steps of cd to directories, running vagrant up.

Structure: A global libvirt settings, VMโ€™s divided in 3 categories small, medium, large.

vagrant/
โ”œโ”€โ”€ Vagrantfile
โ”œโ”€โ”€ vagrant.d/
โ”‚   โ”œโ”€โ”€ 00-provider-libvirt.rb
โ”‚   โ”œโ”€โ”€ 10-resources-small.rb
โ”‚   โ”œโ”€โ”€ 10-resources-medium.rb
โ”‚   โ”œโ”€โ”€ 10-resources-large.rb
โ”‚   โ”œโ”€โ”€ 20-disks.rb
โ”‚   โ”œโ”€โ”€ 30-networks.rb
โ”‚   โ”œโ”€โ”€ vm-chef-server.rb
โ”‚   โ”œโ”€โ”€ vm-k3s.rb
โ”‚   โ””โ”€โ”€ vm-eve-ng.rb

vagrant.d/00-provider-libvirt.rb

config.vm.provider :libvirt do |lv|
  lv.driver = "kvm"
  lv.cpu_mode = "host-passthrough"
  lv.nested = true
  lv.graphics_type = "none"
  lv.video_type = "virtio"
  lv.disk_bus = "virtio"
  lv.nic_model_type = "virtio"
  lv.memorybacking :access, :mode => "shared"
end

vagrant.d/10-resources-small.rb

{
  cpus: 1,
  ram: 1024
}

vagrant.d/10-resources-medium.rb

{
  cpus: 2,
  ram: 2048
}

vagrant.d/10-resources-large.rb

{
  cpus: 4,
  ram: 8192
}

vagrant.d/20-disks.rb

{
  small: 10,
  medium: 20,
  large: 40
}

vagrant.d/vm-eve-ng.rb

config.vm.define "eve-ng" do |vm|
  vm.vm.hostname = "eve-ng"
  vm.vm.box = "generic/ubuntu2204"
 
  profile = LARGE
  disk    = DISKS[:large]
 
  vm.vm.provider :libvirt do |lv|
    lv.cpus  = profile[:cpus]
    lv.memory = profile[:ram]
    lv.storage :file, size: "#{disk}G"
  end
end

vagrant.d/vm-k3s.rb

config.vm.define "k3s" do |vm|
  vm.vm.hostname = "k3s"
  vm.vm.box = "almalinux/8"
 
  profile = MEDIUM
  disk    = DISKS[:large]
 
  vm.vm.provider :libvirt do |lv|
    lv.cpus  = profile[:cpus]
    lv.memory = profile[:ram]
    lv.storage :file, size: "#{disk}G"
  end
end

vagrant.d/vm-chef-server.rb

config.vm.define "chef-server" do |vm|
  vm.vm.hostname = "chef-server"
  vm.vm.box = "almalinux/8"
 
  profile = MEDIUM
  disk    = DISKS[:large]
 
  vm.vm.provider :libvirt do |lv|
    lv.cpus  = profile[:cpus]
    lv.memory = profile[:ram]
    lv.storage :file, size: "#{disk}G"
  end
end

Caveats: remember to keep hostnames unique in the vagrant files.