what determines which version of ansible is invoked when running ansible

hi

I have 2 versions of ansible installed on my Mac.(it was not intentional)

One version was not installed through pip and the other version was installed through pip.

I had to manually fix some permissions issues and now that those are addressed my terminal (VSCode) invokes the older version rather than the newer version.

What determines which version is run when there are multiple versions on a computer?
(from what I have read, pip does not install an ansible.cfg file and I don’t know if that is where the setting is)

I thought it might be the $PATH in the terminal but the path includes both versions.

this is the version ansible 3.7.9(core 2.11.12). This was not installed through pip

% ansible --version

[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current

version: 3.7.9 (v3.7.9:13c94747c7, Aug 15 2020, 01:31:08) [Clang 6.0 (clang-600.0.57)]. This feature will be removed

from ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in

ansible.cfg.

ansible [core 2.11.12]

config file = None

configured module search path = [‘/Users/davemastropolo/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]

ansible python module location = /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ansible

ansible collection location = /Users/davemastropolo/.ansible/collections:/usr/share/ansible/collections

executable location = /Library/Frameworks/Python.framework/Versions/3.7/bin//ansible

python version = 3.7.9 (v3.7.9:13c94747c7, Aug 15 2020, 01:31:08) [Clang 6.0 (clang-600.0.57)]

jinja version = 3.1.2

libyaml = True

this (below) is the newer version installed through pip:

this was invoked through the terminal prior to fixing the permission issue on one of the directories (it was invoked but failing due to the permission issue)

Once the permission issue was addressed, ansible now invokes the older version (above)

% python3 -m pip list
Package Version


ansible 8.2.0
ansible-core 2.15.2
certifi 2023.5.7
cffi 1.15.1
cryptography 41.0.3
Jinja2 3.1.2
MarkupSafe 2.1.3
packaging 23.1
pip 23.1.2
pycparser 2.21
PyYAML 6.0.1
resolvelib 1.0.1
setuptools 65.5.0

warm regards

Dave

It’ll be whichever installed ansible is first in your PATH and is executable.

Here’s a simple example:

$ echo $PATH
/usr/local/bin:/usr/bin

$ ll /usr/local/bin/wtf /usr/bin/wtf
-rwxr-xr-x 1 root root 35 Aug 9 23:48 /usr/bin/wtf*
-rwxr-xr-x 1 root root 41 Aug 9 23:48 /usr/local/bin/wtf*

$ cat /usr/local/bin/wtf /usr/bin/wtf
#!/bin/sh
echo We are in: /usr/local/bin

$ cat /usr/bin/wtf
#!/bin/sh
echo We are in: /usr/bin

$ wtf
We are in: /usr/local/bin

Swap the order in the PATH:

$ export PATH=/usr/bin:/usr/local/bin
$ wtf
We are in: /usr/bin

Make the closest script non-executable:

$ sudo chmod -x /usr/bin/wtf
$ wtf
We are in: /usr/local/bin

If you’re pip-installing things ideally you want to do that in a Python virtual environment (venv) so you don’t trample over system Python modules. Bonus of using venv is then when you toggle that venv ‘on’ the version executed is largely taken care of for you.

See https://www.redhat.com/sysadmin/python-venv-ansible, https://www.cbtnuggets.com/blog/technology/devops/how-to-install-ansible-in-a-python-virtual-environment or many of the other how-tos for references.

Thanks Will

I found the binary for the pip installed latest version of ansible.
It seems to finally work fine

It is located here:

/Users/xxxxx/Library/Python/3.11/bin

% ./ansible --version
ansible [core 2.15.2]
config file = None
configured module search path = [‘/Users/xxxxxx/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]
ansible python module location = /Users/xxxxxx/Library/Python/3.11/lib/python/site-packages/ansible
ansible collection location = /Users/xxxxxx/.ansible/collections:/usr/share/ansible/collections
executable location = ./ansible
python version = 3.11.4 (v3.11.4:d2340ef257, Jun 6 2023, 19:15:51) [Clang 13.0.0 (clang-1300.0.29.30)] (/Library/Frameworks/Python.framework/Versions/3.11/bin/python3)
jinja version = 3.1.2
libyaml = True

My PATH is missing this directory

For VSCode terminal how can I add this to the beginning of my PATH. I can leave the older version on ansible in the PATH if I prepend this /Users/xxxxx/Library/Python/3.11/bin path to the beginning so that I don’t need to make a lot of modifications.

I ask because I don’t understand the docs explaining how to add to the PATH in VSCode. (they modify the JSON config file)

As you can see I have a lot of repetition in the PATH as well. I don’t know how that happened.

Here is my current PATH

/Users/xxxxx/google-cloud-sdk/bin:/Library/Frameworks/Python.framework/Versions/3.11/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Python.framework/Versions/3.7/bin/:/Users/xxxxx/google-cloud-sdk/bin:/Library/Frameworks/Python.framework/Versions/3.11/bin:/usr/local/sbin

warm regards

Dave

I don’t have a Mac handy but your default shell is probably zsh. Outside of Vscode, zsh will setup the PATH based on the following startup files: https://zsh.sourceforge.io/Intro/intro_3.html

Check which of those files exist in /Users/xxxxxx/ and contains logic to set your PATH. If you add something like:

export PATH=/Users/xxxxx/Library/Python/3.11/bin:$PATH

… toward the end of one of the right one of those init files (almost certainly one of $ZDOTDIR/.zshenv, $ZDOTDIR/.zprofile, $ZDOTDIR/.zshrc) that’ll prepend /Users/xxxxx/Library/Python/3.11/bin to the front of your PATH. VScode will probably then pick that up if you close and restart the integrated terminal.

You may need to figure out the order of execution in order to get your PATH set correctly. No guarantees this won’t break other Python-related things and as stated previously, you should really be using the system Python in an unadulterated state, then using Python venvs to localise stuff and then you just activate the venv you need, when you need it.

Personally I would recommend getting this working in an isolated environment (a VM or Mac ec2 instance, whatever else you can rustle up) first. Understand the moving parts, then configure your environment for your needs cleanly.

Thanks Will

Yes it is using zsh (in the VSCode). The VSCode has a few extra items in the path in addition to the Mac Terminal but these are repeats.

I agree that just adding that to the front of the path is too risky.
I know there’s other stuff that is using the older python.
I will set up an EC2 Mac instance and understand how this works.

For now since this is a development/test environment I will simply set the path per terminal(s) when I need to invoke ansible using

% export PATH=/Users/xxxxxx/Library/Python/3.11/bin:$PATH

This seems to work ok

I also don’t think using the older version of ansible will be that detrimental to what I am running locally.

I will leave the current PATH in the .zprofile and .zshrc as is until I work this out on the EC2 instance…

many thanks for your help

warm regards

Dave