Installing Ansible with Python¶
In posts Installing Ansible on Ubuntu 22.04 and Installing Ansible on Debian 12 Ansible was installed via the package manager. Another option is to install Ansible with Python in a virtual environment so you can have multiple Ansible versions installed on the same machine.
Using Python virtual environment¶
Since Ansible is written in Python, it can be installed in a Python virtual environment which is a self-contained directory tree that contains a Python installation for a particular version of Python, plus a number of additional packages. The virtual environment can be created with the venv module, which is part of the Python since version 3.4.
Let’s create a new directory for our Ansible project and create a virtual environment in it.
$ mkdir ansible-project
$ cd ansible-project
$ python3 -m venv venv
Now we can activate the virtual environment and install Ansible with pip.
$ source venv/bin/activate
$ pip install ansible
If we want to install a specific version of Ansible, we can do it like in the example below.
$ source venv/bin/activate
$ pip install ansible==2.15.1
After the installation is complete, we can check the Ansible version with the ansible --version command.
$ ansible --version
ansible [core 2.15.1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/sysadmin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/sysadmin/ansible-project/venv/lib/python3.11/site-packages/ansible
ansible collection location = /home/sysadmin/.ansible/collections:/usr/share/ansible/collections
executable location = /home/sysadmin/ansible-project/venv/bin/ansible
python version = 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] (/home/sysadmin/ansible-project/venv/bin/python)
jinja version = 3.1.2
libyaml = True
Using pipenv to manage virtual environment¶
Other option to manage virtual environment is to use pipenv. Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your Pipfile as you install/uninstall packages. It also generates the ever-important Pipfile.lock, which is used to produce deterministic builds.
$ mkdir ansible-project
$ cd ansible-project
$ pipenv --python 3
$ pipenv install ansible
Ansible can be installed in a specific virtual environment with the --python option. In the example above, we installed Ansible in a virtual environment with Python version 3.11.2. After the installation is complete, we can check the Ansible version with the ansible --version command.
$ pipenv shell
$ ansible --version
ansible [core 2.15.1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/sysadmin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/sysadmin/.local/share/virtualenvs/ansible-project-3Z1Z2Z2z/lib/python3.11/site-packages/ansible
ansible collection location = /home/sysadmin/.ansible/collections:/usr/share/ansible/collections
executable location = /home/sysadmin/.local/share/virtualenvs/ansible-project-3Z1Z2Z2z/bin/ansible
python version = 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] (/home/sysadmin/.local/share/virtualenvs/ansible-project-3Z1Z2Z2z/bin/python)
jinja version = 3.1.2
libyaml = True
Using poetry to manage virtual environment¶
Another option to manage virtual environment is to use poetry. Poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
$ mkdir ansible-project
$ cd ansible-project
$ poetry init
$ poetry add ansible
With Poetry, we can install Ansible in a virtual environment with the poetry add command. After the installation is complete, we can check the Ansible version with the ansible --version command.
$ poetry shell
$ ansible --version
ansible [core 2.15.1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/sysadmin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/sysadmin/.cache/pypoetry/virtualenvs/ansible-project-3Z1Z2Z2z-py3.11/lib/python3.11/site-packages/ansible
ansible collection location = /home/sysadmin/.ansible/collections:/usr/share/ansible/collections
executable location = /home/sysadmin/.cache/pypoetry/virtualenvs/ansible-project-3Z1Z2Z2z-py3.11/bin/ansible
python version = 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] (/home/sysadmin/.cache/pypoetry/virtualenvs/ansible-project-3Z1Z2Z2z-py3.11/bin/python)
jinja version = 3.1.2
libyaml = True