pythondockeransiblemolecule

ansible molecule "python not found"


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 found\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127}}, "msg": "The following modules failed to execute: ansible.legacy.setup\n"}

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?


Solution

  • 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.