Using Vagrant to Deploy Multiple VMs on vSphere

by admin

I wrote an article recently looking at how to deploy virtual machines on vSphere using Vagrant. On that post I covered how to deploy a single Photon OS virtual machine using Vagrant. Here, I wanted to do a quick post on how to deploy multiple VMs from a single Vagrant file. One way to do so is to define each VM separately in the Vagrantfile, for example:

Vagrant.configure(2) do |config|
        config.vm.define "VM1" do |subconfig|
                subconfig.vm.box = "vsphere"
                subconfig.vm.box_url = './example_box/dummy.box'
                subconfig.vm.network 'private_network', ip: '192.168.5.224'
                        subconfig.vm.provider 'vsphere' do |vsphere|
                                # The host we're going to connect to
                                vsphere.host = 'vc01.testlab.local'
                                # The host for the new VM
                                vsphere.compute_resource_name = 'esxi01.testlab.local'
                                # The resource pool for the new VM
                                # vsphere.resource_pool_name = 'VagrantVMs'
                                # The template we're going to clone
                                vsphere.template_name = 'PhotonTemplate'
                                # The name of the new machine
                                vsphere.name = 'PhotonVM1'
                                # vSphere login
                                vsphere.user = 'administrator@vsphere.local'
                                # vSphere password
                                vsphere.password = 'password'
                                # If you don't have SSL configured correctly, set this to 'true'
                                vsphere.insecure = true
                                vsphere.customization_spec_name = 'centos66'
                                vsphere.memory_mb = 4096
                                vsphere.vlan = 'isolated'
                        end
                end
 
 
config.vm.define "VM2" do |subconfig1|
                subconfig1.vm.box = "vsphere"
                subconfig1.vm.box_url = './example_box/dummy.box'
                subconfig1.vm.network 'private_network', ip: '192.168.5.225'
                        subconfig1.vm.provider 'vsphere' do |vsphere|
                                # The host we're going to connect to
                                vsphere.host = 'vc01.testlab.local'
                                # The host for the new VM
                                vsphere.compute_resource_name = 'esxi01.testlab.local'
                                # The resource pool for the new VM
                                # vsphere.resource_pool_name = 'VagrantVMs'
                                # The template we're going to clone
                                vsphere.template_name = 'PhotonTemplate'
                                # The name of the new machine
                                vsphere.name = 'PhotonVM2'
                                # vSphere login
                                vsphere.user = 'administrator@vsphere.local'
                                # vSphere password
                                vsphere.password = 'password'
                                # If you don't have SSL configured correctly, set this to 'true'
                                vsphere.insecure = true
                                vsphere.customization_spec_name = 'centos66'
                                vsphere.vlan = 'isolated'
                                # config.vm.network 'private_network', ip: '192.168.5.225'
                        end
                end
 
end

Using this method, you can have Vagrant provision multiple VMs, each with their own configuration. E.g. a small web server VM and a database VM with more compute resources allocated. Alternatively, to provision multiple VMs with the same hardward configuration, something like the following could be used:

[root@localhost vagrant_vm]# cat Vagrantfile
vm1 = { 'name' => "PhotonVM1", 'ip' => "192.168.5.224" }
vm2 = { 'name' => "PhotonVM2", 'ip' => "192.168.5.225" }
vms = [ vm1, vm2]
 
Vagrant.configure(2) do |config|
  vms.each do |node|
    vm_name = node['name']
    vm_ip = node['ip']
    config.vm.define vm_name do |node_config|
        node_config.vm.network 'private_network', ip: "#{vm_ip}"
        node_config.vm.box = "dummy"
        node_config.vm.box_url = "./example_box/dummy.box"
        node_config.vm.provider :vsphere do |vsphere|
        vsphere.host = 'vc01.testlab.local'
        vsphere.compute_resource_name = 'esxi01.testlab.local'
        vsphere.name = vm_name
        vsphere.customization_spec_name = 'centos66'
        vsphere.template_name = 'PhotonTemplate'
        vsphere.user = 'administrator@vsphere.local'
        vsphere.password = 'password'
        vsphere.insecure = true
        end
        end
  end
end

This Vagrantfile has the ‘unique’ configuration of the VMs to be provisioned stated at the start of the file. The above example will create 2 VMs with the stated hostnames and IP addresses, but with the same hardware configuration.This is perfect for provisioning a lot of similar virtual machines quickly.

Keep up to date with new posts on Buildvirtual.net - Follow us on Twitter:
Be Sociable, Share!

Leave a Comment

*

Previous post:

Next post: