Ansible Development Tools (ADT): one install, and the Python version decides what you get
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
- A container engine. ansible-navigator runs playbooks inside an EE by default. With no Podman on the machine,
ansible-navigator run --ce podmanstops with "The specified container engine could not be found: 'podman'". Install Podman or Docker separately, or pass--ee falseto use the venv's own ansible-core. - An activated venv for
--ee false. Navigator then looks foransible-playbookonPATH. It failed until the venv'sbin/was onPATH, and ran once it was. - Collections. ADT ships ansible-core, not the
ansiblepackage's collections.adeoransible-galaxyinstalls them.
The adt command itself has one subcommand, adt server, which its help describes as starting "the Ansible Devtools server" on port 8000.
Sources
- Alex Dworjan, Ansible Developer Environment Updates (2024-05), and his Dev Spaces Containerfile.
- ADT documentation, and the
ansible-dev-tools26.9.0 metadata on PyPI (requires_python,requires_dist). - Red Hat AAP 2.5 docs, Installing Ansible development tools (the
dnfcommands). - ansible-core support dates: Ansible's release and maintenance page.
- Tested with uv 0.12.20:
adt --version, the per-Python resolutions, the navigator runs, andadt server --help.
Created 2026-09-29T23:34:29+02:00 · Edit