Storage Spaces Direct (S2D) Monitoring mit PowerShell: Regelmäßig (Windows Aufgabenplanung) verschiedene Health-Checks ausführen und bei erkannten Problemen eine E-Mail senden.
Das nachstehende Script überwacht meinen Windows Server 2019 S2D-Cluster. Da glücklicherweise nicht alle vom Script erkennbaren Probleme eingetreten sind, hat das Script allerdings nur Beta-Status! D.h. es kann sein, dass nicht alles richtig erkannt/ausgewertet und somit gesendet werden!
Das Script sollte regelmäßig (z.B. stündlich) über die Windows Aufgabenplanung ausgeführt werden. Die Einstellungen müssen natürlich entsprechend angepasst werden!
# Einstellungen
$clusterName = "CLUSTERNAME"
$mailTo = "empfaenger@domain.at"
$mailFrom = "absender@domain.at"
$mailSubject = "S2D-Status"
$mailSMTP = "smtp.domain.at"
# Mail-HTML-Header
$mailHtmlHeader = @"
<style>
body, td {font-size:14px;}
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
H2 {font-size:18px;}
</style>
"@
# Cluster-Nodes ermitteln
$allClusterNodes = Get-ClusterNode -Cluster $clusterName
# Cluster-Nodes online/offline
$onlineClusterNodes = @()
$offlineClusterNodes = @()
foreach ($clusterNode in $clusterNodes){
if(Test-Connection $clusterNode -Count 2 -Quiet){
# Cluster-Node online
$onlineClusterNodes += $clusterNode
} else {
# Cluster-Node offline
$offlineClusterNodes += $clusterNode
}
}
# StoragePool HealthStatus
$unHealthyStoragePool = Get-StoragePool -CimSession $clusterName -IsPrimordial $false | where HealthStatus -ne Healthy
# Degraded Storage
$degradedStorage = $onlineClusterNodes | Get-ClusterPerf -CimSession $clusterName -ClusterNodeSeriesName ClusterNode.Storage.Degraded | where value -ne 0
# Storage Jobs
$storageJobs = Get-StorageJob -CimSession $clusterName
# Physische Datenträger
$physicalDisks = Get-StoragePool -IsPrimordial $false | Get-PhysicalDisk | Select Model, Manufacturer, FirmwareVersion,HealthStatus | where HealthStatus -ne "Healthy" | sort model
# Ausgabe
$sendMail = $false
$mailbody = " "
$mailbody | ConvertTo-Html -Head $mailHtmlHeader
if(($offlineClusterNodes | Out-String) -ne ""){
$mailbody += "<h2>Cluster-Nodes offline</h2>"
$mailbody += $offlineClusterNodes | ConvertTo-Html -Property NodeName
$sendMail = $true
}
if(($unHealthyStoragePool | Out-String) -ne ""){
$mailbody += "<h2>StoragePool unhealthy</h2>"
$mailbody += $unHealthyStoragePool | ConvertTo-Html -Property FriendlyName,OperationalStatus,HealthStatus
$sendMail = $true
}
if(($degradedStorage | Out-String) -ne ""){
$mailbody += "<h2>StoragePool degraded</h2>"
$mailbody += $degradedStorage | ConvertTo-Html -Property Series,Time,Value,Unit
$sendMail = $true
}
if(($storageJobs | Out-String) -ne ""){
$mailbody += "<h2>Storage Jobs</h2>"
$mailbody += $storageJobs | ConvertTo-Html -Property Name,ElapsedTime,JobState,PercentComplete,IsBackgroundTask
$sendMail = $true
}
if(($physicalDisks | Out-String) -ne ""){
$mailbody += "<h2>Physical Disks</h2>"
$mailbody += $physicalDisks | ConvertTo-Html -Property Model,Manufacturer,FirmwareVersion,HealthStatus
$sendMail = $true
}
# Bei Fehlern Mail senden
if($sendMail -eq $true){
Send-MailMessage -To $mailTo -From $mailFrom -Subject $mailSubject -SmtpServer $mailSMTP -Body $mailBody -BodyAsHtml -encoding ([System.Text.Encoding]::UTF8)
}
Code-Sprache: PHP (php)
Mehr Infos: Get-ClusterPerf, Get-PhysicalDisk, Get-StorageJob, Get-StoragePool, Send-MailMessage