Skip to content
This repository has been archived by the owner on Feb 28, 2023. It is now read-only.

Commit

Permalink
Keep current kernel version if matching.
Browse files Browse the repository at this point in the history
  • Loading branch information
JGoutin committed Nov 27, 2019
1 parent 62ac780 commit 9525381
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 26 deletions.
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Linux Kernel Role
=================

This Ansible role install and enable a specific kernel version from OS repositories.
This Ansible role install and enable a specific kernel version from OS repositories and to ensure matching kernel headers are installed.

Requirements
------------
Expand All @@ -15,9 +15,12 @@ The specified Kernel version must be supported by OS repositories (This include
Role Variables
--------------

* **install_kernel_headers**: If True, also install matching kernel headers. Default to `true`.
* **kernel_version**: Install the most recent kernel version available that start by this value. Default to `''`.
* **reboot_on_kernel_update**: If True, reboot the system if the kernel was updated. Default to `true`.
* **install_kernel_headers**: If True, also install matching kernel headers.
Default to `true`.
* **kernel_version**: Install the most recent kernel version available that start by this value (Keep the current kernel version if matching).
Default to any version.
* **reboot_on_kernel_update**: If True, reboot the system if the kernel was updated.
Default to `true`.

Example Playbook
----------------
Expand Down
2 changes: 1 addition & 1 deletion defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Install kernel headers
install_kernel_headers: true

# Kernel version to install (Default to latest available)
# Kernel version to install (Default to any version)
kernel_version: ''

# Reboot if kernel was updated
Expand Down
36 changes: 26 additions & 10 deletions filter_plugins/main.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
"""Extra Ansible filters"""


def _rhel_kernel_info(packages, kernel_version):
def _rhel_kernel_info(packages, kernel_version, current_version):
"""
Return kernel to install with associated repository.
Args:
packages (dict): DNF/YUM list output.
kernel_version (str): Kernel version to install.
current_version (str): Current kernel version.
Returns:
dict: kernel version, repository
"""
kernels = list()

# If current version match with required version, use this version
if current_version.startswith(kernel_version):
kernel_version = current_version

# List all available kernel version and associated repository
for line in packages['stdout'].splitlines():
if line.startswith('kernel.') and not line.startswith('kernel.src'):
Expand All @@ -31,47 +36,56 @@ def _rhel_kernel_info(packages, kernel_version):
', '.join(kernel['version'] for kernel in kernels)))


def rhel_kernel(packages, kernel_version):
def rhel_kernel(packages, kernel_version, current_version):
"""
Return matching kernel version to install.
Args:
packages (dict): DNF/YUM list output.
kernel_version (str): Kernel version to install.
current_version (str): Current kernel version.
Returns:
str: kernel version.
"""
return _rhel_kernel_info(packages, kernel_version)['version']
return _rhel_kernel_info(
packages, kernel_version, current_version)['version']


def rhel_repo(packages, kernel_version):
def rhel_repo(packages, kernel_version, current_version):
"""
Return repository where found specified kernel version.
Args:
packages (dict): DNF/YUM list output.
kernel_version (str): Kernel version to install.
current_version (str): Current kernel version.
Returns:
str: repository name
"""
return _rhel_kernel_info(packages, kernel_version)['repo']
return _rhel_kernel_info(
packages, kernel_version, current_version)['repo']


def deb_kernel(packages, kernel_version):
def deb_kernel(packages, kernel_version, current_version):
"""
Return best matching kernel version.
Args:
packages (dict): apt-cache showpkg output.
kernel_version (str): Kernel version to install.
current_version (str): Current kernel version.
Returns:
str: kernel version.
"""
kernels = set()

# If current version match with required version, use this version
if current_version.startswith(kernel_version):
kernel_version = current_version

# List all available kernel version and associated repository
for line in packages['stdout'].splitlines():
line = line.strip()
Expand Down Expand Up @@ -133,13 +147,14 @@ def _deb_kernel_package(kernel, dist, arch, name):
return '-'.join((name, kernel, suffix))


def deb_kernel_pkg(packages, kernel_version, dist, arch, name):
def deb_kernel_pkg(packages, kernel_version, current_version, dist, arch, name):
"""
Return kernel package to install.
Args:
packages (dict): apt-cache showpkg output.
kernel_version (str): Kernel version to install.
current_version (str): Current kernel version.
dist (str): Distribution.
arch (str): Architecture.
name (str): Package name.
Expand All @@ -148,23 +163,24 @@ def deb_kernel_pkg(packages, kernel_version, dist, arch, name):
str: kernel package to install.
"""
return _deb_kernel_package(
deb_kernel(packages, kernel_version), dist, arch, name)
deb_kernel(packages, kernel_version, current_version), dist, arch, name)


def deb_installed_kernel(installed, packages, kernel_version):
def deb_installed_kernel(installed, packages, kernel_version, current_version):
"""
Return old kernel packages to remove.
Args:
installed (dict): dpkg -l output.
packages (dict): apt-cache showpkg output.
kernel_version (str): Kernel version to install.
current_version (str): Current kernel version.
Returns:
list of str: Kernel packages to remove.
"""
# Filter installed package to keep
to_keep = deb_kernel(packages, kernel_version)
to_keep = deb_kernel(packages, kernel_version, current_version)

# Return installed package to remove
to_remove = []
Expand Down
2 changes: 1 addition & 1 deletion meta/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ galaxy_info:
- 8
- name: Fedora
versions:
- 29
- 30
- 31
- name: Ubuntu
versions:
- xenial
Expand Down
7 changes: 5 additions & 2 deletions molecule/default/molecule.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ platforms:
image: centos:7
- name: centos_8
image: centos:8
- name: fedora_30
image: fedora:30
- name: debian_buster
image: debian:buster
- name: ubuntu_bionic
Expand All @@ -23,10 +21,15 @@ provisioner:
name: ansible-lint
inventory:
host_vars:
# Warning: Always specify a version: bad version detected from container
centos_7:
kernel_version: 3.10.0-693
centos_8:
kernel_version: 4.18.0
ubuntu_bionic:
kernel_version: 4.15.0
debian_buster:
kernel_version: 4.19.0
verifier:
name: testinfra
lint:
Expand Down
21 changes: 13 additions & 8 deletions tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@
register: yum_kernel_list

- name: Set target YUM kernel version
set_fact: _kernel="{{ yum_kernel_list | rhel_kernel(kernel_version) }}"
set_fact: _kernel="{{ yum_kernel_list |
rhel_kernel(kernel_version, ansible_kernel) }}"
when: yum_kernel_list is not skipped

- name: Ensure kernel packages versions with YUM
yum:
name: "{{ item.name }}-{{ _kernel }}"
enablerepo: "{{ yum_kernel_list | rhel_repo(kernel_version) }}"
enablerepo: "{{ yum_kernel_list |
rhel_repo(kernel_version, ansible_kernel) }}"
allow_downgrade: true
when:
- ansible_os_family == 'RedHat'
Expand All @@ -50,13 +52,15 @@
register: dnf_kernel_list

- name: Set target DNF kernel version
set_fact: _kernel="{{ dnf_kernel_list | rhel_kernel(kernel_version) }}"
set_fact: _kernel="{{ dnf_kernel_list |
rhel_kernel(kernel_version, ansible_kernel) }}"
when: dnf_kernel_list is not skipped

- name: Ensure kernel packages versions with DNF
dnf:
name: "{{ item.name }}-{{ _kernel }}"
enablerepo: "{{ dnf_kernel_list | rhel_repo(kernel_version) }}"
enablerepo: "{{ dnf_kernel_list |
rhel_repo(kernel_version, ansible_kernel) }}"
allow_downgrade: true
when:
- ansible_os_family == 'RedHat'
Expand Down Expand Up @@ -91,14 +95,15 @@
register: apt_packages_list

- name: Set target APT kernel version
set_fact: _kernel="{{ apt_kernel_list | deb_kernel(kernel_version) }}"
set_fact: _kernel="{{ apt_kernel_list |
deb_kernel(kernel_version, ansible_kernel) }}"
when: apt_kernel_list is not skipped

- name: Ensure kernel packages versions with APT
apt:
name: "{{ apt_kernel_list | deb_kernel_pkg(
kernel_version, ansible_distribution, ansible_architecture,
item.name) }}"
kernel_version, ansible_kernel, ansible_distribution,
ansible_architecture, item.name) }}"
when:
- ansible_os_family == 'Debian'
- item.when
Expand All @@ -111,7 +116,7 @@
- name: Ensure any other kernel packages are removed with APT
apt:
name: "{{ apt_packages_list | deb_installed_kernel(
apt_kernel_list, kernel_version) }}"
apt_kernel_list, kernel_version, ansible_kernel) }}"
state: absent
purge: true
when: ansible_os_family == 'Debian'
Expand Down

0 comments on commit 9525381

Please sign in to comment.