Une autre solution - Playbook 1
1 - Un autre playbook
Ce playbook est à analyser et à essayer. Il propose une solution pour résoudre l'erreur « passlib must be installed » en installant la librairie sur la machine de contrôle (controller) — c'est-à-dire là où ansible-playbook
est exécuté.
Pourquoi ?
Pour le module
user:
avecpassword_hash()
, le hash est généré localement par Ansible (machine de contrôle) avant d’être transmis à la cible. Installerpasslib
sur les hôtes distants ne suffit donc pas : il faut quepasslib
soit disponible dans l’environnement Python où Ansible tourne.
2 - Playbook Final : Installation locale de passlib
+ Création d’utilisateurs
---
###############################################################################
# 1) INSTALLER PASSLIB EN LOCAL (machine de contrôle) #
###############################################################################
- name: Installer passlib local (Controller)
hosts: localhost
gather_facts: false
become: yes # Nécessaire si vous devez exécuter pip en sudo (dépend de votre config)
tasks:
- name: Installer passlib local
pip:
name: passlib
state: present
###############################################################################
# 2) CRÉER LES UTILISATEURS SUR LES NOEUDS DISTANTS #
###############################################################################
- name: Créer les utilisateurs sur les hôtes distants
hosts: all
gather_facts: true
become: yes
vars:
db_users:
- username: "alice"
password: "password1"
uid: 1001
- username: "bob"
password: "password2"
uid: 1002
- username: "charlie"
password: "password3"
uid: 1003
tasks:
- name: Créer les utilisateurs (avec hash local)
user:
name: "{{ item.username }}"
uid: "{{ item.uid }}"
# Ici, le hashage est fait localement grâce à passlib,
# que nous venons d'installer sur la machine de contrôle.
password: "{{ item.password | password_hash('sha512') }}"
shell: "/bin/bash"
state: present
loop: "{{ db_users }}"
3 - Comment ça marche ?
3.1. Premier Play (hosts: localhost
)
-
Installe
passlib
en local, dans le même Python que celui utilisé par Ansible. -
Vous pouvez vérifier la version :
ansible --version
which ansibleEt vous assurez que
pip
installe bien dans le même environnement (virtuel ou système).
3.2. Second Play (hosts: all
)
- Va créer les utilisateurs sur les hôtes distants.
- Lorsqu’Ansible voit
password: "{{ item.password | password_hash('sha512') }}"
, il appellepasslib
localement pour générer le hash. - Le mot de passe déjà hashé est ensuite envoyé au nœud distant pour créer l’utilisateur.
4 - Points Importants
4.1. Installation sur la machine de contrôle :
-
L’erreur « No module named 'passlib' » survient parce qu’Ansible fait le hash chez vous, pas sur le conteneur/hôte.
-
Même si
passlib
est installé sur le nœud distant, ça n’a aucun effet pour cette étape de hashage.
4.2. Vous n’êtes pas obligé de faire un play
séparé pour l’installation de passlib
localement, mais c’est souvent plus clair et réutilisable.
4.3. Si vous préférez pipx
:
- Vous pouvez remplacer la tâche du premier Play par :
pipx inject ansible passlib - Ainsi,
passlib
sera injecté dans l’environnement virtuel géré parpipx
pour Ansible.
4.4. Si vous n’avez pas besoin des paquets Python sur les nœuds cibles (à moins qu’un autre rôle en ait besoin), inutile de les installer à distance : pour la gestion du hash, tout se passe localement.
5 - En résumé
-
Un seul Playbook, deux sections :
- Installation locale de
passlib
. - Création d’utilisateurs sur les hôtes distants.
- Installation locale de
-
Problème résolu : plus de message « Unable to encrypt nor hash, passlib must be installed ».
Avec ce Playbook final, vous garantissez que le hashage fonctionnera sans erreur, quelle que soit la distribution des nœuds (Ubuntu, Debian, AlmaLinux, etc.), puisque la dépendance critique est sur votre machine Ansible.