Skip to main content

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

  1. Détecter OS et installer python3/pip3
  2. Installer passlib selon OS en utilisant le gestionnaire de paquets système
  3. Vérifier passlib
  4. 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 :

passlib must be installed

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 ?


  1. Le paquet python3-passlib est introuvable sur certaines distributions (comme AlmaLinux) avec le dépôt par défaut.
  2. 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 si ansible_python_interpreter est bien /usr/bin/python3).
  3. 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.

Les étapes-clés
  1. Installer Python 3 + pip (si besoin).
  2. Installer le paquet passlib via :
    • Le gestionnaire de paquets système : apt (Debian/Ubuntu) ou dnf (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).
  3. Vérifier que passlib est bien importable dans le même Python qu’Ansible utilise.
  4. Utiliser password_hash('sha512') uniquement si passlib 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 :

  1. Activer EPEL (ou CRB) si besoin.
  2. 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 :

  1. Détecte la distribution.
  2. Installe python3 et pip3 si besoin.
  3. Active EPEL (ou CRB) sur AlmaLinux.
  4. Tente d’installer python3-passlib via apt ou dnf.
  5. En cas d’échec, installe via pip3.
  6. Vérifie la présence de passlib.
  7. 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 }}"
Points importants
  • ignore_errors: yes lors de l’installation de python3-passlib pour pouvoir ensuite retomber sur pip.
  • 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 avez ansible_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) :

Pour Debian/Ubuntu
# 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 :
Pour Debian/Ubuntu
sudo apt update
sudo apt install python3-passlib
Pour RedHat/AlmaLinux
sudo dnf update
sudo dnf install python3-passlib
  • OU via pip en dernier recours
Pour Debian/Ubuntu
sudo apt install python3-pip
sudo pip3 install passlib
Pour RedHat/AlmaLinux
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).
Résolution

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 !