← All TILs · ansible

Ansible Development Tools (ADT): one install, and the Python version decides what you get

ansible - 2026-09-29

Fifth entry in the Ansible development environment series. Part 4 chose where the tools run; this one is about the tools themselves. ADT (Ansible Development Tools) is the PyPI package ansible-dev-tools. It's a meta-package: its own code is little more than an adt command, and its job is to depend on the rest of the toolchain, so one install brings all of it. Alex Dworjan introduced it in May 2024 as the one install every environment should start from.

What's in it

adt --version lists the tools. With ADT 26.9.0 on Python 3.13, on 2026-09-29:

Tool Version What it does
ansible-core 2.21.4 The engine: ansible-playbook, ansible-galaxy, ansible-doc
ansible-navigator 26.9.0 Runs playbooks, by default inside an execution environment (EE); also a text UI for browsing results and docs
ansible-builder 3.1.1 Builds EEs (part 3)
ansible-creator 26.9.0 Scaffolds playbook projects, collections and EE projects
ansible-dev-environment (ade) 26.9.0 Creates a venv and installs collections with their Python dependencies
ansible-lint 26.9.0 Checks playbooks and roles against best-practice rules
molecule 26.9.0 Tests roles and collections against real targets, such as containers
ansible-sign 0.1.6 Signs a project's files with GPG so automation controller can verify them
pytest-ansible, tox-ansible 26.9.0 Run a collection's tests under pytest, and across Python and ansible-core versions with tox

The install pulled in 69 packages in total.

Three ways to install it

From PyPI, in a venv. A venv is a directory with its own Python and packages (part 1 compares the options). With uv:

uv venv --python 3.13 .venv
uv pip install ansible-dev-tools

python3.13 -m venv .venv followed by .venv/bin/pip install ansible-dev-tools does the same with plain pip.

As a container image. ghcr.io/ansible/community-ansible-dev-tools has ADT preinstalled, plus Podman for running EEs inside it. Part 4 ran one as a Dev Container.

As an RPM, with an AAP subscription. Red Hat's AAP documentation installs it from the platform's repository, for example on RHEL 9:

sudo dnf install --enablerepo=ansible-automation-platform-2.5-for-rhel-9-x86_64-rpms ansible-dev-tools

The RPMs follow the versions Red Hat supports for that AAP release, not the latest on PyPI.

The Python you install with decides the ansible-core you get

ADT 26.9.0 declares requires-python >=3.11. But each ansible-core release has its own Python range (part 2 has the table), and pip quietly picks the newest release that fits. Resolving ansible-dev-tools with uv pip compile --python-version for each interpreter:

Python ADT resolved ansible-core resolved ansible-core status
3.9 none: "No solution found" none —
3.10 25.10.0 2.16.19 end of life since July 2025
3.11 26.9.0 2.19.13 end of life in November 2026
3.12, 3.13, 3.14 26.9.0 2.21.4 current

Two of these rows install without a single warning: - Python 3.10 falls back to an older ADT, 25.10.0, and to ansible-core 2.16. 2.17 would also support 3.10, but ansible-lint and Molecule both declare ansible-core!=2.17.*, and 2.18 and later need Python 3.11. - Python 3.11 gets the current ADT, but ansible-core stops at 2.19, because 2.20 and 2.21 need Python 3.12.

This bites on RHEL, whose system python3 is 3.9 on RHEL 9. Dworjan's own Dev Spaces image installs ADT with pip-3.11, so rebuilt today it would get ansible-core 2.19. Install with Python 3.12 or later. This site's uv entry gets one on RHEL without touching the system Python.

ADT sets floors, not pins

Every dependency of ADT is a lower bound: ansible-lint>=26.4.0, ansible-navigator>=26.1.3, molecule>=26.3.0, and so on. Installing ansible-dev-tools==26.9.0 next month can bring newer tools than the table above. To make two machines match, lock the environment as in part 2: compile ansible-dev-tools==26.9.0 into a lock file, which here held 69 pinned packages.

What it doesn't include

The adt command itself has one subcommand, adt server, which its help describes as starting "the Ansible Devtools server" on port 8000.

Sources

Created 2026-09-29T23:34:29+02:00 · Edit