I really like testing new things in my home lab but I also often break things. I am really bored with installing my home lab over and over again so I decided to create a series of posts to show how I automated my home lab provisioning. I personally prefer KVM over VirtualBox but I wanted to also document how to install it with an Ansible role. There are tons of writings on how to install VirtualBox on various operating systems including the and I ensure you what I implemented here is no magic or different than what others already documented. I just wanted to keep it in an Ansible module under my own GitHub repository and refer to it if I need some time in the future. I will also mention here how I like to structure my Ansible roles and my habits while I am automating things.
Special thanks to . I learned a lot from his work while I am writing my own Ansible roles
You can find my Ansible role in Ansible Galaxy .
I usually test things under CentOS but after Red Hat's recent announcement of converting CentOS into a beta version of RHEL, I decided to give it a try with Ubuntu and added Ubuntu support to this role recently. The role covers operating systems below but I can add more in the future:
CentOS 7
CentOS 8
Ubuntu 18.x
Ubuntu 20.x has not been certified yet officially by Oracle. The support for Ubuntu 20.x will be added later.
Prerequisites
I usually prefer to have a separate prerequisite play and include it in my main.yml. I start checking if the role is being run for the operating systems that I tested. Here I added another check and verified if the CPU of the server supports virtualization and it is indeed 64-bit.
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 CPU Virtualization Support
shell:
cmd: "egrep -c '(vmx|svm)' /proc/cpuinfo"
args:
warn: false
changed_when: false
register: cpuinfo_output
tags: ['skip_ansible_lint']
- name: Check CPU Virtualization Support
fail:
msg: "CPU does not support virtualization"
when:
- cpuinfo_output.stdout == "0"
- name: Check if your processor is 64-bit
shell:
cmd: "egrep -c ' lm ' /proc/cpuinfo"
args:
warn: false
changed_when: false
register: bitinfo_output
tags: ['skip_ansible_lint']
- name: Check if your processor is 64-bit
fail:
msg: "CPU is not 64-bit"
when:
- bitinfo_output.stdout == "0"
For VirtualBox installation, we only require to provide the version information which I keep under vars/main.yml file:
vars/main.yml
---
# vars file for virtualbox
virtualbox_version: "6.1"
Installation on CentOS 7/8
The remaining of this section is no magic. We will just install the required packages and enable PowerTools repository if we will install VirtualBox to CentOS 8 operating system.
Let me also show how all above put together in the main.yml. I tend to keep main.yml as simple as possible and perform tasks under their dedicated plays.
tasks/main.yml
---
- name: CPU support checks
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"
So we are ready to call this role if we want to install KVM on top of CentOS 7/8 or Ubuntu 18.x/20.x
It is important to run this module as root. Otherwise, it will not be able to install packages and will eventually fail.