![ef5fa3199a324585218a2d8daa686248?s=200&t](https://secure.gravatar.com/blavatar/ef5fa3199a324585218a2d8daa686248?s=200&ts=1637846793)
This is a small post hopefully saving you a few minutes mapping Vagrant and VirtualBox environments.
I typically have lots of Vagrant environments defined. I love Vagrant as a technology, it makes it super easy to spin up Virtual Machines (VMs) and learn about new technologies.
Said Vagrant environments obviously show up as VMs in VirtualBox. To make it more interesting I have a few more VirtualBox VMs that don't map to a Vagrant environment. Adding in a naming convention that's been growing organically over time I occasionally find myself at a loss as to which VirtualBox VM maps to a Vagrant environment. Can this be done? Yep, and creating a mapping is quite simple actually. Here is what I found useful.
Directory structure
My Vagrant directory structure is quite simple: I defined ${HOME}/vagrant
as top-level directory with a sub-directory containing all my (custom) boxes. Apart from ~/vagrant/boxes
I create further sub-directories for each project. For example:
[martin@ryzen: vagrant]$ ls -ld *oracle* boxes drwxrwxr-x 2 martin martin 4096 Nov 23 16:52 boxes drwxrwxr-x 3 martin martin 41 Feb 16 2021 oracle_19c_dg drwxrwxr-x 3 martin martin 41 Nov 19 2020 oracle_19c_ol7 drwxrwxr-x 3 martin martin 41 Jan 6 2021 oracle_19c_ol8 drwxrwxr-x 3 martin martin 41 Nov 25 12:54 oracle_xe
But … which of my VirtualBox VMs belongs to the oracle_xe
environment?
Mapping a Vagrant environment to a VirtualBox VM
Vagrant keeps a lot of metadata in the project's .vagrant
directory. Continuing with the oracle_xe
example, here is what it stores:
[martin@buildhost: oracle_xe]$ tree .vagrant/ vagrant/ ├── machines │ └── oraclexe │ └── virtualbox │ ├── action_provision │ ├── action_set_name │ ├── box_meta │ ├── creator_uid │ ├── id │ ├── index_uuid │ ├── synced_folders │ └── vagrant_cwd ├── provisioners │ └── ansible │ └── inventory │ └── vagrant_ansible_inventory └── rgloader └── loader.rb 7 directories, 10 files
Looking at the above output I guess I should look at .vagrant/machines/
The machine name (oraclexe) is derived from the Vagrantfile
. I create a config.vm.define
section per VM out of habit (even when I create just 1 VM), as you can see here in my shortened Vagrantfile
:
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.define "oraclexe" do |xe| xe.vm.box = "ol7" xe.vm.box_url = "file:///home/martin/vagrant/boxes/ol7.json" ... xe.vm.provision "ansible" do |ansible| ansible.playbook = "setup.yml" end end end
In case you don't give your VMs a name you should find a directory named default
instead.
As I'm using Vagrant together with VirtualBox I'm not surprised to find a sub-directory named virtualbox
.
Finally! You see the VM's metadata in that directory. The VM's ID can be found in .vagrant/machines/oraclexe/virtualbox/id
. The file contains the internal ID VirtualBox uses to identify VMs. Using that knowledge to my advantage I can create the lookup as shown here:
[martin@buildhost: oracle_xe]$ vboxmanage list vms | grep $(cat .vagrant/machines/oraclexe/virtualbox/id) "oraclexe" {67031773-bad9-4325-937b-e471d02a56a3}
Voila! This wasn't particularly hard since the VM name is oracelxe as well. Nevertheless I found this technique works well regardless of how you curated your Vagrantfile
.
Happy Automating!