Gérer les dépendances#
Objectif
Ajouter des dépendances Python et Ansible à un projet.
Prérequis#
Pour que tout se passe comme prévu, vous aurez besoin que soient installés sur votre machine de travail :
Pour notre cas de référence (Debian Bullseye), atteindre ces prérequis passe par le lancement des commandes suivantes :
$ sudo apt update
$ sudo apt install make -y
Échauffement#
Pour éviter des problèmes communs de construction de package Pip, commencez par lancer :
$ pip3 install -U pip wheel setuptools --no-cache-dir
Afin de bien isoler nos dépendances Ansible, il faut rajouter à la configuration commune du projet (dans le .envrc) :
export DIRENV_TMP_DIR="${PWD}/.direnv"
export ANSIBLE_COLLECTIONS_PATHS="${DIRENV_TMP_DIR}"
Et valider la nouvelle version de notre .envrc auprès de direnv avec la commande :
$ direnv allow .
Création d’un fichier de requirements Pip#
Créez un fichier requirements.txt avec notre version préférée d’Ansible pour le projet.
$ echo 'ansible-core==2.12.4' >> requirements.txt
Une fois ceci fait, nous pouvons rapatrier les dépendances listées avec la commande :
$ pip3 install -U --no-cache-dir -r requirements.txt
Collecting ansible-core==2.12.4
Downloading ansible-core-2.12.4.tar.gz (7.8 MB)
|████████████████████████████████| 7.8 MB 5.6 MB/s
[...]
Successfully installed MarkupSafe-2.1.1 PyYAML-6.0 ansible-core-2.12.3 cffi-1.15.0 cryptography-36.0.2 jinja2-3.1.1 packaging-21.3 pycparser-2.21 pyparsing-3.0.7 resolvelib-0.5.4
Création d’un fichier de requirements Ansible Galaxy#
Créez un fichier requirements.yml avec un rôle et une collection tirés de la plateforme centrale Ansible Galaxy :
---
roles:
# Install a role from Ansible Galaxy.
- name: geerlingguy.java
version: 1.9.6
collections:
# Install a collection from Ansible Galaxy.
- name: community.general
version: 4.5.0
Une fois ceci fait, nous pouvons rapatrier les dépendances listées avec la commande :
$ ansible-galaxy install -fr requirements.yml
Starting galaxy role install process
- downloading role 'java', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-java/archive/1.9.6.tar.gz
- extracting geerlingguy.java to /home/user/ansible-workspaces/ultimate/training/roles/geerlingguy.java
- geerlingguy.java (1.9.6) was installed successfully
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/download/community-general-4.5.0.tar.gz to /home/user/.ansible/tmp/ansible-local-22651iywi1i6a/tmp3l1ya7ov/community-general-4.5.0-kwp8buwp
Installing 'community.general:4.5.0' to '/home/user/ansible-workspaces/ultimate/training/.direnv/ansible_collections/community/general'
community.general:4.5.0 was installed successfully
Vous pouvez observer que la collection s’est installée dans un sous-répertoire de .direnv et que le rôle est installè dans votre sous-répertoire roles.
Création d’un Makefile basique pour simplifier la mise à jour des dépendances#
Comme nous sommes des gens d’automatisation, la complexité des commandes précédente sera mieux placée dans un fichier Makefile :
.PHONY: env
env-desc = "Setup local dev env"
env:
@echo "==> $(env-desc)"
@[ -d "${PWD}/.direnv" ] || (echo "Venv not found: ${PWD}/.direnv" && exit 1)
@pip3 install -U pip wheel setuptools --no-cache-dir && \
echo "[ OK ] PIP + WHEEL + SETUPTOOLS" || \
echo "[FAILED] PIP + WHEEL + SETUPTOOLS"
@pip3 install -U --no-cache-dir -r "${PWD}/requirements.txt" && \
echo "[ OK ] PIP REQUIREMENTS" || \
echo "[FAILED] PIP REQUIREMENTS"
@ansible-galaxy install -fr "${PWD}/requirements.yml" && \
echo "[ OK ] ANSIBLE-GALAXY REQUIREMENTS" || \
echo "[FAILED] ANSIBLE-GALAXY REQUIREMENTS"
Vous pouvez relancer la procédure complète de rapatriement des dépendances avec la commande :
$ make env
Ligne d’arrivée#
Félicitations, vous avez maintenant l’expérience de la gestion des dépendances Python et Ansible, ce qui vous servira à coup sûr dans vos futurs projets. Vous avez également complété les exercices qui vous permettent de poser des bases saines pour tout projet Ansible.