Enabling multiprovider Vagrant environments
You might be running VMware on your laptop, but your coworker might not. Alternatively, you want people to have the choice, or you simply want both environments to work! We'll see how to build a single Vagrantfile to support them all.
Getting ready
To step through this recipe, you will need the following:
- A working Vagrant installation
- A working VirtualBox installation
- A working VMware Workstation (PC) or Fusion (Mac) installation
- A working Vagrant VMware plugin installation
- An internet connection
- The Vagrantfile from the previous recipe using a bento/centos72 box
How to do it…
Some Vagrant boxes are available for multiple hypervisors, such as the CentOS 7 Bento box we previously used. This way, we can simply choose which one to use.
Let's start with our previous Vagrantfile including customizations for VMware:
Vagrant.configure("2") do |config| config.vm.box = "bento/centos-7.2" ["vmware_fusion", "vmware_workstation"].each do |vmware| config.vm.provider vmware do |v| v.vmx["numvcpus"] = "2" v.vmx["memsize"] = "1024" end end end
How would we add the same configuration on VirtualBox as we have on VMware? Here's how to customize VirtualBox similarly in the Vagrantfile:
config.vm.provider :virtualbox do |vb| vb.memory = "1024" vb.cpus = "2" end
Add this to your current Vagrantfile, reload and you'll get the requested resources from your hypervisor, be it VMware or VirtualBox.
It's nice, but we're still repeating ourselves with the values, leading to possible errors, omissions, or mistakes in the future. Let's take advantage once again of the Ruby nature of our Vagrantfile and declare some meaningful variables at the top of our file:
vm_memory = 1024 vm_cpus = 2
Now replace the four values by their variable names and you're done: you're centrally managing characteristics of the Vagrant environment you're using and distributing, whatever hypervisor you're using.
How it works…
The simple fact that the Vagrantfile is a pure Ruby file helps creating powerful and dynamic configuration, by simply setting variables that we use later for all the providers.