Aller au contenu
Infrastructure as Code medium

Module user Ansible : créer, modifier, supprimer des utilisateurs

9 min de lecture

Logo Ansible

ansible.builtin.user: gère les utilisateurs Linux : création, modification (shell, home, groupes), hashage de password, suppression. C'est le module n°1 pour l'onboarding de membres d'équipe et le provisioning de comptes applicatifs.

Options critiques RHCE 2026 : name:, state:, shell:, groups: + append:, password: (avec password_hash), uid:, comment:, remove: sur state: absent.

  • Créer un utilisateur avec home, shell, groupes secondaires.
  • Hasher un password avec password_hash('sha512') pour le stockage idempotent.
  • Distinguer groups: + append: true (ajouter) vs groups: seul (remplacer, danger).
  • Forcer un uid: précis pour les comptes système / applicatifs (cohérence multi-hôtes).
  • Supprimer un compte avec remove: true (qui supprime aussi le home).
  • Avoir become: true configuré (création d'user nécessite root).
  • Avoir lu Module group, créer le groupe avant l'user qui le référence.
- name: Creer alice
ansible.builtin.user:
name: alice
comment: "Alice — admin RHCE 2026"
shell: /bin/bash
state: present

À la première exécution : useradd alice -c "Alice — admin RHCE 2026" -s /bin/bash est lancé. Ansible crée le home /home/alice/, génère un groupe primaire alice (UID = GID = premier libre ≥ 1000).

Idempotence : 2e run → changed=0. Ansible vérifie chaque attribut et n'agit que sur ce qui diffère.

Le piège n°1 du module user: est l'oubli de append: true lors de la modification.

# ❌ DANGER : remplace TOUS les groupes secondaires
- ansible.builtin.user:
name: bob
groups: [video]
# ✅ CORRECT : ajoute video sans toucher aux autres
- ansible.builtin.user:
name: bob
groups: [video]
append: true

Sans append: true, si bob était dans [wheel, docker, sudo], après la 1ère tâche il est uniquement dans video. Bob a perdu wheel et docker sans alerte.

Règle : pour modifier les groupes d'un utilisateur existant, toujours append: true. La seule exception : remise à zéro intentionnelle des droits (offboarding).

# Pattern naif (casse l idempotence)
- ansible.builtin.user:
name: charlie
password: "{{ 'PasswordEnClair' | password_hash('sha512') }}"

Sans salt fixe, password_hash('sha512') génère un hash différent à chaque run → tâche toujours changed.

Pattern propre (RHCE) : générer le hash une fois et le stocker dans host_vars/ (avec Vault).

# host_vars/db1.lab.yml (chiffre avec ansible-vault)
charlie_password_hash: "$6$randomsalt$hashvalue..."
# Dans le playbook :
- ansible.builtin.user:
name: charlie
password: "{{ charlie_password_hash }}"

Pour générer le hash en CLI :

Fenêtre de terminal
mkpasswd -m sha-512 'PasswordEnClair'
# ou
python3 -c "import crypt; print(crypt.crypt('PasswordEnClair', crypt.mksalt(crypt.METHOD_SHA512)))"

update_password: on_create complète le pattern : ne touche au password que si l'user est nouvellement créé, pas s'il existe déjà.

- name: Compte applicatif deploy avec UID 2000
ansible.builtin.user:
name: deploy
uid: 2000
group: deploy
home: /opt/deploy
create_home: true
shell: /bin/bash

Pourquoi forcer l'UID ? Sur 50 hôtes, useradd auto-attribue le premier UID libre. Si web1 a deploy=1001 et web2 a deploy=1002, un fichier monté en NFS appartenant à 1001 sera inaccessible par deploy sur web2.

uid: force la cohérence. Si l'UID est déjà pris par un autre user, la tâche failed (pas de collision silencieuse).

Convention RHEL :

  • UID < 1000 : comptes système (system: true).
  • UID 1000-2000 : utilisateurs humains.
  • UID 2000+ : comptes applicatifs (réservé par convention).

Tous les attributs sauf name peuvent être modifiés :

- name: Changer le shell de alice
ansible.builtin.user:
name: alice
shell: /bin/zsh
- name: Modifier le commentaire
ansible.builtin.user:
name: alice
comment: "Alice — promue lead admin"

Ansible exécute usermod -s /bin/zsh alice et usermod -c "..." alice. Idempotent : 2e run → ok si valeurs identiques.

# Suppression sans nettoyer le home (defaut)
- ansible.builtin.user:
name: charlie
state: absent
remove: false
# Suppression complete (home + spool mail)
- ansible.builtin.user:
name: charlie
state: absent
remove: true

remove: false (défaut) = userdel charlie → home /home/charlie/ conservé. Pattern d'audit-friendly : on peut récupérer les fichiers du compte supprimé.

remove: true = userdel -r charlie → home + mail supprimés. Pour le nettoyage final après archivage des données.

SymptômeCauseFix
Bob a perdu ses droits sudo après modifOubli de append: true sur groups:Toujours append: true en modification
changed=1 à chaque run sur le passwordpassword_hash sans salt fixeStocker le hash dans host_vars/ (Vault)
Conflit d'UID entre hôtesPas de uid: forcéForcer uid: sur les comptes applicatifs
Home reste après state: absentremove: false (défaut)Ajouter remove: true pour nettoyer
Tâche failed "uid already exists"UID déjà utilisé par un autre userChoisir un UID libre, ou résoudre le conflit
  • name: est la clé d'identification, ne jamais modifier.
  • groups: + append: true pour ajouter, pas remplacer.
  • password: = hash SHA-512, idéalement stocké dans host_vars/ (Vault).
  • uid: forcé sur les comptes système / applicatifs (cohérence multi-hôtes).
  • remove: true sur state: absent pour supprimer le home.
  • Création de groupe AVANT création de l'user qui le référence.

Cette page a un lab d'accompagnement : labs/modules-utilisateurs/user/ dans stephrobert/ansible-training.

Challenge, sur db1.lab :

  1. Créer un groupe rhce-team.
  2. Créer alice (admin, dans wheel), bob (UID 2001), deploy (UID 2000, home /opt/deploy/).

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-utilisateurs/user/challenge/tests/

6 tests vérifient les attributs (UID, groupes, home, shell).

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn