Installation de passlib avec Fallback vers pip
Introduction
Nous continuons à résoudre l'erreur "Unable to encrypt nor hash, passlib must be installed" en mettant en place une installation robuste de passlib
avec plusieurs niveaux de fallback :
- Installation via APT (Ubuntu/Debian)
- Installation via DNF (AlmaLinux)
- Fallback pip3
Étapes
- Détecter OS et installer python3/pip3
- Installer passlib selon OS en utilisant le gestionnaire de paquets système
- Vérifier passlib
- Créer utilisateurs avec mots de passe hashés
1. Analyse et Diagnostic des Causes et Solutions
Plusieurs causes et solutions peuvent être identifiées pour les erreurs de type :
Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'
Dans nos logs, on observe en particulier :
- Sur Ubuntu/Debian : « passlib » est censé être installé via
apt
mais Ansible ne le détecte toujours pas. - Sur AlmaLinux : « No package python3-passlib available. »
Ce qui provoque l’échec de la tâche user:
quand vous essayez de faire un password_hash('sha512')
.
2. Pourquoi l’erreur apparaît ?
- Le paquet
python3-passlib
est introuvable sur certaines distributions (comme AlmaLinux) avec le dépôt par défaut. - La librairie est installée mais pas dans l’environnement Python qu’Ansible utilise.
- Par exemple,
apt install python3-passlib
l’installe pour Python 3 de la machine, mais Ansible pourrait utiliser un autre interpréteur Python (moins fréquent siansible_python_interpreter
est bien/usr/bin/python3
).
- Par exemple,
- Le module
passlib
n’est tout simplement pas installé : parfois un conflit de paquets, des dépôts obsolètes, ou un cache non mis à jour.
3. Approche Générale de Résolution
Pour qu’Ansible puisse hasher les mots de passe, il faut que passlib
soit disponible dans le même environnement Python qu’Ansible.
- Installer Python 3 + pip (si besoin).
- Installer le paquet
passlib
via :- Le gestionnaire de paquets système :
apt
(Debian/Ubuntu) oudnf
(AlmaLinux, RedHat, CentOS, etc.). - OU un fallback via pip (en dernier recours, si le paquet
python3-passlib
n’existe pas ou n’est pas dispo dans vos dépôts).
- Le gestionnaire de paquets système :
- Vérifier que
passlib
est bien importable dans le même Python qu’Ansible utilise. - Utiliser
password_hash('sha512')
uniquement sipasslib
est disponible. Sinon, créer l’utilisateur sans hash (ou échouer).
4. Spécificité d’AlmaLinux : le paquet python3-passlib
absent
Sur AlmaLinux (ou RHEL-like), le paquet python3-passlib
n’est parfois pas disponible dans les dépôts de base. Il faut alors :
- Activer EPEL (ou CRB) si besoin.
- Installer le paquet
python3-passlib
depuis ce dépôt supplémentaire.
Exemple :
- name: Activer EPEL sur AlmaLinux (facultatif si déjà disponible)
yum:
name: epel-release
state: present
when: ansible_os_family == "RedHat"
- name: Installer passlib via DNF sur AlmaLinux
dnf:
name: python3-passlib
state: present
when: ansible_os_family == "RedHat"
Note : Selon la version d’AlmaLinux ou CentOS, vous devrez peut-être activer le dépôt “CRB” (Common Release Base).
Si même avec EPEL vous n’avez pas accès au paquet python3-passlib
, vous pouvez alors installer via pip3
.
5. Exemple de Playbook Complet avec Fallback vers pip
Le Playbook ci-dessous :
- Détecte la distribution.
- Installe
python3
etpip3
si besoin. - Active EPEL (ou CRB) sur AlmaLinux.
- Tente d’installer
python3-passlib
viaapt
oudnf
. - En cas d’échec, installe via
pip3
. - Vérifie la présence de passlib.
- Crée les utilisateurs avec un mot de passe hashé si
passlib
est dispo, sinon en clair (pour éviter l’échec complet).
---
- name: Gérer l'installation de passlib et créer des utilisateurs
hosts: all
become: yes
vars:
db_users:
- username: "alice"
password: "password1"
uid: 1001
- username: "bob"
password: "password2"
uid: 1002
- username: "charlie"
password: "password3"
uid: 1003
tasks:
########################################################################
# 1) DÉTECTER LA DISTRIBUTION #
########################################################################
- name: Gather facts
setup:
########################################################################
# 2) INSTALLER PYTHON3 ET PIP3 #
########################################################################
- name: Installer python3 et pip3 sur Debian/Ubuntu
apt:
name:
- python3
- python3-pip
state: present
update_cache: yes
when: ansible_os_family == "Debian"
- name: Installer python3 et pip3 sur RedHat/AlmaLinux
dnf:
name:
- python3
- python3-pip
state: present
update_cache: yes
when: ansible_os_family == "RedHat"
########################################################################
# 3) ACTIVER EPEL (OU CRB) SUR ALMALINUX SI BESOIN #
########################################################################
- name: Activer EPEL sur AlmaLinux
yum:
name: epel-release
state: present
when: ansible_os_family == "RedHat"
########################################################################
# 4) INSTALLER PASSLIB VIA LE GESTIONNAIRE DE PAQUETS #
########################################################################
- name: Installer passlib sur Debian/Ubuntu
apt:
name: python3-passlib
state: present
when: ansible_os_family == "Debian"
register: passlib_system_install_deb
ignore_errors: yes
- name: Installer passlib sur RedHat/AlmaLinux
dnf:
name: python3-passlib
state: present
when: ansible_os_family == "RedHat"
register: passlib_system_install_rh
ignore_errors: yes
########################################################################
# 5) (FALLBACK) INSTALLER PASSLIB VIA pip3 SI LES PACKAGES SYSTÈME ÉCHOUENT
########################################################################
- name: Installer passlib via pip3 (fallback Debian/Ubuntu)
pip:
name: passlib
state: present
when: ansible_os_family == "Debian" and passlib_system_install_deb is failed
- name: Installer passlib via pip3 (fallback RedHat/AlmaLinux)
pip:
name: passlib
state: present
when: ansible_os_family == "RedHat" and passlib_system_install_rh is failed
########################################################################
# 6) VÉRIFIER LA PRÉSENCE DE PASSLIB #
########################################################################
- name: Tester l'import de passlib
command: python3 -c "import passlib"
register: passlib_check
failed_when: false
changed_when: false
- name: Afficher l'état de passlib
debug:
msg: "{{ '✅ passlib est installé' if passlib_check.rc == 0 else '❌ passlib est manquant' }}"
########################################################################
# 7) CRÉER LES UTILISATEURS #
########################################################################
- name: Créer les utilisateurs (hashé si passlib dispo)
user:
name: "{{ item.username }}"
uid: "{{ item.uid }}"
password: >-
{{
item.password | password_hash('sha512')
if passlib_check.rc == 0
else item.password
}}
shell: "/bin/bash"
state: present
loop: "{{ db_users }}"
ignore_errors: yes
lors de l’installation depython3-passlib
pour pouvoir ensuite retomber surpip
.- Les tâches
register: passlib_system_install_*
vous permettent de savoir si l’installation via paquet système a échoué ou non. - Le module
pip
d’Ansible installe par défaut dans le Python utilisé par Ansible (puisque vous avezansible_python_interpreter=/usr/bin/python3
). - Dans la tâche de création d’utilisateurs : on hash si
passlib_check.rc == 0
(import réussi) ; sinon, on met le mot de passe en clair.
6. Que faire si ça ne fonctionne toujours pas ?
6.1. Vérifiez les logs lors des installations (APT ou DNF). Peut-être qu’un cache est trop vieux, ou qu’un paquet n’existe pas dans vos dépôts.
6.2. Vérifiez que passlib est installé sur le controller (la machine qui exécute Ansible) :
# Vérifier si passlib est installé et afficher sa version
python3 -c "import passlib; print(passlib.__version__)"
- Si ça échoue, installez-le sur le controller selon votre distribution :
sudo apt update
sudo apt install python3-passlib
sudo dnf update
sudo dnf install python3-passlib
- OU via pip en dernier recours
sudo apt install python3-pip
sudo pip3 install passlib
sudo dnf install python3-pip
sudo pip3 install passlib
6.4. Vérifiez les logs d'installation et l'état des caches APT/DNF.
6.5. Activez EPEL/CRB sur AlmaLinux si besoin.
6.6. Vérifiez la version de Python qu’utilise Ansible :
ansible all -i inventory.ini -m setup -a "filter=ansible_python*"
Regardez le chemin retourné par
ansible_python_interpreter
. Assurez-vous que c’est bien/usr/bin/python3
.
6.7. Faites un test manuel sur un conteneur :
docker exec -it node4 bash
python3 -c "import passlib; print(passlib.__version__)"
Si ça échoue, c’est que
passlib
n’a pas été réellement installé pour ce Python.
6.8. Nettoyez vos conteneurs ou recréez-les si vous faites des tests en boucle et que certains fichiers ou configurations sont devenues incohérentes.
7. Conclusion
-
La difficulté principale sur AlmaLinux (et parfois Debian/Ubuntu minimal) est que
python3-passlib
n’est pas toujours dans les dépôts par défaut. -
La solution la plus simple est souvent de tomber en fallback :
pip3 install passlib
. -
Pour éviter l’échec complet de la création d’utilisateurs, il faut soit
- (a) S’assurer que
passlib
est vraiment installé, ou - (b) Mettre le mot de passe en clair si on ne le trouve pas (moyen, mais ça évite de planter le Playbook).
- (a) S’assurer que
Avec le Playbook incrémental ci-dessus (et l’activation de epel-release
si besoin), vous devriez résoudre l’erreur « passlib must be installed » et enfin pouvoir créer vos utilisateurs avec hashage de mot de passe !