ansible molecule "python not found"

Question:

I have some ansible roles and I would like to use molecule testing with them.

When I execute command molecule init scenario -r get_files_uid -d docker I get the following file structure

get_files_uid
├── molecule
│   └── default
│       ├── converge.yml
│       ├── molecule.yml
│       └── verify.yml
├── tasks
│   └── main.yml
└── vars
    └── main.yml

After that, I execute molecule test and I receive the following error:

PLAY [Converge] ****************************************************************

TASK [Gathering Facts] *********************************************************
fatal: [instance]: FAILED! => {"ansible_facts": {}, "changed": false, "failed_modules": {"ansible.legacy.setup": {"failed": true, "module_stderr": "/bin/sh: python: command not foundn", "module_stdout": "", "msg": "MODULE FAILUREnSee stdout/stderr for the exact error", "rc": 127}}, "msg": "The following modules failed to execute: ansible.legacy.setupn"}

PLAY RECAP *********************************************************************
instance                   : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

My ansible.cfg looks like this:

[defaults]
roles_path = roles
ansible_python_interpreter = /usr/bin/python3

And I use MacOS with Ansible

ansible [core 2.13.3]
  config file = None
  configured module search path = ['/Users/scherevko/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/homebrew/Cellar/ansible/6.3.0/libexec/lib/python3.10/site-packages/ansible
  ansible collection location = /Users/scherevko/.ansible/collections:/usr/share/ansible/collections
  executable location = /opt/homebrew/bin/ansible
  python version = 3.10.6 (main, Aug 11 2022, 13:36:31) [Clang 13.1.6 (clang-1316.0.21.2.5)]
  jinja version = 3.1.2
  libyaml = True

molecule version:

molecule 4.0.1 using python 3.10 
    ansible:2.13.3
    delegated:4.0.1 from molecule
    docker:2.0.0 from molecule_docker requiring collections: community.docker>=3.0.0-a2
    podman:2.0.2 from molecule_podman requiring collections: containers.podman>=1.7.0 ansible.posix>=1.3.0

When I run molecule --debug test I see

ANSIBLE_PYTHON_INTERPRETER: python not found

How to fix that?

Asked By: Sergei Cherevko

||

Answers:

The default scaffold for role molecule role initialization uses quay.io/centos/centos:stream8 as the test instance image (see molecule/default/molecule.yml)

This image does not have any /usr/bin/python3 file available:

$ docker run -it --rm quay.io/centos/centos:stream8 ls -l /usr/bin/python3
ls: cannot access '/usr/bin/python3': No such file or directory

If you let ansible discover the available python by itself, you’ll see that the interpreter actually found is /usr/libexec/platform-python like in the following demo (no ansible.cfg in use):

$ docker run -d --rm --name instance quay.io/centos/centos:stream8 tail -f /dev/null
2136ad2e8b91f73d21550b2403a6b37f152a96c2373fcb5eb0491a323b0ed093

$ ansible instance -i instance, -e ansible_connection=docker -m setup | grep discovered
        "discovered_interpreter_python": "/usr/libexec/platform-python",

$ docker stop instance 
instance

Since your ansible.cfg only contains a default value for role path besides that wrong python interpreter path, I suggest you simply remove that file which will fix your problem. At the very least, remove the line defining ansible_python_interpreter to use default settings.

Note that you should also make sure that ANSIBLE_PYTHON_INTERPRETER is not set as a variable in your current shell (and remove that definition from whatever shell init file if it is the case).

Hardcoding the path of the python interpreter should anyway be your very last solution in very few edge cases.

Answered By: Zeitounator
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.