Skip to main content

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: avec password_hash(), le hash est généré localement par Ansible (machine de contrôle) avant d’être transmis à la cible. Installer passlib sur les hôtes distants ne suffit donc pas : il faut que passlib 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 ansible

    Et 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 appelle passlib 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é par pipx 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 :

    1. Installation locale de passlib.
    2. Création d’utilisateurs sur les hôtes distants.
  • 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.