Una gestione efficace dello spazio su disco è un aspetto fondamentale per mantenere un’infrastruttura IT efficiente e affidabile. Uno strumento potente nell’arsenale dei professionisti IT è PowerShell, un framework di automazione delle attività di Microsoft. Oggi analizzeremo uno script PowerShell progettato per il monitoraggio dello spazio su disco, in volumi condivisi in un ambiente cluster Hyper-V. Questo script è particolarmente utile per i professionisti IT e i fornitori di servizi gestiti (MSP) che devono garantire il funzionamento regolare dei loro sistemi ed evitare tempi di inattività dovuti a problemi di archiviazione.
Background
Il monitoraggio dello spazio su disco è fondamentale per evitare interruzioni impreviste e garantire che le applicazioni e i servizi funzionino senza interruzioni. I volumi condivisi in un cluster Hyper-V possono ospitare numerose virtual machine e l’esaurimento dello spazio può avere gravi conseguenze. Questo script PowerShell semplifica il processo di monitoraggio, consentendo agli amministratori di tenere sotto controllo lo spazio libero e di intervenire prima che si verifichino problemi.
Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V:
Requires -Version 5.1 <# .SYNOPSIS Hyper-V Monitor shared volume disk free space. Must be ran as a Local or Domain Admin user. .DESCRIPTION Hyper-V Monitor shared volume disk free space. Must be ran as a Local or Domain Admin user. .EXAMPLE (No Parameters) ## EXAMPLE OUTPUT WITHOUT PARAMS ## Name Path Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree ---- ---- -------- ------------- ------------- ----------- Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77 2900.21 9.99 PARAMETER: -MinimumPercentage 20 Only errors when any shared volume disk is below the specified percentage. Defaults to 10 percent. .EXAMPLE -MinimumPercentage 20 ## EXAMPLE OUTPUT WITH MinimumPercentage ## Name Path Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree ---- ---- -------- ------------- ------------- ----------- Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77 2900.21 9.99 PARAMETER: -MinimumFreeBytes 1073741824 Only errors when any shared volume disk is below the specified percentage. Defaults to 1GB or 1073741824 bytes. .EXAMPLE -MinimumFreeBytes 1073741824 ## EXAMPLE OUTPUT WITH MinimumFreeBytes ## Name Path Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree ---- ---- -------- ------------- ------------- ----------- Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77 2900.21 9.99 PARAMETER: -ExcludeDrivesByName MyDisk Excludes drives that contains the text MyDisk in its name. .EXAMPLE -ExcludeDrivesByName 1073741824 ## EXAMPLE OUTPUT WITH ExcludeDrivesByName ## Name Path Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree ---- ---- -------- ------------- ------------- ----------- Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77 2900.21 9.99 PARAMETER: -ExcludeDrivesByPath C:\ClusterStorage\MyDisk Excludes drives that contains the text MyDisk in its name. .EXAMPLE -ExcludeDrivesByPath C:\ClusterStorage\MyDisk .EXAMPLE -ExcludeDrivesByPath MyDisk ## EXAMPLE OUTPUT WITH ExcludeDrivesByPath ## Name Path Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree ---- ---- -------- ------------- ------------- ----------- Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77 2900.21 9.99 PARAMETER: -CustomFieldParam "ReplaceMeWithAnyMultilineCustomField" Saves the results to a multi-line string custom field. .EXAMPLE -CustomFieldParam "ReplaceMeWithAnyMultilineCustomField" ## EXAMPLE OUTPUT WITH CustomFieldParam ## Name Path Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree ---- ---- -------- ------------- ------------- ----------- Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77 2900.21 9.99 .OUTPUTS None .NOTES Minimum OS Architecture Supported: Windows Server 2016 Release Notes: Initial Release By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). #> [CmdletBinding()] param ( [int]$MinimumPercentage = 10, $MinimumFreeBytes = 1GB, [String]$ExcludeDrivesByName, [String]$ExcludeDrivesByPath, [string]$CustomFieldParam ) begin { function Test-IsElevated { $id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $p = New-Object System.Security.Principal.WindowsPrincipal($id) $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) } function Test-IsSystem { $id = [System.Security.Principal.WindowsIdentity]::GetCurrent() return $id.Name -like "NT AUTHORITY*" -or $id.IsSystem } function Get-FriendlySize { param($Bytes) # Converts Bytes to the highest matching unit $Sizes = 'Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ',' for ($i = 0; ($Bytes -ge 1kb) -and ($i -lt $Sizes.Count); $i++) { $Bytes /= 1kb } $N = 2 if ($i -eq 0) { $N = 0 } if ($Bytes) { "$([System.Math]::Round($Bytes,$N)) $($Sizes[$i])" }else { "0 B" } } function Get-Size { param ( [string]$String, [ValidateSet("PB", "TB", "GB", "MB", "KB", "B", "Bytes")][string]$DefaultSize = "GB" ) switch -wildcard ($String) { '*PB' { [int64]$($String -replace '[^\d+]+') * 1PB; break } '*TB' { [int64]$($String -replace '[^\d+]+') * 1TB; break } '*GB' { [int64]$($String -replace '[^\d+]+') * 1GB; break } '*MB' { [int64]$($String -replace '[^\d+]+') * 1MB; break } '*KB' { [int64]$($String -replace '[^\d+]+') * 1KB; break } '*B' { [int64]$($String -replace '[^\d+]+') * 1; break } '*Bytes' { [int64]$($String -replace '[^\d+]+') * 1; break } Default { Get-Size -String "$String $DefaultSize" } } } function Invoke-FilterDisks { [CmdletBinding()] param( [parameter(ValueFromPipeline = $true)] $Disks ) process { $Disks | ForEach-Object { # Check if exclude by name is needed if ($([string]::IsNullOrEmpty($ExcludeDrivesByName) -or [string]::IsNullOrWhiteSpace($ExcludeDrivesByName))) { $_ } else { if ( $_.Name -like "*$ExcludeDrivesByName*" ) { # Output Nothing } else { $_ } } } | ForEach-Object { # Check if exclude by name is needed if ($([string]::IsNullOrEmpty($ExcludeDrivesByPath) -or [string]::IsNullOrWhiteSpace($ExcludeDrivesByPath))) { $_ } else { if ( $_.Path -like "*$ExcludeDrivesByPath*" ) { # Output Nothing } else { $_ } } } } } if ($env:MinimumPercentage) { $MinimumPercentage = $env:MinimumPercentage } if ($env:minimumFreeSpace) { $MinimumFreeBytes = Get-Size -String $env:minimumFreeSpace } if ($env:ExcludeDrivesByName) { $ExcludeDrivesByName = $env:ExcludeDrivesByName } if ($env:ExcludeDrivesByPath) { $ExcludeDrivesByPath = $env:ExcludeDrivesByPath } if ($env:CustomFieldParam) { $CustomFieldParam = $env:CustomFieldParam } } process { if (Test-IsSystem) { Write-Error -Message "Access Denied. Please run with a Domain Account or a Local Account that has permissions to access this node." exit 1 } if (-not (Test-IsElevated)) { Write-Error -Message "Access Denied. Please run with Administrator privileges." exit 1 } Import-Module FailoverClusters -ErrorAction SilentlyContinue if (-not $(Get-Command -Name "Get-Cluster" -ErrorAction SilentlyContinue)) { Write-Error "[Error] Must run this script on a server that is apart of a Cluster or can communicate with a Cluster." exit 1 } try { Get-ClusterNode -ErrorAction Stop | Out-Null } catch { Write-Error "[Error] Failed to get Cluster Nodes." exit 1 } # Get Cluster Shared Volume Info $Volumes = foreach ( $csv in $(Get-ClusterSharedVolume) ) { foreach ( $csvinfo in $($csv | Select-Object -Property Name -ExpandProperty SharedVolumeInfo) ) { [PSCustomObject]@{ Name = $csv.Name Path = $csvinfo.FriendlyVolumeName Size = $csvinfo.Partition.Size FreeSpace = $csvinfo.Partition.FreeSpace UsedSpace = $csvinfo.Partition.UsedSpace PercentFree = $csvinfo.Partition.PercentFree } } } # Prep Format-Table substitutions $Size = @{ Label = "Size(GB)" ; Expression = { (Get-FriendlySize -Bytes $_.Size) } } $FreeSpace = @{ Label = "FreeSpace(GB)" ; Expression = { (Get-FriendlySize -Bytes $_.FreeSpace) } } $UsedSpace = @{ Label = "UsedSpace(GB)" ; Expression = { (Get-FriendlySize -Bytes $_.UsedSpace) } } $PercentFree = @{ Label = "PercentFree" ; Expression = { ($_.PercentFree) } } # Sort disks by FreeSpace $Disks = $Volumes | Sort-Object FreeSpace # Save results as a string $DisksFormattedString = $Disks | Format-Table -AutoSize Name, Path, $Size, $FreeSpace, $UsedSpace, $PercentFree | Out-String # If using a custom field sent that to the specified custom field, should be a multi-line if ($CustomFieldParam) { Ninja-Property-Set -Name $CustomFieldParam -Value $DisksFormattedString } # Loop through each disk $DiskUnderPercentage = $Disks | Invoke-FilterDisks | Where-Object { $_.PercentFree -lt $MinimumPercentage } $DiskUnderFreeBytes = $Disks | Invoke-FilterDisks | Where-Object { $_.FreeSpace -lt $MinimumFreeBytes } if ($DiskUnderPercentage -or $DiskUnderFreeBytes) { if ($DiskUnderPercentage) { Write-Host "[Issue] One or more Disks under $MinimumPercentage % free!" } if ($DiskUnderFreeBytes) { Write-Host "[Issue] One or more Disks under $(Get-FriendlySize -Bytes $MinimumFreeBytes) free!" } $DisksFormattedString | Write-Host exit 1 } # List all shared volumes if (-not $DiskUnderPercentage) { Write-Host "[Info] One or more Disks over $MinimumPercentage % free." } if (-not $DiskUnderFreeBytes) { Write-Host "[Info] One or more Disks over $(Get-FriendlySize -Bytes $MinimumFreeBytes) free." } $DisksFormattedString | Write-Host exit 0 } end { }
Analisi dettagliata
Analizziamo lo script passo per passo per capire le sue funzionalità e come può essere utilizzato in modo efficace per il monitoraggio dello spazio su disco in ambiente Hyper-V.
1. Prerequisiti e configurazione iniziale Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V richiede PowerShell versione 5.1 e deve essere eseguito con privilegi amministrativi. Si inizia con la definizione di vari parametri come MinimumPercentage, MinimumFreeBytes, ExcludeDrivesByName, ExcludeDrivesByPath e CustomFieldParam.
2. Funzioni per il controllo dei privilegi e il calcolo delle dimensioni
- Test-IsElevated controlla se lo script è in esecuzione con privilegi di amministratore.
- Test-IsSystem assicura che lo script non venga eseguito come account di sistema.
- Get-FriendlySize e Get-Size convertono i valori dei byte in unità più leggibili come KB, MB, GB, ecc.
3. Filtraggio e variabili d’ambiente Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V imposta le funzioni per filtrare le unità in base ai nomi o ai percorsi specificati. Controlla anche la presenza di variabili d’ambiente che potrebbero sovrascrivere i parametri dello script.
4. Recupero delle informazioni su cluster e volumi Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V importa il modulo FailoverClusters e verifica che sia in esecuzione su un server che fa parte di un cluster. Quindi recupera le informazioni sui volumi condivisi nel cluster, come le dimensioni, lo spazio libero, lo spazio utilizzato e la percentuale di spazio libero.
5. Formattazione e output Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V formatta le informazioni sul disco per renderle leggibili e controlla se i volumi sono al di sotto delle soglie di spazio libero specificate. Se vengono rilevati dei problemi, vengono forniti i dettagli e lo script esce con uno stato di errore. Altrimenti, conferma che tutti i volumi hanno spazio libero sufficiente.
Casi d’uso potenziali
Immagina un amministratore IT responsabile di un cluster Hyper-V che ospita virtual machine critiche. L’amministratore può utilizzare lo script per automatizzare il monitoraggio dello spazio su disco, assicurandosi di essere avvisato prima che i volumi abbiano troppo poco spazio disponibile. Questo approccio proattivo consente di allocare spazio di archiviazione aggiuntivo o di eliminare i file non necessari, evitando potenziali interruzioni e mantenendo le prestazioni del sistema.
Confronti
Rispetto al monitoraggio manuale o all’utilizzo di strumenti integrati di base, questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V offre un approccio più automatizzato e dettagliato. Non solo controlla lo spazio libero, ma consente anche la personalizzazione in base ai nomi dei volumi, ai percorsi e ai requisiti specifici di spazio libero. Altri metodi, come gli strumenti di monitoraggio di terze parti, possono offrire funzionalità simili, ma spesso hanno costi più elevati e richiedono una configurazione aggiuntiva.
Domande frequenti
D: Questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V può essere eseguito su qualsiasi versione di Windows Server?
R: Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V supporta Windows Server 2016 e versioni successive a causa dei requisiti del modulo FailoverClusters.
D: Quali permessi sono necessari per eseguire questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V?
R: Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V deve essere eseguito con privilegi di amministratore locale o di dominio per accedere alle informazioni necessarie sul cluster.
D: Come posso escludere volumi specifici dal monitoraggio?
R: Puoi utilizzare i parametri ExcludeDrivesByName o ExcludeDrivesByPath per filtrare volumi specifici in base ai loro nomi o percorsi.
Implicazioni
I risultati di questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V possono avere un impatto significativo sulle operazioni IT. Identificando i volumi con spazio libero insufficiente, gli amministratori possono adottare misure preventive per evitare interruzioni del servizio. Questo monitoraggio proattivo migliora anche l’affidabilità e le prestazioni complessive del sistema, contribuendo a rendere più stabile l’ambiente IT.
Raccomandazioni
Quando utilizzi questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V, tieni in considerazione le seguenti best practice:
- Pianifica l’esecuzione dello script per il monitoraggio dello spazio su disco in ambiente Hyper-V a intervalli regolari utilizzando Task Scheduler o strumenti simili.
- Personalizza i parametri in base alle esigenze specifiche del tuo ambiente.
- Assicurati di disporre di autorizzazioni sufficienti e di eseguire lo script sui server appropriati.
Considerazioni finali
Gli script PowerShell come questo per il monitoraggio dello spazio su disco in ambiente Hyper-V sono strumenti preziosi per i professionisti IT e gli MSP, in quanto offrono potenti funzionalità di automazione per gestire e monitorare i sistemi critici. Incorporando tali script nei loro flussi di lavoro, gli amministratori possono mantenere un migliore controllo sulla loro infrastruttura, garantire prestazioni ottimali e prevenire potenziali problemi prima che si aggravino.
NinjaOne, software leader per le operazioni IT, può migliorare ulteriormente questo processo integrando l’esecuzione degli script con le sue funzionalità di monitoraggio e gestione, fornendo una soluzione completa per la gestione dell’infrastruttura IT.