
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).
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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.
Prérequis
Section intitulée « Prérequis »-
Collection
community.generalinstallé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).
Création standard — ext4 ou xfs
Section intitulée « Création standard — ext4 ou xfs »- name: Créer un fs ext4 sur /dev/vdb1 community.general.filesystem: fstype: ext4 dev: /dev/vdb1 state: presentComportement :
- Si
/dev/vdb1n'a aucun fs →mkfs.ext4 /dev/vdb1est exécuté, taskchanged. - Si
/dev/vdb1a déjà un fs ext4 → taskok(idempotent). - Si
/dev/vdb1a un autre fs (xfs, btrfs) → taskfailedsauf siforce: true. - Si
/dev/vdb1n'existe pas → taskfailed.
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: presentext4 vs xfs vs btrfs — quel choix
Section intitulée « ext4 vs xfs vs btrfs — quel choix »| Fstype | Forces | Faiblesses | Quand l'utiliser |
|---|---|---|---|
| ext4 | Mature, très large compat, fsck rapide | Pas de checksums | Workloads classiques, SSD systèmes |
| xfs | Default RHEL 9/10, scale jusqu'à 8 EiB, perf en parallèle | Pas de shrink (extension only) | Stockage de données, workloads I/O parallèles |
| btrfs | Snapshots natifs, checksums, RAID intégré | Plus complexe, recovery parfois capricieux | Postes 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 :
/,/homesur RHEL → xfs (par cohérence avec l'installeur)./,/homesur Debian → ext4./var/lib/postgresql/,/var/lib/mysql/→ xfs (perf I/O parallèles)./boot/efi→ vfat (ESP doit être FAT).- Swap →
fstype: swap.
Création swap
Section intitulée « Création 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: mountedfstype: swap lance mkswap. Pour activer le swap au boot, l'ajouter dans /etc/fstab via ansible.posix.mount.
Étendre un filesystem (resize)
Section intitulée « Étendre un filesystem (resize) »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: trueresizefs: true lance la commande appropriée selon le fstype :
- ext4 →
resize2fs /dev/...(online si fs monté). - xfs →
xfs_growfs /<mountpoint>(le fs doit être monté pour étendre xfs). - btrfs →
btrfs filesystem resize ....
Forcer la création — force: true
Section intitulée « Forcer la création — force: true »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).
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Solution |
|---|---|---|
device <X> is mounted, not allowed | Device monté, mkfs refuse | Démonter avec ansible.posix.mount: state=unmounted |
cannot resize sur xfs démonté | xfs s'étend uniquement online | Monter le fs d'abord puis lancer le resize |
wrong fs type, bad option, bad superblock au mount | Fs créé mais corrompu | Re-créer avec force: true puis re-mount |
| Mauvaise UUID — fstab ne match plus | Re-création du fs change l'UUID | Re-mettre à jour /etc/fstab avec la nouvelle UUID après recréation |
mkfs.<fs>: command not found | Outils userspace manquants | dnf install xfsprogs e2fsprogs btrfs-progs selon le fs |
| Idempotence cassée sur device dynamique | Device path change (LVM, multipath) | Utiliser un identifiant stable (UUID, /dev/disk/by-uuid/...) |
| Module manquant | Collection community.general non installée | ansible-galaxy collection install community.general |
À retenir
Section intitulée « À retenir »community.general.filesystemcrée un fs sur un device — pas une partition (utiliserpartedavant).- 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.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »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 :
- Créer un filesystem
ext4sur la 1ère partition. - Créer un filesystem
xfssur la 2nde partition (xfs requiert ≥ 300 MiB). - Vérifier l'idempotence — un 2e run sans
changed. - Comprendre la protection par défaut : tenter de changer le
fstypesansforce: truedoit échouer.
Validation pytest+testinfra :
ansible-playbook labs/modules-rhel/filesystem/challenge/solution.ymlansible-playbook labs/modules-rhel/filesystem/challenge/solution.yml # 2e run = changed=0pytest -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.