Onur Yasarlar
  • About Me
  • Linux
    • How to Install KVM on CentOS 7/8 and Ubuntu 18/20
    • How to Install VirtualBox on CentOS 7/8 and Ubuntu 18
    • How to Install Vagrant on Centos 7/8 and Ubuntu 18
    • Using vim Effectively
  • Kubernetes
    • How to Install a Kubernetes Cluster
      • Installing Prerequisites for Kubernetes Cluster Installation
      • Installing Container Runtime Interface
      • Installing kubeadm
    • How to Install and Use K3D
  • CI/CD
    • GitLab CICD Pipeline Concepts
      • Stages
    • Quick Introduction to GitLab CICD Pipelines
    • How to install custom Gitlab runners with libvirt executor
  • Azure
    • Azure Infrastructure Automation with Gitlab CI
  • TERRAFORM
    • How to create a Terraform Module
Powered by GitBook
On this page
  • Getting Started
  • Prerequisites
  • Installation on CentOS 7/8
  • Installation on Ubuntu 18.x
  • Putting things together

Was this helpful?

  1. Linux

How to Install VirtualBox on CentOS 7/8 and Ubuntu 18

PreviousHow to Install KVM on CentOS 7/8 and Ubuntu 18/20NextHow to Install Vagrant on Centos 7/8 and Ubuntu 18

Last updated 4 years ago

Was this helpful?

Getting Started

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.

tasks/centos.yaml
---
# yum_repository module does not allow to only enable a yum_repository
# so I deploy full repo file instead
- name: "Enable PowerTools repository"
  copy:
    src: CentOS-PowerTools.repo
    dest: "/etc/yum.repos.d/CentOS-PowerTools.repo"
    owner: "root"
    group: "root"
    mode: "0644"
  when: ansible_facts['distribution_major_version'] == "8"

- name: "Install prerequisite packages"
  package:
    name:
      - "gcc"
      - "make"
      - "perl"
      - "kernel-devel"
      - "kernel-headers"
      - "elfutils-libelf-devel"
      - "xorg-x11-xauth"
      - "xorg-x11-apps"
    state: present

- name: "Add VirtualBox repository"
  yum_repository:
    name: "virtualbox"
    description: "OEL / RHEL / CentOS-$releasever / $basearch - VirtualBox"
    baseurl: "http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch"
    gpgkey: "https://www.virtualbox.org/download/oracle_vbox.asc"
    gpgcheck: "yes"
    repo_gpgcheck: "yes"

- name: Import VirtualBox repo GPG key
  rpm_key:
    state: present
    key: https://www.virtualbox.org/download/oracle_vbox.asc

- name: "Install VirtualBox-{{ virtualbox_version }}"
  yum:
    name: "VirtualBox-{{ virtualbox_version }}"
    state: present

Installation on Ubuntu 18.x

The remaining of this section is no magic. We will just install the required packages.

tasks/ubuntu.yaml
---
- name: Install prereq packages
  apt:
    name:
      - build-essential
      - dkms
      - unzip
    state: present
    update_cache: true

- name: Add VirtualBox repo keys
  apt_key:
    url: "https://www.virtualbox.org/download/{{ item }}.asc"
    state: present
  loop:
    - oracle_vbox
    - oracle_vbox_2016

- name: Add VirtualBox repo
  apt_repository:
    repo: 'deb https://download.virtualbox.org/virtualbox/debian {{ ansible_distribution_release }} contrib'
    state: present
    update_cache: true

- name: "Install virtualbox in version {{ virtualbox_version }}"
  apt:
    name: virtualbox-{{ virtualbox_version }}
    state: present

Putting things together

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.

official documentation
Jeff Geerling
here