diff --git a/docs/centos8.md b/docs/centos8.md
index 695789a5c8a82d97e609a05f876525a82eca7008..ac52897c8afeaccc079ac5e6bce367129a393083 100644
--- a/docs/centos8.md
+++ b/docs/centos8.md
@@ -1,6 +1,6 @@
-# CentOS 8
+# CentOS 8 / AlmaLinux 8
 
-CentOS 8 ships only with iptables-nft (ie without iptables-legacy)
+CentOS 8 / AlmaLinux 8 ships only with iptables-nft (ie without iptables-legacy)
 The only tested configuration for now is using Calico CNI
 You need to use K8S 1.17+ and to add `calico_iptables_backend: "NFT"` or `calico_iptables_backend: "Auto"` to your configuration
 
diff --git a/docs/offline-environment.md b/docs/offline-environment.md
index f8fc5dc888e69b0adcb345aa8acabf0de6b59cab..5e86b56675b3df861726096c7953e93563ae2320 100644
--- a/docs/offline-environment.md
+++ b/docs/offline-environment.md
@@ -31,7 +31,7 @@ calicoctl_download_url: "{{ files_repo }}/kubernetes/calico/{{ calico_ctl_versio
 # If using Calico with kdd
 calico_crds_download_url: "{{ files_repo }}/kubernetes/calico/{{ calico_version }}.tar.gz"
 
-# CentOS/Redhat
+# CentOS/Redhat/AlmaLinux
 ## Docker / Containerd
 docker_rh_repo_base_url: "{{ yum_repo }}/docker-ce/$releasever/$basearch"
 docker_rh_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"
diff --git a/inventory/sample/group_vars/all/offline.yml b/inventory/sample/group_vars/all/offline.yml
index 901d290c156270cf0b5a8dbf0bf1f972dd509b4c..3bdefcded5c1a2dae22b66a05e9a5445a0bd3f57 100644
--- a/inventory/sample/group_vars/all/offline.yml
+++ b/inventory/sample/group_vars/all/offline.yml
@@ -3,7 +3,7 @@
 ### Private Container Image Registry
 # registry_host: "myprivateregisry.com"
 # files_repo: "http://myprivatehttpd"
-### If using CentOS, RedHat or Fedora
+### If using CentOS, RedHat, AlmaLinux or Fedora
 # yum_repo: "http://myinternalyumrepo"
 ### If using Debian
 # debian_repo: "http://myinternaldebianrepo"
@@ -44,7 +44,7 @@
 # [Optional] kata: only if you set kata_containers_enabled: true
 # kata_containers_download_url: "{{ files_repo }}/kata-containers/runtime/releases/download/{{ kata_containers_version }}/kata-static-{{ kata_containers_version }}-{{ ansible_architecture }}.tar.xz"
 
-## CentOS/Redhat
+## CentOS/Redhat/AlmaLinux
 ### For EL7, base and extras repo must be available, for EL8, baseos and appstream
 ### By default we enable those repo automatically
 # rhel_enable_repos: false
diff --git a/requirements.txt b/requirements.txt
index 06eacf1da7ea72a4707b7b8e3a14c4afab7e2eb9..2a42e7ed5ca97bd579cf3a1893814832f2d0b8e4 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-ansible==2.9.18
+ansible==2.9.20
 cryptography==2.8
 jinja2==2.11.3
 netaddr==0.7.19
diff --git a/roles/bootstrap-os/README.md b/roles/bootstrap-os/README.md
index c791850a044d7894c52eca016f55f5d5f57871bf..ae14a1a00e7a15d69285a15cb5c866fb9b5aff46 100644
--- a/roles/bootstrap-os/README.md
+++ b/roles/bootstrap-os/README.md
@@ -35,7 +35,7 @@ Variables are listed with their default values, if applicable.
 * `coreos_locksmithd_disable: false`
   Whether `locksmithd` (responsible for rolling restarts) should be disabled or be left alone.
 
-#### CentOS/RHEL
+#### CentOS/RHEL/AlmaLinux
 
 * `centos_fastestmirror_enabled: false`
   Whether the [fastestmirror](https://wiki.centos.org/PackageManagement/Yum/FastestMirror) yum plugin should be enabled.
diff --git a/roles/bootstrap-os/defaults/main.yml b/roles/bootstrap-os/defaults/main.yml
index 649919b3a42e7345fb300f437749b06dc4da1acb..e9f33b670cdb117e37ed1eba4d4ca2e8d9e1d029 100644
--- a/roles/bootstrap-os/defaults/main.yml
+++ b/roles/bootstrap-os/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-## CentOS/RHEL specific variables
+## CentOS/RHEL/AlmaLinux specific variables
 # Use the fastestmirror yum plugin
 centos_fastestmirror_enabled: false
 
diff --git a/roles/bootstrap-os/tasks/main.yml b/roles/bootstrap-os/tasks/main.yml
index 7b8ffb10e71eadb42f444c6245659a40fd9f2de1..5016b96c84ef98eb8247361ce935c467eba7fce7 100644
--- a/roles/bootstrap-os/tasks/main.yml
+++ b/roles/bootstrap-os/tasks/main.yml
@@ -7,7 +7,7 @@
   check_mode: false
 
 - include_tasks: bootstrap-centos.yml
-  when: '''ID="centos"'' in os_release.stdout_lines or ''ID="ol"'' in os_release.stdout_lines'
+  when: '''ID="centos"'' in os_release.stdout_lines or ''ID="ol"'' in os_release.stdout_lines or ''ID="almalinux"'' in os_release.stdout_lines'
 
 - include_tasks: bootstrap-redhat.yml
   when: '''ID="rhel"'' in os_release.stdout_lines'
diff --git a/roles/container-engine/containerd/tasks/containerd_repo.yml b/roles/container-engine/containerd/tasks/containerd_repo.yml
index 4c03cf7d1588fbee60208d4dbd6233bb9acd51ac..6c4a0470ae097cbf99c03bcddba67b15e32b5462 100644
--- a/roles/container-engine/containerd/tasks/containerd_repo.yml
+++ b/roles/container-engine/containerd/tasks/containerd_repo.yml
@@ -25,8 +25,10 @@
     dest: "{{ yum_repo_dir }}/containerd.repo"
   when: ansible_distribution == "Fedora"
 
-- name: Configure containerd repository on RedHat/OracleLinux/CentOS
+- name: Configure containerd repository on RedHat/OracleLinux/CentOS/AlmaLinux
   template:
     src: "rh_containerd.repo.j2"
     dest: "{{ yum_repo_dir }}/containerd.repo"
-  when: ansible_distribution in ["CentOS", "OracleLinux", "RedHat"]
+  when:
+    - ansible_os_family == "RedHat"
+    - ansible_distribution != "Fedora"
diff --git a/roles/container-engine/containerd/tasks/main.yml b/roles/container-engine/containerd/tasks/main.yml
index 6aacec08d2bba2d0f0a65738b6a88940914787e3..fd6811ae5036e2002775a0f5ee2ca90b77500128 100644
--- a/roles/container-engine/containerd/tasks/main.yml
+++ b/roles/container-engine/containerd/tasks/main.yml
@@ -16,7 +16,7 @@
   fail:
     msg: "{{ ansible_distribution }} is not supported by containerd."
   when:
-    - not ansible_distribution in ["CentOS", "OracleLinux", "RedHat", "Ubuntu", "Debian", "Fedora"]
+    - not ansible_distribution in ["CentOS", "OracleLinux", "RedHat", "Ubuntu", "Debian", "Fedora", "AlmaLinux"]
 
 - name: gather os specific variables
   include_vars: "{{ item }}"
diff --git a/roles/container-engine/docker/tasks/main.yml b/roles/container-engine/docker/tasks/main.yml
index 13903e488870b9e598e657a99080679abbd69f14..ee779279e3964e95a265f9201ec891451f50c9dc 100644
--- a/roles/container-engine/docker/tasks/main.yml
+++ b/roles/container-engine/docker/tasks/main.yml
@@ -82,11 +82,14 @@
     dest: "{{ yum_repo_dir }}/docker.repo"
   when: ansible_distribution == "Fedora" and not is_ostree
 
-- name: Configure docker repository on RedHat/CentOS/Oracle Linux
+- name: Configure docker repository on RedHat/CentOS/Oracle/AlmaLinux Linux
   template:
     src: "rh_docker.repo.j2"
     dest: "{{ yum_repo_dir }}/docker-ce.repo"
-  when: ansible_distribution in ["CentOS","RedHat","OracleLinux"] and not is_ostree
+  when:
+    - ansible_os_family == "RedHat"
+    - ansible_distribution != "Fedora"
+    - not is_ostree
 
 - name: Remove dpkg hold
   dpkg_selections:
diff --git a/roles/container-engine/docker/tasks/pre-upgrade.yml b/roles/container-engine/docker/tasks/pre-upgrade.yml
index d614220f47c8266eed1a7deef91d093d87676da8..d344b222d69fed1c56d899a8e7df353595504699 100644
--- a/roles/container-engine/docker/tasks/pre-upgrade.yml
+++ b/roles/container-engine/docker/tasks/pre-upgrade.yml
@@ -4,7 +4,7 @@
     path: "{{ yum_repo_dir }}/docker.repo"
     state: absent
   when:
-    - ansible_distribution in ["CentOS","RedHat","OracleLinux"]
+    - ansible_os_family == 'RedHat'
     - not is_ostree
 
 - name: Ensure old versions of Docker are not installed. | Debian
diff --git a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
index 594d7e459b76b7a6afa87a27da0a24793c7eaeaa..5c041b8de76c6557080ed599aa5d0875f9390f37 100644
--- a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
+++ b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
@@ -24,8 +24,8 @@
 
 - name: Stop if unknown OS
   assert:
-    that: ansible_os_family in ['RedHat', 'CentOS', 'Fedora', 'Ubuntu', 'Debian', 'Flatcar Container Linux by Kinvolk', 'Suse', 'ClearLinux', 'OracleLinux']
-    msg: "{{ ansible_os_family }} is not a known OS"
+    that: ansible_distribution in ['RedHat', 'CentOS', 'Fedora', 'Ubuntu', 'Debian', 'Flatcar Container Linux by Kinvolk', 'Suse', 'ClearLinux', 'OracleLinux', 'AlmaLinux']
+    msg: "{{ ansible_distribution }} is not a known OS"
   when: not ignore_assert_errors
 
 - name: Stop if unknown network plugin
diff --git a/roles/kubernetes/preinstall/tasks/0070-system-packages.yml b/roles/kubernetes/preinstall/tasks/0070-system-packages.yml
index c35cc0b0585ef21a453d7e8806fa41b51feeaa13..ec77ade5986cb2056ad78605b428ab9c9df32d17 100644
--- a/roles/kubernetes/preinstall/tasks/0070-system-packages.yml
+++ b/roles/kubernetes/preinstall/tasks/0070-system-packages.yml
@@ -22,7 +22,7 @@
     path: "{{ yum_repo_dir }}/docker.repo"
     state: absent
   when:
-    - ansible_distribution in ["CentOS","RedHat","OracleLinux"]
+    - ansible_os_family == "RedHat"
     - not is_fedora_coreos
 
 - name: Install python3-dnf for latest RedHat versions
@@ -39,12 +39,12 @@
   tags:
     - bootstrap-os
 
-- name: Install epel-release on RedHat/CentOS
+- name: Install epel-release on RHEL derivatives
   package:
     name: epel-release
     state: present
   when:
-    - ansible_distribution in ["CentOS","RedHat"]
+    - ansible_os_family == "RedHat"
     - not is_fedora_coreos
     - epel_enabled|bool
   tags:
diff --git a/roles/kubernetes/preinstall/tasks/main.yml b/roles/kubernetes/preinstall/tasks/main.yml
index 2a3418b0ea199700778d89cfcce055af94679da0..3d345122179e238b23866600156d7f81d0613492 100644
--- a/roles/kubernetes/preinstall/tasks/main.yml
+++ b/roles/kubernetes/preinstall/tasks/main.yml
@@ -109,6 +109,6 @@
   when:
     - not dns_late
     - azure_check.stat.exists
-    - ansible_distribution in ["CentOS","RedHat","OracleLinux"]
+    - ansible_os_family == "RedHat"
   tags:
     - bootstrap-os
diff --git a/roles/network_plugin/macvlan/tasks/main.yml b/roles/network_plugin/macvlan/tasks/main.yml
index 191df8ceff0e7e3068a57631ccc5fa0599ce343b..a3364935e5b8880f05df6afbad4bf5b389f54032 100644
--- a/roles/network_plugin/macvlan/tasks/main.yml
+++ b/roles/network_plugin/macvlan/tasks/main.yml
@@ -35,7 +35,7 @@
     mode: "0755"
   with_fileglob:
     - files/*
-  when: ansible_os_family in ["CentOS","RedHat"]
+  when: ansible_os_family == "RedHat"
 
 - name: Macvlan | Install post-up script on centos
   copy:
@@ -44,7 +44,7 @@
     owner: root
     group: root
     mode: "0755"
-  when: ansible_os_family in ["CentOS","RedHat"] and enable_nat_default_gateway
+  when: ansible_os_family == "RedHat" and enable_nat_default_gateway
 
 - name: Macvlan | Install network gateway interface on centos
   template:
@@ -55,7 +55,7 @@
     - {src: centos-routes-macvlan.cfg, dst: route-mac0 }
     - {src: centos-postup-macvlan.cfg, dst: post-up-mac0 }
   notify: Macvlan | restart network
-  when: ansible_os_family in ["CentOS","RedHat"]
+  when: ansible_os_family == "RedHat"
 
 - name: Macvlan | Install service nat via gateway on Flatcar Container Linux
   template: