How to Install Vagrant on Centos 7/8 and Ubuntu 18
If you are running a home lab, it is inevitable that you will want to provision new VMs and would like to run your tests. There is always an option to create a golden image and then clone it if you need new VMs but why should you bother yourself to handle it all manually. Hashicorp already provides perfect automation for you, Vagrant. I do personally like it as you can keep all your infrastructure with Infrastructure as Code approach in your
Vagrantfile
. So let's see how we can install vagrant on top of our hypervisor. There is no official VirtualBox package for Ubuntu 20 while I am writing this post so I am skipping it
There are also some manual steps required to install libvirt vagrant plugin on Centos 8. That's why I am also skipping it, but you can refer to the official documentation if you want to install the plugin on Centos 8
The first prerequisite is the obvious one: hypervisor. We first need to have a running hypervisor and you can refer to my post to install either KVM or VirtualBox. I personally prefer KVM over VirtualBox.
I again collected all the prerequisites under
tasks/prereq.yaml
play:tasks/prereq.yaml
---
- name: Setting OS version fact
set_fact:
osversion: "{{ ansible_distribution | lower }}{{ ansible_distribution_major_version }}"
- name: Check OS version
fail:
msg: "OS Version( {{ ansible_distribution }}{{ ansible_distribution_major_version }} ) is not certified for the role"
when:
- osversion != "ubuntu18"
- osversion != "centos7"
- osversion != "centos8"
- name: Check default vagrant provider variable
fail:
msg: "Default vagrant provider can be either libvirt or virtualbox"
when:
- default_provider != "libvirt"
- default_provider != "virtualbox"
- name: Check default provider for Centos 8
fail:
msg:
- "Centos 8 has some issues with vagrant pluging that cannot be automated"
- "Please refer to the original documentation for manual steps"
- "https://github.com/vagrant-libvirt/vagrant-libvirt"
when: (default_provider == "libvirt") and (osversion == "centos8")
As I prefer
KVM
, I made libvirt
provider the default provider for the role. You can feel free to change the provider to virtualbox
in vars/main.yml
file.vars/main.yml
---
# vars file for ansible-role-vagrant
vagrant_version: "2.2.14"
vagrant_base_url: "https://releases.hashicorp.com/vagrant/{{ vagrant_version }}"
default_provider: "libvirt"
I will also follow my habit to divide plays into smaller pieces in my
tasks/main.yml
file. I prefer to include operating system based plays in my main play.tasks/main.yml
---
# tasks file for ansible-role-vagrant
- name: Prereq check
include_tasks: prereq.yaml
- name: Install and Configure for CentOS
include_tasks: centos.yaml
when: ansible_distribution == "CentOS"
- name: Install and Configure for Ubuntu
include_tasks: ubuntu.yaml
when: ansible_distribution == "Ubuntu"
If your vagrant provider will be
VirtualBox
, it is pretty straightforward. You will just need to install vagrant
. If you will be installing vagrant
for libvirt
provider, then you will need to install some dependencies. Thanks to the open-source community, there is a module supported by 100s of contributors here. This module will allow you run vagrant
commands under KVM
without any hassle. tasks/centos.yaml
---
- name: "Install vagrant binary on Centos 7"
yum:
name: "{{ vagrant_base_url }}/vagrant_{{ vagrant_version }}_x86_64.rpm"
state: present
when: ansible_distribution_major_version == "7"
# Fails if GPG check is enabled. Will find a better way.
- name: "Install vagrant binary on Centos 8"
dnf:
name: "{{ vagrant_base_url }}/vagrant_{{ vagrant_version }}_x86_64.rpm"
state: present
disable_gpg_check: true
when: ansible_distribution_major_version == "8"
- name: "Install libvirt vagrant plugin"
block:
- name: Install vagrant Plugin prereqs
yum:
name:
- libvirt
- libvirt-devel
- ruby-devel
- qemu-kvm
- libxslt-devel
- libxml2-devel
- libvirt-devel
- libguestfs-tools-c
- ruby-devel
- gcc
- name: Install vagrant libvirt plugin
command: "vagrant plugin install vagrant-libvirt"
become: false
when: default_provider == "libvirt"
If your vagrant provider will be
VirtualBox
, it is pretty straightforward. You will just need to install vagrant
. If you will be installing vagrant
for libvirt
provider, then you will need to install some dependencies. Thanks to the open-source community, there is a module supported by 100s of contributors here. This module will allow you run vagrant
commands under KVM
without any hassle. The module requires one of the source repositories to be enabled, but I couldn't find an easier way to only enable main source repository so I decided to enable all in
/etc/apt/sources.list
but feel free to comment if you have a better solution. I could have used replace
module with backup
option and then could have restored the file after the installation is finished but I will handle it in a better way later. My exposure with Ubuntu / Debian administration is fairly new so I am sure there is a proper way to do it.tasks/ubuntu.yaml
---
- name: "Install Vagrant"
apt:
deb: "{{ vagrant_base_url }}/vagrant_{{ vagrant_version }}_x86_64.deb"
- name: Install libvirt vagrant dependencies
block:
# I couldn't find a better way to enable source repositories
- name: Enable source libraries
replace:
path: /etc/apt/sources.list
regexp: '^#( deb-src http.*)'
replace: '\1'
- name: Install build dependencies
apt:
name:
- vagrant
- ruby-libvirt
state: build-dep
update_cache: true
- name: Install prereq packages
apt:
name:
- qemu
- libvirt-bin
- ebtables
- dnsmasq-base
- libxslt-dev
- libxml2-dev
- libvirt-dev
- zlib1g-dev
- ruby-dev
- name: Install vagrant libvirt plugin
command: "vagrant plugin install vagrant-libvirt"
become: false
when: default_provider == "libvirt"
You can also use my Ansible roles to install vagrant along with the KVM or VirtualBox. You can download my roles with
ansible-galaxy
and then add it in a playbook as below:Install KVM with Vagrant
---
- name: Install KVM with Vagrant
hosts: myhypervisor
become: yes
roles:
- { role: yasarlaro.kvm, libvirt_user: "admin" }
- { role: yasarlaro.vagrant, default_provider: "libvirt" }
or
Install VirtualBox with Vagrant
---
- name: Install VirtualBox with Vagrant
hosts: myhypervisor
become: yes
roles:
- { role: yasarlaro.virtualbox }
- { role: yasarlaro.vagrant, default_provider: "virtualbox" }