AssistanceTickets › INC-06

BC02 · Scripts et automatisation

INC-06 Alerte Zabbix : le volume du partage E: est presque plein

Azur · administrateur WindowsRien n'a été supprimé sans un accord écrit. Et comme la dernière sauvegarde datait d'avant les fichiers, cet accord était la seule garantie.

DemandeAlerte de supervisionJean-Philippe

Zabbix signale : « Windows FS [Partages(E:)]: Space is critically low (used>90%, total 100.0GB) », hôte VM-WinSrv25-JP, apparue à 14h50.

TâcheMesurer le volumeJean-Philippe5 min

Get-Volume -DriveLetter E : 100 Go, 8,8 Go libres (91,2 % occupés).

TâcheLire les quotasJean-Philippe5 min

Get-FsrmQuota : un seul quota, sur E:\Informatique (5 Go, rien d'utilisé). Il n'explique pas la saturation.

TâcheTrouver les gros fichiersJean-Philippe10 min

Get-ChildItem E:\ -Recurse -File | Sort-Object Length -Descending | Select-Object -First 10 : 9 fichiers de 10 240 Mo, export_1.bak à export_9.bak, dans E:\Temp_Migration, tous créés à 14h45. Total : 92 160 Mo.

TâcheExporter un rapportJean-Philippe20 min

J'applique le script de rapport prévu dans mon runbook de stockage, en lecture seule (voir le script plus bas) : deux fichiers CSV horodatés, les plus gros fichiers et la taille de chaque dossier. Testé d'abord sur un petit dossier (15h21), puis lancé sur tout le volume (15h29). Ils gardent une preuve datée de l'état avant intervention.

SuiviMessage au responsableJean-Philippe

Le volume des partages est occupé à 91,2 % : il reste 8,8 Go. Les fichiers datent tous du même jour, je ne peux donc pas dire quand le volume sera plein. À 100 %, les partages deviendraient inutilisables : c'est pourquoi le ticket est en priorité Haute. Le dossier E:\Temp_Migration occupe 92 160 Mo. Je ne supprime rien sans ton accord. Peux-tu m'indiquer, pour chaque fichier : à garder, à archiver ailleurs ou à supprimer ?

RéponseDécision écriteResponsable informatique

export_2.bak à export_9.bak : à supprimer, ce sont des exports temporaires de migration. export_1.bak : à conserver jusqu'à vendredi pour une vérification. Rien d'autre ne doit être supprimé. Confirme-moi l'espace libéré et le retour à la normale de l'alerte.

TâcheVérifier la sauvegardeJean-Philippe5 min

wbadmin get versions : la dernière sauvegarde date de 14h40, avant la création des fichiers (14h45). Aucune restauration possible : la suppression sera irréversible, l'accord écrit est la seule garantie.

TâcheSupprimer et prouverJean-Philippe15 min

Simulation d'abord : 2..9 | ForEach-Object { Remove-Item -LiteralPath "E:\Temp_Migration\export_$_.bak" -WhatIf } (export_2 à export_9 listés, export_1 écarté). Puis la suppression, et la preuve : Get-ChildItem E:\Temp_Migration ne montre plus qu'export_1.bak ; Get-Volume : 88,8 Go libres.

SolutionSolution approuvée · ticket closJean-Philippe

Cause : neuf fichiers d'export de migration de 10 Go chacun occupaient le volume des partages, à 91,2 %.

Correction : avec l'accord écrit du responsable, suppression de export_2.bak à export_9.bak après une simulation -WhatIf ; export_1.bak conservé.

Vérification : espace libre passé de 8,8 Go à 88,8 Go ; alerte Zabbix passée à Résolu.

Recommandation : un quota FSRM sur ce dossier pour éviter la récidive (proposé, à valider par le responsable).

Le script du runbook : Rapport-Espace-Partage.ps1

lecture seule
# Rapport-Espace-Partage.ps1 - LECTURE SEULE : ne supprime rien
# Exporte les plus gros fichiers et la taille des dossiers de premier niveau.
param(
    [string]$Racine = 'E:\',
    [int]$Nombre = 30,
    [string]$Sortie = 'C:\Outils\Rapports'
)
# 1. Verifications
if (-not (Test-Path -LiteralPath $Racine)) {
    Write-Error "Racine introuvable : $Racine"
    exit 1
}
New-Item -ItemType Directory -Path $Sortie -Force | Out-Null
$h = Get-Date -Format 'yyyyMMdd-HHmm'
$ea = 'SilentlyContinue'
# 2. Traitement : les plus gros fichiers
$fichiers = Get-ChildItem -LiteralPath $Racine -Recurse -File -ErrorAction $ea |
    Sort-Object Length -Descending |
    Select-Object -First $Nombre |
    ForEach-Object {
        [pscustomobject]@{
            Chemin       = $_.FullName
            TailleMo     = [math]::Round($_.Length / 1MB, 1)
            Proprietaire = (Get-Acl -LiteralPath $_.FullName -ErrorAction $ea).Owner
            Modifie      = $_.LastWriteTime
            Cree         = $_.CreationTime
        }
    }
# 3. Traitement : taille de chaque dossier de premier niveau
$dossiers = Get-ChildItem -LiteralPath $Racine -Directory -ErrorAction $ea |
    ForEach-Object {
        $sous = Get-ChildItem -LiteralPath $_.FullName -Recurse -File -ErrorAction $ea
        $somme = ($sous | Measure-Object Length -Sum).Sum
        [pscustomobject]@{
            Dossier  = $_.FullName
            TailleMo = [math]::Round($somme / 1MB, 1)
        }
    } |
    Sort-Object TailleMo -Descending
# 4. Export et message de fin
$f1 = Join-Path $Sortie "gros-fichiers-$h.csv"
$f2 = Join-Path $Sortie "tailles-dossiers-$h.csv"
$fichiers | Export-Csv -Path $f1 -NoTypeInformation -Encoding UTF8 -Delimiter ';'
$dossiers | Export-Csv -Path $f2 -NoTypeInformation -Encoding UTF8 -Delimiter ';'
Write-Output "Rapports : $f1 et $f2"

Extrait du rapport produit (lancement sur tout le volume, 15h29)

DossierTailleMo
E:\Temp_Migration92160
E:\Commun0
E:\Informatique0
CheminTailleMoPropriétaireCréé
E:\Temp_Migration\export_1.bak10240BUILTIN\Administrateurs14:45:06
E:\Temp_Migration\export_2.bak10240BUILTIN\Administrateurs14:45:06
E:\Temp_Migration\export_3.bak10240BUILTIN\Administrateurs14:45:06
… export_4.bak à export_9.bak, même taille, même heure

Ce que je défends dans ce script : il annonce « lecture seule » dès la première ligne, il vérifie la racine avant d'agir, ses paramètres permettent de le tester sur un petit dossier, et ses rapports horodatés gardent une preuve de l'état avant intervention.