donderdag 25 november 2021

Vagrant: mapping a Virtualbox VM to a Vagrant environment

Via Martin's Blog by Martin Bach

ef5fa3199a324585218a2d8daa686248?s=200&t

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!

New article matched for in your Blogger! rule

Testing Wide Production 2020