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. Installerpasslibsur les hôtes distants ne suffit donc pas : il faut quepasslibsoit 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
passliben local, dans le même Python que celui utilisé par Ansible. -
Vous pouvez vérifier la version :
ansible --version
which ansibleEt vous assurez que
pipinstalle 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 appellepassliblocalement 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
passlibest 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,
passlibsera injecté dans l’environnement virtuel géré parpipxpour 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.