/ python

virtualenv - Inversion n°42 du génome

"ça marche pas". T'utilises la bonne version d'Ansible ? "la quoi ? non mais ça vient du playbook". Ah ok, tout va bien alors.

Dans le premier article de découverte d'Ansible je vous conseillai d'utiliser la dernière version stable disponible. Pour de multiples raisons nous ne pouvons ou ne voulons pas revenir sur de vieux playbooks ou rôles pour les rendre compatibles (dans l'immédiat) avec la dernière version d'Ansible mais, on veut quand même pouvoir déployer nos nouveaux playbooks avec la dernière version... m'voyez ?

Et c'est donc ici qu'intervient virtualenv, qui permet d'avoir un environnement python virtuel isolé comme son nom l'indique, et ainsi avoir des versions différentes de python et de modules python par environnement.

Je vais vous présenter virtualenv pour une utilisation autour d'Ansible, mais l'utilisation de virtualenv s'applique de manière générale à l'utilisation de python et de projets en python.

content_post_image
Photo by Pana Vasquez / Unsplash

Installation et création

Commençons par installer virtualenv, le plus simplement avec pip: pip install virtualenv. Puis nous allons créer un environnement virtuel python, que nous allons activer, et dans lequel nous allons installer ansible 2.3.

mkdir -p ~/virtenv/ansible23
virtualenv ~/virtenv/ansible23
source ~/virtenv/ansible23/bin/activate

Nous venons de créer un répertoire qui contiendra notre environnement, puis nous avons créé l'environnement et enfin nous l'avons activé pour pouvoir l'utiliser et y installer des modules.

Il nous reste à installer ansible 2.3, plus précisément c'est ansible 2.3.2.0 que nous allons installer.

pip install ansible==2.3.2.0
ansible --version
noskillbrain_prez_venv  ansible --version
ansible 2.3.2.0
  config file = /home/noskillbrain/.ansible.cfg
  configured module search path = [u'/usr/share/ansible']
  python version = 2.7.14 (default, Sep 23 2017, 22:06:14) [GCC 7.2.0]

Sans spécifier de version c'est la dernière version disponible dans les dépôts qui sera installée. Et c'est tout ! Nous avons un environnement python isolé de notre environnement python système et de nos autres environnements.

Pour sortir d'un virtualenv actif, on utilisera simplement la commande deactivate et vous l'aurez compris, le sourcer à nouveau pour l'utiliser.
Ici on voit bien que lorsqu'on est sortie du venv, on retrouve notre version ansible globale:

noskillbrain_prez_venv  deactivate
noskillbrain_prez_venv  ansible --version
ansible 1.8.4
  configured module search path = /usr/share/ansible

On ne partage pas son venv !

Partager son virtualenv n'est pas à considérer, un virtualenv python est généré pour le système sur lequel il a été crée avec tout un tas de particularités selon la configuration de l'OS/Python etc...

Alors pour recréer un virtualenv avec tous les paquets installés dans celui-ci on va utiliser pip freeze qui va nous générer une liste de paquets à installer.

Ici on génère la liste dans le fichier requirements.txt

pip freeze > requirements.txt

Puis pour installer ces paquets dans un autre environnement virtuel:

pip install -r requirements.txt

virtualenvwrapper

Maintenant que votre raison d'être ne se résume plus qu'aux virtualenv et que vous devez en gérer une multitude, nous allons voir comment gérer plus simplement et rapidement ces derniers. Pour ça il y a un outil dédié: virtualenvwrapper.

content_post_image
Photo by Eugenio Mazzone / Unsplash

Si vous n'avez pas ce paquet, installez le de manière globale (hors d'un venv):

pip install virtualenvwrapper

Nous allons ajouter dans notre .bashrc quelques commandes pour virtualenvwrapper comme indiqué dans la doc officielle, libre à vous de faire un script à exécuter, dans cet exemple les venv seront dans ~/Documents/dev/git/noskillbrain_prez_venv/.virtualenvs. Pensez à re-sourcer votre bashrc.

# virtualenvwrapper
export WORKON_HOME=~/Documents/dev/git/noskillbrain_prez_venv/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true

Maintenant on peut créer notre venv puis l'activer avec workon, et y installer Ansible dans sa dernière version:

mkvirtualenv --no-site-packages venvwrapper_ansible24
workon venvwrapper_ansible24
pip install ansible

On peut voir les paquets présents dans notre venv avec la commande lssitepackages. En utilisant la commande workon sans argument, on peut avoir la liste des venv connus de wrappervirtualenv.

Vous remarquerez, que j'ai utilisé l'option --no-site-packages, ici on indique qu'on ne veut pas importer les paquets présents de notre environnement python global, ce qui est le comportement par défaut. Utile si on veut créer un environnement virtuel minimaliste et contrôlé.

Python 3

Pour python3, ou tout autre version spécifique de python on peut spécifier un interpréteur en définissant la variable VIRTUALENVWRAPPER_PYTHON, comme indiqué dans la doc officielle: http://virtualenvwrapper.readthedocs.io/en/latest/install.html?highlight=python3#python-interpreter-virtualenv-and-path

Sans devoir utiliser wrappervirtualenv, de la même façon que virtualenv, on peut utiliser python3-venv en installant le paquet du même nom et en initialisant notre venv avec l'argument -m venv de python:

noskillbrain_prez_venv  apt install python3-venv
noskillbrain_prez_venv  python3 -m venv venv_python3
noskillbrain_prez_venv  source venv_python3/bin/activate
noskillbrain_prez_venv  pip3 install ansible

content_post_image
Photo by Markus Spiske / Unsplash

On a vu l'utilisation des environnements virtuels sous python, mais cet article ne fait que survoler les possibilités et est suffisant pour une utilisation basique, pour gérer différentes version d'Ansible par exemple, je vous invite à consulter la doc de wrappervirtualenv si vous avez des besoins plus spécifiques.

Vous pouvez formater votre commentaire en utilisant le Markdown