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.

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.2.tar.gz (243.8 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.2-py3-none-any.whl (141.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ansible_el_compat-0.1.2.tar.gz
  • Upload date:
  • Size: 243.8 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.2.tar.gz
Algorithm Hash digest
SHA256 49633403ea68024cc1332ff26f04804f9c02b68e0b87fc497150830a798d7cde
MD5 09461631f1abcca042fb4e34dc93b390
BLAKE2b-256 996d6e19ccc8df399ba982843b124633a8fd8beafc40fd4a42a7fea10f843301

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ansible_el_compat-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 141.5 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ffe7031de26265db17c7716aa232541707286d91f5779a4d45ff54626502dc78
MD5 10db60d6089cb1cb30aa43dde9555110
BLAKE2b-256 bb13395ce13d8df2db435da685691b13016f373a18f1e32465300eb66eb2c1ef

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