La connexion aux machines distantes se fait généralement en ssh
.
C’est aussi le moyen de connexion qu’utilise Ansible, mais saviez-vous
que d’autres types de connexions sont supportés ? Dans ce tutoriel,
nous verrons comment utiliser une connexion locale à un conteneur
Docker pour vous permettre de tester facilement un rôle Ansible sur
votre machine.
Prérequis
Pour ce tutoriel, il est nécessaire d’avoir installé Ansible ansi que Docker. Rendez-vous sur mon tutoriel d’installation avec Pip pour Ansible. Pour Docker:
Voici comment installer Docker sur Linux avec le script
officiel. Prenez le temps de regarder la source avant d’exécuter le
script téléchargé avec curl
.
# Téléchargement du script d'installation de Docker
curl -fsSL https://get.docker.com -o get-docker.sh
# Execution du script (en tant que root)
sudo sh get-docker.sh
Conteneur Docker Debian compatible avec Ansible
Spécification de l’image Docker
On utilise une image Docker de la distribution Debian pour réaliser nos tests. L’image de base disponible sur le Docker Hub ne contient pas Python 3 dont Ansible a besoin pour exécuter votre rôle.
Pour rendre cette image compatible avec Ansible, on va donc hériter de
l’image Debian de base et installer Python 3. Pour cela, on utilise le
Dockerfile
suivant:
FROM debian:bullseye
RUN apt update && apt install -y python3 python3-pip
CMD tail --follow /dev/null
Astuce: on ajoute également la commande par défaut tail --follow /dev/null
à l’image du conteneur. Cela a pour effet d’attendre
passivement l’insertion de données dans /dev/null
. Comme cet
évènement n’arrive jamais, le conteneur sera toujours en attente
passive.
Contruction de l’image
On va construire l’image décrite dans le Dockerfile
et lui donner un
nom. Assurez-vous d’avoir placé le Dockerfile
dans le dossier
courant de votre shell.
docker build --tag=debian:bullseye-python .
Notre image Docker debian:bullseye-python
est maintenant prête à
l’emploi pour être lancée dans un conteneur qu’on utilisera comme
machine de test pour notre rôle.
Instantiation du conteneur
On lance une instance de l’image précédemment construite
debian:bullseye-python
avec la commande:
docker run --detach --name=conteneur_test debian:bullseye-python
Voilà, notre conteneur nommé conteneur_test
est prêt pour tester
votre rôle Ansible.
Utilisation du conteneur de test pour tester un rôle
Inventaire
On ajoute maintenant notre conteneur de test à l’inventaire
Ansible.
Pour cela, on précise à Ansible qu’il ne devra pas se connecter en ssh
mais en utilisant le démon Docker local. On édite pour cela le fichier
hosts de votre répertoire courant, avec l’option
ansible_connection=docker
qui indique à Ansible qu’il devra se
connecter via Docker.
[serveur_debian_test]
conteneur_test ansible_connection=docker ansible_user=root
J’ai nommé le groupe de serveur serveur_debian_test
pour le
distinguer de vos serveurs réels.
Test du rôle
Pour simplifier, nous allons lancer un module ad-hoc sur notre conteneur de test. Cela équivaut à lancer un rôle sur le conteneur de test.
Testons dans un premier temps que le conteneur de test est bien atteignable par Ansible avec son module ping:
# Test de connectivité via Ansible
ansible --inventory hosts --module-name ping serveur_debian_test
# résultat:
# conteneur_test | SUCCESS => {
# "ansible_facts": {
# "discovered_interpreter_python": "/usr/bin/python3"
# },
# "changed": false,
# "ping": "pong"
# }
Le rôle/module que nous allons maintenant tester est l’installation de
Python3 sur une machine distante. Comme on a déjà installé ce logiciel
sur notre machine de test, le résultat devrait retourner
changed=false
.
# Vérification de l'installation de Python3
ansible --inventory hosts --module-name apt \
--args "name=python3 state=present" \
serveur_debian_test
# résultat:
# conteneur_test | SUCCESS => {
# "ansible_facts": {
# "discovered_interpreter_python": "/usr/bin/python3"
# },
# "cache_update_time": 1640430554,
# "cache_updated": false,
# "changed": false
# }
On obtient bien le résultat attendu du rôle apt
, à savoir que
Python3 est déjà installé (changed=false
).
Bonus: script automatisé
Je mets à disposition un script Bash qui réalise une synthèse de cet article. Ce script permet de vérifier votre installation de Docker, de construire l’image de test et de recréer le conteneur de test si il est déjà lancé.
Conclusion
Vous avez appris à utiliser un conteneur local pour tester vos rôles Ansible en toute simplicité. Cette approche de test est la base de frameworks plus complexes comme Molecule.
Pour industrialiser ce processus de test, retrouvez comment tester vos rôles Ansible avec Molecule.