Skip to main content

Ansible collection carlijoy.compat — backport of ansible.builtin.dnf for EL8 + ansible-core >= 2.17 via /usr/libexec/platform-python

Project description

ansible-el-compat

Ansible collection carlijoy.compat — backport of ansible.builtin modules for EL8 + ansible-core >= 2.17.

The problem

ansible-core >= 2.17 ships module code that uses from __future__ import annotations, requiring Python 3.10+ on managed hosts. On AlmaLinux / Rocky Linux / RHEL 8, python3-dnf is only available for Python 3.6 and 3.9 — so ansible.builtin.dnf fails with a modern ansible-core.

The solution

This collection backports ansible.builtin.dnf to EL8 by shipping a pre-built binary module that is the original ansible.builtin.dnf from ansible-core 2.15 (the last release that fully supported EL8), bundled together with all of its ansible.module_utils.* dependencies into a self-executing zip archive.

The bundle carries a #!/usr/libexec/platform-python shebang. Ansible detects it as a binary module, copies it to the managed host, and runs it directly — without the ansiballz wrapper — under /usr/libexec/platform-python, the EL8 system Python that has python3-dnf available. The result is 100% feature parity with ansible.builtin.dnf on EL8 targets, regardless of which Python interpreter drives ansible-core on the controller.

The bundle is regenerated by build-script/build_dnf_bundle.py (uses uv run with ansible-core 2.15 pinned via inline script metadata).

Installation

via pip / uv (recommended)

pip install ansible-el-compat
# or
uv pip install ansible-el-compat

No ansible-galaxy required — the collection is discovered automatically from site-packages/ansible_collections/.

via ansible-galaxy

ansible-galaxy collection install carlijoy.compat

Modules

carlijoy.compat.dnf

Backport of ansible.builtin.dnf for EL8. Accepts the same parameters as ansible.builtin.dnf — it is that module, just packaged to run under the right Python interpreter.

Common options

Option Type Default Description
name str or list required Package name(s), version constraints supported
state str present present, absent, or latest
enablerepo list [] Repos to enable for this transaction only
disablerepo list [] Repos to disable for this transaction only
disable_gpg_check bool false Pass --nogpgcheck to dnf
update_cache bool false Run dnf makecache before the transaction

Examples

- name: Install a package
  carlijoy.compat.dnf:
    name: htop
    state: present

- name: Install multiple packages
  carlijoy.compat.dnf:
    name:
      - htop
      - curl
    state: present

- name: Remove a package
  carlijoy.compat.dnf:
    name: telnet
    state: absent

- name: Install from a specific repo only
  carlijoy.compat.dnf:
    name: rabbitmq-server <= 4
    disablerepo: '*'
    enablerepo: rabbitmq
    state: present

- name: Upgrade, refreshing cache first
  carlijoy.compat.dnf:
    name: openssl
    state: latest
    update_cache: true

Migrating from ansible.builtin.dnf

# Before
- ansible.builtin.dnf:
    name: httpd
    state: present

# After
- carlijoy.compat.dnf:
    name: httpd
    state: present

For persistent repo enable/disable (not per-transaction), continue using community.general.dnf_config_manager.

Development

git clone https://github.com/CarliJoy/ansible-el-compat
cd ansible-el-compat
uv sync --group dev
uv run prek install          # install git hooks
uv run prek run --all-files  # lint + type check
uv run pytest tests/ -v      # integration tests (requires Docker)

Tests use testcontainers to spin up a real AlmaLinux 8 container with SSH and Python 3.12, then run Ansible against it. Docker must be available on the test host.

Rebuilding the backported bundle

uv run build-script/build_dnf_bundle.py

This downloads ansible-core 2.15 into an isolated environment (via the inline uv script metadata), extracts ansible/modules/dnf.py and all transitive ansible/module_utils/ dependencies, and writes the self-executing zip to src/ansible_collections/carlijoy/compat/plugins/modules/dnf.

Attribution & Bundled Components

This collection bundles the original ansible.builtin.dnf module from ansible-core 2.15, written by the Ansible project contributors. The bundle is not a fork or reimplementation — it is that exact module, unchanged, just repackaged to run under the EL8 system Python interpreter that has access to python3-dnf. All credit for the actual dnf functionality belongs to the original authors.

Why the module is bundled

ansible-core 2.17 introduced from __future__ import annotations across its module code, which requires Python 3.10+ on managed hosts. On EL8 targets, python3-dnf is only available for Python 3.6 and 3.9, so ansible.builtin.dnf started failing. This collection solves that by bundling the last ansible-core version (2.15) that fully supports EL8 and shipping it as a binary module with a #!/usr/libexec/platform-python shebang that bypasses the controller's Python choice entirely.

Links to the original source

Thank you to the Ansible project and all Red Hat contributors for the work that makes this compatibility shim possible. See the NOTICE file in this repository for the complete attribution and license notices for every bundled file.

License

GPL-3.0-or-later

The backported module bundle contains code from ansible-core, which is licensed under the GNU General Public License v3.0 or later. This collection is therefore also distributed under GPL-3.0-or-later.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ansible_el_compat-0.1.4.tar.gz (259.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ansible_el_compat-0.1.4-py3-none-any.whl (167.9 kB view details)

Uploaded Python 3

File details

Details for the file ansible_el_compat-0.1.4.tar.gz.

File metadata

  • Download URL: ansible_el_compat-0.1.4.tar.gz
  • Upload date:
  • Size: 259.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ansible_el_compat-0.1.4.tar.gz
Algorithm Hash digest
SHA256 bfe5c9bc09d5e92c0491b0316cf14ec79c229fe248eafc209fa2f63c1db31b78
MD5 d96b430da5a6ba0797d0c4a5274cff11
BLAKE2b-256 a4ebf1d21d0b524121e79792201e12bf925ea93c00aad3e0b32ca63b92e4397a

See more details on using hashes here.

File details

Details for the file ansible_el_compat-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: ansible_el_compat-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 167.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ansible_el_compat-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 a2dfd452ad3abb770b39758ccc0ef68d95c5fae6710ec026d7ca3a936670c4b7
MD5 23cc1bfb44f108e6d6812c1a97dd6a94
BLAKE2b-256 96eac62596a154c400eb31902ec29e220bb5a49de7bd977914350ecda0366196

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page