published: 16th of August 2020
This post will cover the process of installing Vagrant with the libvirt provider on Ubuntu 1804.
For reference the following software will be used in this post.
Before we begin, lets ensure the host is updated.
sudo apt update -y && sudo apt upgrade -y
Download Vagrant.
wget https://releases.hashicorp.com/vagrant/2.2.9/vagrant_2.2.9_x86_64.deb
# output
--2020-08-15 00:37:08-- https://releases.hashicorp.com/vagrant/2.2.9/vagrant_2.2.9_x86_64.deb
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.97.183, 2a04:4e42:7::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.97.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 42978828 (41M) [application/x-debian-package]
Saving to: ‘vagrant_2.2.9_x86_64.deb’
vagrant_2.2.9_x86_64.deb 100%[=================================================>] 40.99M 11.2MB/s in 3.7s
2020-08-15 00:37:12 (11.1 MB/s) - ‘vagrant_2.2.9_x86_64.deb’ saved [42978828/42978828]
Install Vagrant.
sudo dpkg -i vagrant_2.2.9_x86_64.deb
# output
Selecting previously unselected package vagrant.
(Reading database ... 67128 files and directories currently installed.)
Preparing to unpack vagrant_2.2.9_x86_64.deb ...
Unpacking vagrant (1:2.2.9) ...
Setting up vagrant (1:2.2.9) ...
Verify Vagrant installation.
which vagrant
# output
/usr/bin/vagrant
vagrant --version
# output
Vagrant 2.2.9
Install the vagrant-libvirt dependencies
sudo apt install -y qemu libvirt-bin ebtables dnsmasq-base
sudo apt install -y libxslt-dev libxml2-dev libvirt-dev zlib1g-dev ruby-dev
Install the vagrant-libvirt plugin
vagrant plugin install vagrant-libvirt
# output
Installing the 'vagrant-libvirt' plugin. This can take a few minutes...
Fetching excon-0.76.0.gem
Fetching formatador-0.2.5.gem
Fetching fog-core-2.2.0.gem
Fetching fog-json-1.2.0.gem
Fetching mini_portile2-2.4.0.gem
Fetching nokogiri-1.10.10.gem
Building native extensions. This could take a while...
Fetching fog-xml-0.1.3.gem
Fetching ruby-libvirt-0.7.1.gem
Building native extensions. This could take a while...
Fetching fog-libvirt-0.7.0.gem
Fetching vagrant-libvirt-0.1.2.gem
Installed the plugin 'vagrant-libvirt (0.1.2)'!
Add your user to the libvirt group.
sudo usermod -aG libvirt $USER
Create a vagrant-libvirt network using an xml file named vagrant-libvirt.xml with the below contents.
<network connections='1'>
<name>vagrant-libvirt</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.121.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.121.2' end='192.168.121.254'/>
</dhcp>
</ip>
</network>
Define and start the network.
virsh net-define vagrant-libvirt.xml
virsh net-start vagrant-libvirt
virsh net-autostart vagrant-libvirt
Create a test folder and Vagrantfile
mkdir -p ~/vagrant/centos-test && cd ~/vagrant/centos-test && vagrant init centos/7
# output
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
The vagrant init command will create the following Vagrantfile
# Comments removed for berevity.
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
end
Now confirm that you can build a Vagrant box with the vagrant up command.
vagrant up
# output
Bringing machine 'default' up with 'libvirt' provider...
==> default: Box 'centos/7' could not be found. Attempting to find and install...
default: Box Provider: libvirt
default: Box Version: >= 0
==> default: Loading metadata for box 'centos/7'
default: URL: https://vagrantcloud.com/centos/7
==> default: Adding box 'centos/7' (v2004.01) for provider: libvirt
default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/2004.01/providers/libvirt.box
Download redirected to host: cloud.centos.org
default: Calculating and comparing box checksum...
==> default: Successfully added box 'centos/7' (v2004.01) for 'libvirt'!
==> default: Uploading base box image as volume into Libvirt storage...
==> default: Creating image (snapshot of base box volume).
==> default: Creating domain with the following settings...
==> default: -- Name: centos-test_default
==> default: -- Domain type: kvm
==> default: -- Cpus: 1
==> default: -- Feature: acpi
==> default: -- Feature: apic
==> default: -- Feature: pae
==> default: -- Memory: 512M
==> default: -- Management MAC:
==> default: -- Loader:
==> default: -- Nvram:
==> default: -- Base box: centos/7
==> default: -- Storage pool: default
==> default: -- Image: /var/lib/libvirt/images/centos-test_default.img (41G)
==> default: -- Volume Cache: default
==> default: -- Kernel:
==> default: -- Initrd:
==> default: -- Graphics Type: vnc
==> default: -- Graphics Port: -1
==> default: -- Graphics IP: 127.0.0.1
==> default: -- Graphics Password: Not defined
==> default: -- Video Type: cirrus
==> default: -- Video VRAM: 9216
==> default: -- Sound Type:
==> default: -- Keymap: en-us
==> default: -- TPM Path:
==> default: -- INPUT: type=mouse, bus=ps2
==> default: Creating shared folders metadata...
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if its present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Rsyncing folder: /home/bradmin/vagrant/centos-test/ => /vagrant
# SUCCESS !!!!
Kill the Vagrant box
vagrant destroy -f
# output
==> default: Removing domain...
Delete Vagrant .deb file.
rm ~/vagrant_2.2.9_x86_64.deb
If you followed along, Vagrant and the vagrant-libvirt plugin are now installed in your Ubuntu 1804 host and you can successfully build Vagrant boxes.