7.1 : Module user : créer, modifier, supprimer un compte

On arrive à une section très concrète pour Nordika : la gestion du personnel au sol. Chaque nouvel employé qui arrive a besoin d’un compte sur les serveurs concernés ; chaque départ doit voir son accès révoqué proprement. Fait à la main sur quinze serveurs, c’est long et source d’oublis. Avec le module user, c’est une seule tâche, appliquée à toute la flotte en une exécution.

Créer un compte simple

- name: Créer le compte d'un nouvel employé
  ansible.builtin.user:
    name: alice
    state: present

Comme tous les modules qu’on utilise depuis le début de cette formation, state: present suit la logique déclarative posée en 1.1 : si alice existe déjà, la tâche affiche ok ; sinon, elle est créée et la tâche affiche changed.

Les options les plus utiles

- name: Créer un compte complet
  ansible.builtin.user:
    name: alice
    state: present
    comment: "Alice Dupont - Service Support"
    shell: /bin/bash
    create_home: yes
    groups: sudo
    append: yes
  • comment : le champ GECOS, souvent utilisé pour le nom complet (visible dans /etc/passwd).
  • shell : le shell par défaut du compte (/bin/bash, /bin/sh, ou /usr/sbin/nologin pour un compte de service qui ne doit jamais se connecter interactivement).
  • create_home : crée le dossier personnel (/home/alice) s’il n’existe pas déjà.
  • groups + append: yes : ajoute le compte au groupe sudo, sans retirer les groupes existants.

⚠️ Piège classique : sans append: yes, groups remplace la liste complète des groupes secondaires du compte, au lieu de s’y ajouter. Sur un compte déjà existant avec d’autres groupes, ça peut retirer des accès de façon inattendue. Le réflexe à prendre : append: yes dès que vous ajoutez un groupe à un compte qui pourrait déjà en avoir d’autres.

Définir un mot de passe

Le module user accepte un mot de passe, mais jamais en clair — il attend un hash déjà chiffré :

- name: Créer un compte avec mot de passe
  ansible.builtin.user:
    name: alice
    state: present
    password: "{{ 'MonMotDePasse123!' | password_hash('sha512') }}"

Le filtre Jinja2 password_hash('sha512') génère le hash à la volée, à partir d’une valeur en clair — mais dans un vrai projet, ce mot de passe en clair ne devrait jamais apparaître tel quel dans un playbook versionné dans Git. On verra en section 8 comment le protéger avec Ansible Vault, ce qui rendra cette ligne réellement utilisable en production.

Modifier un compte existant

Exactement la même syntaxe : on redécrit l’état voulu, Ansible compare et ajuste uniquement ce qui diffère.

- name: Changer le shell d'un compte existant
  ansible.builtin.user:
    name: alice
    shell: /bin/zsh

Si alice a déjà /bin/zsh comme shell, ok. Sinon, changed, et seul le shell est modifié — tout le reste du compte (mot de passe, groupes…) reste intact.

Supprimer un compte

- name: Supprimer le compte d'un employé parti
  ansible.builtin.user:
    name: alice
    state: absent
    remove: yes

state: absent supprime le compte. remove: yes va plus loin : il supprime aussi le dossier personnel et les fichiers associés (sans remove: yes, le compte disparaît mais /home/alice reste sur le disque).

Vérifier le résultat

Comme pour n’importe quel module, un simple getent en commande ad-hoc permet de confirmer rapidement :

ansible all -i inventaire.yaml -m command -a "getent passwd alice"

Ce qu’il faut retenir

  • state: present/absent suit la même logique déclarative que tous les autres modules vus jusqu’ici.
  • append: yes est indispensable dès qu’on ajoute un groupe à un compte qui pourrait déjà en avoir d’autres.
  • Un mot de passe se transmet toujours hashé, jamais en clair — et un vrai projet le protège en plus avec Vault (section 8).
  • remove: yes supprime aussi le dossier personnel ; sans lui, le compte disparaît mais ses fichiers restent.

Dans la prochaine leçon, on s’attaque aux groupes eux-mêmes : comment les créer, et comment gérer l’appartenance à plusieurs groupes proprement.