Using VMware vSphere/ESXi as a Provider for Vagrant

Please note: This post assumes you are comfortable with Vagrant, Virtualisation and generic admin tasks on a server.

vSphere & ESXi

One thing I’ve been wanting to do for a while was control my VMWare ESXi based hosts with Vagrant, so that I could easily create and remove boxes while testing. By default, Vagrant can’t do this. Similar to how the interaction with Digital Ocean works, you can install a plugin to aid in getting this to work.

The vagrant-vsphere plugin has been created by the National Snow and Ice Data Center team and open sourced for others to use. You can read more information about it on the Github page for the project at github.com/nsidc/vagrant-vsphere/. There are more configuration options that I don’t mention here that you can tinker with once you are more familiar with how the setup works.

To start, grab the ISO file of your distribution of choice. I chose to go with Ubuntu 14.04 as it is an LTS version and more recently the projects I’ve been working on have used it. You’re going to create a Virtual Machine that will serve as a base for all of your Vagrant instances that you’ll create in future.

Upload the Ubuntu ISO to your datastore and remember where you placed it. Next, create a new virtual machine with a reasonable amount of RAM and CPUs for your box, select the ISO in the CDROM options and boot up your new virtual machine as normal. Set up the box as you usually would do, I left pretty much everything as default apart from the user which you’ll need to setup for Vagrant to use.

During the install you will be prompted to create a user account. Use the username vagrant and the password vagrant, this is required for vagrant to run later down the line.

Complete the installation process, installing any additional software that you would like such as Nginx, Apache, MySQL etc.

After the machine has rebooted, login and run the update commands:

sudo apt-get update -y
sudo apt-get upgrade -y

Install all the updates and then reboot:

sudo shutdown -r now

Next, install the open-vm-tools package which provides VMWare integration for the guest:

sudo apt-get install open-vm-tools -y

Again, after they’re installed, reboot:

sudo shutdown -r now

Next, you need to add the vagrant user to the sudoers file:

sudo su -

Enter the vagrant user password that you set to vagrant earlier and then run the following command to edit the sudoers for the machine:

visudo

At the end of the file, add the line:

vagrant ALL=(ALL) NOPASSWD:ALL

Exit the editor by pressing CTRL+X, Save changes. Next we need to add Vagrants key to the user account:

mkdir -p /home/vagrant/.ssh
wget --no-check-certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys

After the file has downloaded, reset permissions to the correct ones:

chmod 0700 /home/vagrant/.ssh
chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant /home/vagrant/.ssh

Now we’ll need to install the OpenSSH server (if you haven’t already):

sudo apt-get install -y openssh-server

After installation is complete, edit the configuration file at /etc/ssh/sshd_config and make sure that following options match the below:

Port 22
PubKeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PermitEmptyPasswords no

Restart the SSH server:

sudo service ssh restart

Now we have our template box. In your vSphere client, right click on your newly created virtual machine, select Template, then select “Clone to Template”. Follow the steps and give it a good name that you’ll remember.

Creating a Template in vSphere

As you can see in the image above, I called mine ubuntu.template.dc.sw10.net which is sitting in the resource pool Linux in the host 192.168.1.2 and that host resides in the datacentre dc.sw10.net. This is just a sample configuration and you can adjust yours to suit.

Installing the Vagrant Plugin

If you’ve got this far, I’m going to assume that you have Vagrant installed on your on your machine. Run the following command to install the plugin that we’re going to use:

vagrant plugin install vagrant-vsphere

You can learn more about the plugin and it’s various options over on the Github page at github.com/nsidc/vagrant-vsphere/. There are quite a few settings that you can change which I won’t detail here.

Creating a Vagrantfile

To create a Vagrantfile that we can run, we’ll need to add a few configuration options in to instruct the plugin on where to locate things. I started with the following Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = 'vsphere'
  config.vm.box_url = 'https://vagrantcloud.com/ssx/boxes/vsphere-dummy/versions/1/providers/vsphere.box'

config.vm.provider :vsphere do |vsphere|
# The host we’re going to connect to
vsphere.host = ‘192.168.1.253’

The host for the new VM

vsphere.compute_resource_name = '192.168.1.2'            

# The resource pool for the new VM
vsphere.resource_pool_name = 'Linux'                    

# The template we're going to clone        
vsphere.template_name = 'ubuntu.template.dc.sw10.net'    

# The name of the new machine
vsphere.name = 'bingo'                                     

# vSphere login
vsphere.user = 'root'                                    

# vSphere password
vsphere.password = 'password'                            

# If you don't have SSL configured correctly, set this to 'true'
vsphere.insecure = true                                    

end
end

Save that file, double check your credentials and then run Vagrant:

 vagrant up --provider=vsphere

You can see progress in the task/event log in vSphere, but you should see the template being cloned and then the machine booting:

vSphere showing created VM and clone in operation

After this has completed, you’ll have something similar to the following output where you ran vagrant up:

 ➜  vagrant up --provider=vsphere     
 Bringing machine 'default' up with 'vsphere' provider...
 ==> default: Calling vSphere CloneVM with the following settings:
 ==> default:  -- Template VM: dc.sw10.net/vm/ubuntu.template.dc.sw10.net
 ==> default:  -- Target VM: dc.sw10.net/vm/bingo
 ==> default: Waiting for SSH to become available...
 ==> default: New virtual machine successfully cloned and started
 ==> default: Rsyncing folder: /Users/scott/Downloads/tmp/ => /vagrant

You can now use the other Vagrant commands such as ssh:

➜  tmp  vagrant ssh     
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)

System information disabled due to load higher than 1.0

Last login: Sat Oct 11 13:30:21 2014 from 192.168.1.3
vagrant@ubuntu:~$ hostname
ubuntu
vagrant@ubuntu:~$

and of course you can vagrant destroy too:

 ➜  vagrant destroy
==> default: Calling vSphere PowerOff    
==> default: Calling vSphere Destroy

I’ll most likely update this article soon with provisioning Nginx, PHP etc. If you need a dummy box to use with vagrant-vsphere, then I’ve added one to Vagrant Cloud at:

https://vagrantcloud.com/ssx/boxes/vsphere-dummy/versions/1/providers/vsphere.box