Introduction
Ansible modules execute on remote hosts using Python. When Ansible can't find the right Python interpreter, you get discovery warnings, module failures, or wrong-version errors. This guide covers how Ansible discovers Python, how to configure it explicitly, and how to fix the most common interpreter problems.
The Warning
[WARNING]: Platform linux on host webserver01 is using the discovered Python
interpreter at /usr/bin/python3.9, but future installation of another Python
interpreter could change the meaning of that path. See
https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html
How Ansible Discovers Python
Ansible tries interpreters in this order on the remote host:
1. ansible_python_interpreter (if explicitly set)
2. Python discovery (auto mode):
- /usr/bin/python3
- /usr/bin/python
- /usr/libexec/platform-python (RHEL 8)
- /usr/bin/python3.x (version-specific)
Fix: Set interpreter_python in ansible.cfg
# ansible.cfg
[defaults]
# Suppress discovery warnings globally
interpreter_python = auto_silent
# Or force a specific version
# interpreter_python = /usr/bin/python3
Options
| Value | Behavior |
|---|---|
auto | Discover + show warning |
auto_silent | Discover, no warning |
auto_legacy | Old behavior (Python 2 preferred) |
/usr/bin/python3 | Explicit path, no discovery |
Fix: Per-Host Configuration
# inventory/hosts
[webservers]
web01 ansible_python_interpreter=/usr/bin/python3.11
web02 ansible_python_interpreter=/usr/bin/python3.12
[rhel8]
rhel8-host ansible_python_interpreter=/usr/libexec/platform-python
[ubuntu]
ubuntu-host ansible_python_interpreter=/usr/bin/python3
Fix: Group Variables
# group_vars/rhel8.yml
ansible_python_interpreter: /usr/libexec/platform-python
# group_vars/debian.yml
ansible_python_interpreter: /usr/bin/python3
# group_vars/all.yml (safest default)
ansible_python_interpreter: auto_silent
Common Scenarios
RHEL 8/9 — Platform Python
# RHEL 8 uses platform-python (not in PATH)
ansible_python_interpreter: /usr/libexec/platform-python
# RHEL 9 has standard python3
ansible_python_interpreter: /usr/bin/python3
Ubuntu — Multiple Python Versions
# Check what's available
ansible webserver -m raw -a "ls -la /usr/bin/python*"
# Set the right one
ansible_python_interpreter: /usr/bin/python3.12
Containers — Minimal Images
# Alpine containers
ansible_python_interpreter: /usr/bin/python3
# If no Python installed:
- name: Install Python (bootstrap)
ansible.builtin.raw: apk add python3
become: true
# Or use raw module for Python-less hosts
- name: Run without Python
ansible.builtin.raw: uname -a
Windows — No Python Interpreter Needed
# Windows uses PowerShell, not Python
# Don't set ansible_python_interpreter for Windows hosts
# Instead, set connection plugin:
ansible_connection: winrm
ansible_shell_type: powershell
Debugging Interpreter Issues
# Show which interpreter Ansible will use
ansible webserver -m setup -a "filter=ansible_python*"
# Verbose output shows discovery
ansible webserver -m ping -vvv 2>&1 | grep -i python
# Test specific interpreter
ansible webserver -m raw -a "/usr/bin/python3.12 --version"
# List all available Pythons on remote
ansible webserver -m raw -a "find /usr/bin -name 'python*' -type f"
Playbook-Level Override
---
- name: Deploy to mixed environment
hosts: all
vars:
ansible_python_interpreter: auto_silent
tasks:
- name: Gather facts
ansible.builtin.setup:
vars:
# Override per-task if needed
ansible_python_interpreter: /usr/bin/python3.11
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
MODULE FAILURE: No module named | Wrong Python version for module dependencies | Set interpreter to Python with required packages |
/usr/bin/python: not found | Python 2 removed, Ansible defaulting to old path | Set interpreter_python = auto_silent |
platform-python not found | Not RHEL 8, or minimal install | Install python3 or set correct path |
| JSON decode errors | Interpreter exists but wrong architecture | Verify interpreter matches OS architecture |
ansible.builtin.setup fails | Python on remote missing required modules | Install python3-apt (Debian) or python3-dnf (RHEL) |
Best Practices
- Use
auto_silentglobally — suppresses noise without breaking anything - Set per-group for mixed environments —
group_vars/rhel8.yml,group_vars/ubuntu.yml - Don't hardcode versions in playbooks — use inventory/group_vars instead
- Bootstrap Python first — use
rawmodule for hosts without Python - Match module dependencies — if a module needs
python3-psycopg2, ensure the interpreter has access to it - Document interpreter requirements — especially for RHEL platform-python
Conclusion
Set interpreter_python = auto_silent in ansible.cfg to eliminate discovery warnings. For RHEL 8, use /usr/libexec/platform-python. For mixed environments, configure per-group in group_vars/. When modules fail with import errors, verify the interpreter has the required Python packages installed. Use ansible -m raw to bootstrap Python on minimal hosts.