Podman sous WSL pour tester du code Ansible
Changement de mission donc changement de contexte. Je suis désormais contraint à utiliser wsl sur mon poste de travail et j’ai ainsi cherché à optimiser son utilisation pour développer des rôles Ansible. Autre contrainte ne pas utiliser Docker Desktop, heureusement, il est possible d’installer podman
Introduction
Maintenant que le contexte est posé je vais vous expliquer comment installer podman sur wsl2, puis le configurer pour l’utiliser pour développer mes rôles et playbooks Ansible. Je compte utiliser aussi les environnements d’exécution d’Ansible.
Pourquoi utiliser les environnements d’exécution ? Pour éviter de devoir installer pour chaque projet toutes ses dépendances. En effet, un environnement d’exécution Ansible embarque tout ce qu’il faut pour exécuter un playbook et ses dépendances dans son contexte. Il permet ainsi de définir la version de python, la version d’ansible ainsi que celles des rôles et collections. J’ai détaillé son utilisation dans ce billet.
Installation de podman sur WSL2 Ubuntu
Je vais ajouter le dépot apt de podman pour obtenir la dernière version stable :
sudo mkdir -p /etc/apt/keyringscurl -fsSL "https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/Release.key" \ | gpg --dearmor \ | sudo tee /etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg > /dev/nullecho \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg]\ https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/ /" \ | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list > /dev/nullsudo apt update -qqsudo apt -qq -y install podman
Test d’ansible-navigator
Dans un premier temps, nous allons installer ansible-navigator
avec pipx
:
sudo apt install python3-pipsudo pip install pipxpipx install ansible-navigator
Essayons de lancer ansible-navigator
:
ansible-navigator--------------------------------------------------------------------Execution environment image and pull policy overview--------------------------------------------------------------------Execution environment image name: quay.io/ansible/creator-ee:v0.9.1Execution environment image tag: v0.9.1Execution environment pull arguments: NoneExecution environment pull policy: tagExecution environment pull needed: True--------------------------------------------------------------------Updating the execution environment--------------------------------------------------------------------Running the command: podman pull quay.io/ansible/creator-ee:v0.9.1Trying to pull quay.io/ansible/creator-ee:v0.9.1...Getting image source signaturesCopying blob 9f45cf1cd9f2 done
...
Warning: Issues were found while applying the settings. Hint: Command provided: ''
Error: Execution environment support while using podman requires a '/dev/mqueue/' directory. Hint: Try creating it with 'mkdir /dev/mqueue/' or reference the documentation for your operating system related to POSIX message queues.
Note: Configuration failed, using default log file location. (/home/dila/projets/work/snau/outils-transverse/ansible-navigator.log) Log level set to debug Hint: Review the hints and log file to see what went wrong.
Création du dossier /dev/mqueue
:
sudo mkdir /dev/mqueue
Relance :
ansible-navigator
0│Welcome ▒ 1│————————————————————————————————————————————————————————————————————————————————————————————————————————————————————▒ 2│ ▒ 3│Some things you can try from here: ▒ 4│- :collections Explore available collections ▒ 5│- :config Explore the current ansible configuration ▒ 6│- :doc <plugin> Review documentation for a module or plugin ▒ 7│- :help Show the main help page ▒ 8│- :images Explore execution environment images ▒ 9│- :inventory -i <inventory> Explore an inventory ▒10│- :log Review the application log ▒11│- :lint <file or directory> Lint Ansible/YAML files (experimental) ▒12│- :open Open current page in the editor ▒13│- :replay Explore a previous run using a playbook artifact14│- :run <playbook> -i <inventory> Run a playbook in interactive mode15│- :settings Review the current ansible-navigator settings^b/PgUp page up ^f/PgDn page down ↑↓ scroll esc back :help help
Cela fonctionne cette fois :
Activation de l’extension Ansible vscode et activation de l’environnement d’exécution
Si vous n’avez pas encore installé l’extension officielle d’Ansible, vous pouvez vous rendre sur ce billet.
Activons l’utilisation de l’environnement d’exécution :
Ouvrez un fichier ansible. Vous devriez au bout de quelques minutes, le temps
de récupérer l’image EE, voir apparaitre dans la barre à droite de Vscode [EE] x.xx.x
avec la version. Comme dans l’image ci-dessous.
Configuration de podman sur WSL2 Ubuntu
Si jamais vous obtenez une erreur du type, /dev/mqueue is not mounted
. Il
faut dans un premier temps ajouter une commande dans le démarrage de wsl.
- Sur un poste Windows 11, il faut éditer le fichier
/etc/wsl.conf
et y mettre ces lignes.
[boot]command="sudo mkdir /dev/mqueue && sudo mount -t mqueue none /dev/mqueue"
Sur un poste windows 10 il faut créer un fichier podman.bat
et y mettre ce contenu :
wsl ~ -u root -d Ubuntu -e sh -c "mkdir /dev/mqueue && mount -t mqueue none /dev/mqueue"
Vous l’aurez compris sur Windows 11 au prochain démarrage, tout sera configuré par défaut alors que sur un windows 10 il faudra exécuter le fichier podman.bat à chaque démarrage de wsl.
Après redémarrage de wsl tout devrait fonctionner.
Utilisation du driver podman avec molecule
Je vais vous montrer comment installer molecule accompagné de son driver podman. Pour ceux qui ne connaissent pas molecule, je vous renvoie ici. Je vais utiliser pyenv pour installer molecule et ses dépendances :
pyenv virtualenv 3.11.1 moleculepyenv local moleculepip install molecule molecule-podman molecule-vagrant molecule-
On va créer un nouveau rôle avec le driver podman
:
molecule init role test.monrole --driver-name=podmancd monrolemolecule converge
...
INFO Running default > prepareWARNING Skipping, prepare playbook not configured.INFO Running default > converge
PLAY [Converge] ****************************************************************
TASK [Gathering Facts] *********************************************************ok: [instance]
TASK [Copy something to test use of synchronize module] ************************changed: [instance]
TASK [Include test.monrole] ****************************************************
PLAY RECAP *********************************************************************instance : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Cela fonctionne du premier coup.
Plus loin
Il ne reste plus qu’à utiliser… Je compléterai si je trouve d’autres astuces.