I've already gone over how to install Vagrant and get a single virtual machine setup. That article will give you a primer how to set up a Vagrant test environment.

Vagrant is a valuable tool if you need a few VMs to test some kind of server application. It’s also a free tool and acts like an automation layer between the user and a virtual environment. Gone are the days of having to install Hyper-V, VmWare ESXi, or some other hypervisor on a server somewhere, create VMs, create the VHDs, set up networking, etc., just to do some simple testing. This is where Vagrant saves you tons of time.

This article will be about taking your skills up a notch if you'd like to set up an entire environment. You'll learn how to test a high-availability situation, such as setting up load balancers, clusters, and the like. I've also personally used this to test Ansible managing Windows, which required a Linux and a Windows host.

Let's get into the logistics of how to use Vagrant to set up three VMs on your local machine. Vagrant is not limited to three VMs, but my machine is! For this demonstration, I'm going to create an Ubuntu Linux server, a Windows Server 2012 R2, and a Windows Server 2016 VM. I'll be bringing up these VMs on Oracle's Virtualbox. VirtualBox is free, has full support with Vagrant, and there's already a lot of Vagrant boxes already created for VirtualBox.

I'll head on over to the public Vagrant box catalog and pick the three boxes I'd like to use. I'll pick the latest Ubuntu box, a box from Matt Wrock with Windows Server 2012 R2 and a Windows Server 2016 TP5 box. Now that I've selected each of the boxes I'll be bringing up, I'll need to add references to each of the boxes in my VagrantFile.

Assuming you've already got Vagrant and VirtualBox installed, next we need to get into your VagrantFile configuration file. At this point, you've probably already got a VagrantFile created with, perhaps, a single VM that looks something like this:

config.vm.provider "VirtualBox" do |vb|
   # Display the VirtualBox GUI when booting the machine
   vb.gui = true
   # Customize the amount of memory on the VM:
   vb.memory = "1024"

If so, we'll have to modify that a little bit to add support for multiple VMs. To do that, we'll have to nest this Ruby do loop inside another to get support for multiple Vagrant boxes. To save you some time, here's the complete VagrantFile I'm working with.

# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backward compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
        config.vm.define "linux" do |ctl|
                ctl.vm.box = "ubuntu/trusty64"
                ctl.vm.hostname = "linux"
                ctl.vm.network "private_network",ip: ""
                ctl.vm.provider "virtualbox" do |vb|
                        vb.memory = 2048
        config.vm.define "WinSrv1" do |winsrv1|
               winsrv1.vm.box = "mwrock/Windows2012R2"
               winsrv1.vm.hostname = "S1"
               winsrv1.vm.communicator = "winrm"
              winsrv1.winrm.username = "vagrant"
              winsrv1.winrm.password = "vagrant"
               winsrv1.vm.network "private_network",ip: ""
               winsrv1.vm.provider "virtualbox" do |vb|
                        vb.memory = 2048
                        vb.cpus = 1
        config.vm.define "WinSrv2" do |winsrv2|
                winsrv2.vm.box = "mwrock/windows2016"
                winsrv2.vm.hostname = "S2"
                winsrv2.vm.communicator = "winrm"
                winsrv2.winrm.username = "vagrant"
                winsrv2.winrm.password = "vagrant"
                winsrv2.vm.network "private_network",ip: ""
                winsrv2.vm.provider "virtualbox" do |vb|
                        vb.memory = 2048
                        vb.cpus = 1

You can see the file that I've arbitrarily chosen is a private IP network of, and I have each box set with a different IP address. I've also made sure to configure the Windows boxes to use WinRM with the standard vagrant/vagrant username/password.

Let's now attempt to run "vagrant up" and see what happens!

Run "vagrant up"

Run "vagrant up"

Vagrant will automatically download the boxes from the Internet and perform the configuration needed

Vagrant will automatically download the boxes from the Internet and perform the configuration needed

Notice that even if I don't have the boxes locally, Vagrant will automatically download them from the Internet, perform the necessary configuration, and bring them online. Once I've got my VagrantFile set up correctly, I can simply add a few more lines to this text file to bring up another box immediately.

Now that the machines are up, let's ensure that Vagrant sees them all.

Vagrant sees them all

Vagrant sees them all

Great! This shows that the three boxes I just provisioned are all online. I'll now try to SSH into the Linux server and use PowerShell remoting to connect to one of the Windows servers.

SSH into the Linux server and using PowerShell remoting to connect to one of the Windows servers

SSH into the Linux server and using PowerShell remoting to connect to one of the Windows servers

The box name has been specified

Notice that I had to specify the name of the box. If this were a single machine, I'd simply need to type "vagrant ssh" or "vagrant powershell" instead.

At this point, you're free to test away or do whatever you need to do on these local boxes. When you're done, you can either remove the box, which removes it from your box list, or destroy the box, which also removes the box and all the attached disks as well.

Subscribe to 4sysops newsletter!

Testing the boxes

Testing the boxes



Leave a reply

Please enclose code in pre tags

Your email address will not be published.


© 4sysops 2006 - 2023


Please ask IT administration questions in the forums. Any other messages are welcome.


Log in with your credentials


Forgot your details?

Create Account