I’ve seen and heard how Vagrant is powerful tool for development environments. Vagrant is a tool from Hashicorp for managing virtual environments. I’ve had it installed for a while, but never really dug in far enough to understand the value. Well, like most things, I didn’t understand the value because I didn’t have a particular use case. Well now I do…
I was having issues running multiple VMs on my MacBook Pro via Fusion. Namely, that if I want to run a CSR router, I don’t have the horsepower to also run other VMs at the same time. A coworker of mine had mentioned on an internal forum that he recommended using Vagrant for testing Ansible. I am just scratching the surface I believe, but this did solve my particular problem. I can spin up a VM using Vagrant to test my Ansible playbooks against the aforementioned CSR–all on my laptop.
I won’t cover the basic installation of Vagrant itself, but that information is available at the Vagrant website, as well as much more documentation: https://www.vagrantup.com
OK. So here is where I start customizing. When you install Vagrant, a file named vagrantfile gets installed and contains all the information about your vagrant environment.
If you want to customize the different ansible machines you can spin up, copy the vagrant file into different directory per project.
For mine, I copied the vagrantfile into /vagrant-ansible-example/.
I can now edit the vagrantfile to customize this instance.
I can set which OS to spin up.
config.vm.box = "ubuntu/trusty64"
I can create a synced folder. I can have my Ansible files, or python files on my desktop and mount that directory from within the vagrant machine. This is useful to have access to playbooks or scripts that I am editing that I want to run from within a VM.
config.vm.synced_folder "/Users/bob/Documents/Github", "/Github"
I can then customize my vagrant machine by calling a bash startup script to install ansible, pip, and xlrd. (These are just examples, could be any packages you need to install.)
config.vm.provision "shell" do |s| s.path = "./setup.sh" end
Here is a snippet of what my setup script looks like.
<br />#!/bin/bash echo "setting up environment" echo "installing ansible" sudo apt-get install ansible -y echo "installing pip" sudo apt-get install python-pip -y echo "installing xlrd" sudo pip install xlrd
We spin up or machine from within the Vagrant-ansible-example directory.
vagrant up
It boots up our OS and runs our startup script, then we can ssh to our machine and start testing.
The nice thing about Vagrant, I have found, is I can easily reset my machine back to this first known-good state, or change my startup parameters and spin up a new VM anytime.
I can do this by issuing a vagrant destroy
command, which will wipe out any state configuration on my VM. Then I just issue vagrant up
again and it spins up my VM like it was a brand new install.