Skip to main content

Résultat de l'Exécution du Playbook et résolution du problème



1 - Introduction


Cette section vise à interpréter les résultats d'exécution du playbook et à comprendre pourquoi l'erreur persiste malgré une installation réussie de passlib.



2 - Résultat de l'Exécution du playbook


Résultat
TASK [Afficher l'état de passlib] **************************************************************************************************************************
ok: [node1] => {
"msg": "✅ passlib est installé"
}

ok: [node2] => {
"msg": "✅ passlib est installé"
}
ok: [node3] => {
"msg": "✅ passlib est installé"
}
ok: [node4] => {
"msg": "✅ passlib est installé"
}
ok: [node5] => {
"msg": "✅ passlib est installé"
}
ok: [node6] => {
"msg": "✅ passlib est installé"
}

TASK [Créer les utilisateurs (hashé si passlib dispo)] *****************************************************************************************************
fatal: [node1]: FAILED! => {"msg": "Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'"}
fatal: [node2]: FAILED! => {"msg": "Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'"}
fatal: [node3]: FAILED! => {"msg": "Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'"}
fatal: [node4]: FAILED! => {"msg": "Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'"}
fatal: [node5]: FAILED! => {"msg": "Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'"}
fatal: [node6]: FAILED! => {"msg": "Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'"}


3 - Interprétation du résultat


Le résultat peut sembler paradoxal :

  • La tâche qui teste l’import de passlib (python3 -c "import passlib") réussit sur chaque remote host, ce qui prouve que passlib est bien installé à distance.

  • La tâche user: échoue avec Unable to encrypt nor hash, passlib must be installed, signifiant qu’Ansible ne trouve pas passlib.

En réalité, le hashage se fait localement par Ansible (sur le contrôle ou controller), et non sur l’hôte distant. C’est pourquoi :

  1. Même si passlib est installé sur chaque conteneur, Ansible continue de se plaindre si passlib n’est pas installé dans l’environnement Python du controller.
  2. La commande python3 -c "import passlib" que vous exécutez à distance ne reflète pas l’environnement Python local utilisé par Ansible pour hasher le mot de passe.


4 - Comprendre pourquoi le hashage se fait localement


Lorsque vous utilisez dans votre Playbook :

password: "{{ item.password | password_hash('sha512') }}"


ou que vous laissez Ansible générer automatiquement un hash pour user:, c’est la machine qui exécute Ansible (le controller) qui doit avoir passlib.

  • Ansible lit votre variable item.password,
  • applique le filtre password_hash('sha512') en local,
  • pousse ensuite la valeur déjà hashée vers l’hôte distant pour créer l’utilisateur.

Si le Python utilisé par Ansible en local n’a pas passlib, vous obtenez l’erreur :

Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'



5 - Vérifier le Python qu’utilise Ansible en local


Sur votre machine de contrôle (là où vous lancez ansible-playbook), exécutez :


ansible --version

ou

ansible-config dump | grep ^INTERPRETER_PYTHON

Cela vous indiquera le chemin du Python qu’Ansible utilise. Exemple :

ansible 2.14.4
config file = /etc/ansible/ansible.cfg
...
python version = 3.10.6 (main, ...)

Dans ce cas, c’est Python 3.10 du système (ou d’un venv).



6 - Installer passlib sur le controller (pas sur la cible)


Deux approches courantes :

A. Installation directe via pip

Exemples (à adapter selon vos droits et votre distribution) :

# Installation globale
sudo pip install passlib

# OU installation dans un venv
python3 -m venv venv-ansible
source venv-ansible/bin/activate
pip install ansible passlib

# OU installation pour l’utilisateur courant
pip install --user passlib

Assurez-vous que la commande pip ou pip3 correspond bien au même Python qu’Ansible utilise.

B. Utiliser pipx et le concept de « inject »

Si vous installez Ansible avec pipx, vous pouvez injecter passlib directement dans son environnement virtuel :

pipx inject ansible passlib

Ainsi, Ansible (et ses dépendances) + passlib sont regroupés dans le même environnement géré par pipx.



7 - Résumé : la clé est sur la machine de contrôle


  1. Vérifiez que passlib est dans le Python qu’Ansible utilise localement (controller).
  2. Le test python3 -c "import passlib" que vous faites sur les cibles n’a pas d’incidence sur le hashage local.
  3. Une fois passlib correctement installé localement, relancez votre playbook ; l’erreur « No module named 'passlib' » disparaîtra et Ansible pourra hasher vos mots de passe.
En d’autres termes :

« Pour la gestion des mots de passe hashés, c’est la machine qui lance Ansible qui doit avoir passlib, pas (uniquement) la machine distante. »