Aller au contenu
Infrastructure as Code medium

Module Ansible filesystem : créer un système de fichiers Linux

9 min de lecture

Logo Ansible

Le module community.general.filesystem crée un système de fichiers sur une partition ou un volume logique : ext4, xfs, btrfs, f2fs, swap. C'est l'étape après la partition (cf. parted ou un LV LVM) et avant le mount. Public visé : intermédiaires Ansible RHEL/Debian, candidats RHCSA. Cette page couvre la création (ext4, xfs), le resize (étendre un fs après agrandissement de la partition), les différences entre fstypes et les pièges idempotence (un fs créé reste créé, on ne le détruit pas par accident).

  • Créer un filesystem ext4 ou xfs sur une partition.
  • Choisir entre ext4, xfs, btrfs selon le cas d'usage.
  • Étendre un filesystem après agrandissement du device sous-jacent.
  • Forcer la création (force: true) sur un device qui contient déjà un fs.
  • Diagnostiquer les pièges d'idempotence.
  • Collection community.general installée :

    Fenêtre de terminal
    ansible-galaxy collection install community.general
  • Outils userspace présents sur le nœud (mkfs.ext4, mkfs.xfs, etc.) — installés par défaut sur RHEL et Debian.

  • Un device cible : partition (/dev/vdb1), LV (/dev/vg_data/lv_app), ou disque entier.

  • Privilèges root (become: true).

- name: Créer un fs ext4 sur /dev/vdb1
community.general.filesystem:
fstype: ext4
dev: /dev/vdb1
state: present

Comportement :

  • Si /dev/vdb1 n'a aucun fsmkfs.ext4 /dev/vdb1 est exécuté, task changed.
  • Si /dev/vdb1 a déjà un fs ext4 → task ok (idempotent).
  • Si /dev/vdb1 a un autre fs (xfs, btrfs) → task failed sauf si force: true.
  • Si /dev/vdb1 n'existe pas → task failed.

Pour xfs :

- name: Créer un fs xfs sur /dev/vg_data/lv_app
community.general.filesystem:
fstype: xfs
dev: /dev/vg_data/lv_app
state: present
FstypeForcesFaiblessesQuand l'utiliser
ext4Mature, très large compat, fsck rapidePas de checksumsWorkloads classiques, SSD systèmes
xfsDefault RHEL 9/10, scale jusqu'à 8 EiB, perf en parallèlePas de shrink (extension only)Stockage de données, workloads I/O parallèles
btrfsSnapshots natifs, checksums, RAID intégréPlus complexe, recovery parfois capricieuxPostes de travail (Fedora default), backup
swap(pas un vrai fs)Espace de pagination

Sur RHEL 8/9/10, le default est xfs — c'est ce que l'installeur RHEL choisit pour /, /home, /var. Sur Debian/Ubuntu, c'est ext4.

Cas d'usage :

  • /, /home sur RHEL → xfs (par cohérence avec l'installeur).
  • /, /home sur Debian → ext4.
  • /var/lib/postgresql/, /var/lib/mysql/ → xfs (perf I/O parallèles).
  • /boot/efi → vfat (ESP doit être FAT).
  • Swap → fstype: swap.
- name: Créer un fs swap
community.general.filesystem:
fstype: swap
dev: /dev/vdb2
- name: Activer le swap
ansible.builtin.command: swapon /dev/vdb2
args:
creates: /proc/swaps # idempotence simple
- name: Ajouter le swap dans /etc/fstab
ansible.posix.mount:
src: /dev/vdb2
path: none
fstype: swap
opts: sw
state: mounted

fstype: swap lance mkswap. Pour activer le swap au boot, l'ajouter dans /etc/fstab via ansible.posix.mount.

Cas typique : la partition ou le LV a été agrandi, on veut propager l'agrandissement au filesystem.

# 1. Agrandir le LV
- community.general.lvol:
vg: vg_data
lv: lv_app
size: 100g
resizefs: false # PAS de resize côté lvol — on le fait via filesystem
# 2. Étendre le fs sur le device agrandi
- community.general.filesystem:
fstype: xfs
dev: /dev/vg_data/lv_app
resizefs: true

resizefs: true lance la commande appropriée selon le fstype :

  • ext4resize2fs /dev/... (online si fs monté).
  • xfsxfs_growfs /<mountpoint> (le fs doit être monté pour étendre xfs).
  • btrfsbtrfs filesystem resize ....

Pour écraser un fs existant (perte de données — assumée) :

- name: Reformatter une partition (perte de données accepté)
community.general.filesystem:
fstype: xfs
dev: /dev/vdb1
force: true

À utiliser uniquement dans des cas explicites :

  • Lab jetable.
  • Re-provisionnement complet d'un device après destroy.
  • Migration de fstype (rare — généralement migre les données vers un nouveau device).
SymptômeCauseSolution
device <X> is mounted, not allowedDevice monté, mkfs refuseDémonter avec ansible.posix.mount: state=unmounted
cannot resize sur xfs démontéxfs s'étend uniquement onlineMonter le fs d'abord puis lancer le resize
wrong fs type, bad option, bad superblock au mountFs créé mais corrompuRe-créer avec force: true puis re-mount
Mauvaise UUID — fstab ne match plusRe-création du fs change l'UUIDRe-mettre à jour /etc/fstab avec la nouvelle UUID après recréation
mkfs.<fs>: command not foundOutils userspace manquantsdnf install xfsprogs e2fsprogs btrfs-progs selon le fs
Idempotence cassée sur device dynamiqueDevice path change (LVM, multipath)Utiliser un identifiant stable (UUID, /dev/disk/by-uuid/...)
Module manquantCollection community.general non installéeansible-galaxy collection install community.general
  • community.general.filesystem crée un fs sur un device — pas une partition (utiliser parted avant).
  • Default RHEL = xfs, default Debian/Ubuntu = ext4.
  • xfs ne shrink pas — choix engageant, à connaître avant de créer.
  • resizefs: true étend automatiquement le fs après agrandissement du device.
  • force: true écrase un fs existant — destruction de données assumée, à n'utiliser qu'en cas explicite.
  • Le module ne démonte pas — c'est à vous de démonter avant si nécessaire.
  • Enchaîner toujours partition → filesystem → mount dans un rôle.

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

Challenge — sur db1.lab, avec deux partitions cibles /dev/loop0p1 et /dev/loop0p2 (ou /dev/vdb1/vdb2) d'au moins 400 MiB chacune :

  1. Créer un filesystem ext4 sur la 1ère partition.
  2. Créer un filesystem xfs sur la 2nde partition (xfs requiert ≥ 300 MiB).
  3. Vérifier l'idempotence — un 2e run sans changed.
  4. Comprendre la protection par défaut : tenter de changer le fstype sans force: true doit échouer.

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook labs/modules-rhel/filesystem/challenge/solution.yml
ansible-playbook labs/modules-rhel/filesystem/challenge/solution.yml # 2e run = changed=0
pytest -v labs/modules-rhel/filesystem/challenge/tests/

Les tests vérifient le TYPE="ext4" et TYPE="xfs" retournés par blkid, et l'idempotence sur double run.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn