Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Now that I have talked about displaying event log information and virtual machine health information; the next part of my status email is storage health information.
In my experience – the most common failure for my servers is a failed hard disk. Now, as I have multiple levels of redundancy configured in my storage configuration, it is not always obvious that a disk has failed. Luckily, it is very easy to get this information with PowerShell.
In fact, this is one of the primary reasons why I like using storage spaces. The great integration with PowerShell. Here is the code that I use to generate this table:
# Storage Health
$message = $message + "<style>TH{background-color:DarkGreen}TR{background-color:$($errorColor)}</style>"
$message = $message + "<B>Storage Health</B> <br> <br>"
$message = $message + "Physical Disk Health: <br>" + ((Get-PhysicalDisk | `
Select-Object @{Expression={$_.FriendlyName};Label="Physical Disk Name"}, `
@{Expression={$_.DeviceID};Label="Device ID"}, `
@{Expression={$_.OperationalStatus};Label="Operational Status"}, `
@{Expression={$_.HealthStatus};Label="Health Status"}, `
@{Expression={"{0:N2}" -f ($_.Size / 1073741824)};Label="Size (GB)"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>OK</td><td>Healthy</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"
$message = $message + "Storage Pool Health: <br>" + ((Get-StoragePool | `
where-object {($_.FriendlyName -ne "Primordial")} | `
Select-Object @{Expression={$_.FriendlyName};Label="Storage Pool Name"}, `
@{Expression={$_.OperationalStatus};Label="Operational Status"}, `
@{Expression={$_.HealthStatus};Label="Health Status"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>OK</td><td>Healthy</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"
$message = $message + "Virtual Disk Health: <br>" + ((Get-VirtualDisk | `
Select-Object @{Expression={$_.FriendlyName};Label="Virtual Disk Name"}, `
@{Expression={$_.OperationalStatus};Label="Operational Status"}, `
@{Expression={$_.HealthStatus};Label="Health Status"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>OK</td><td>Healthy</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"
Notes about this code:
- I am using “Get-PhysicalDisk”, “Get-StoragePool” and “Get-VirtualDisk” to gather the raw data.
- Once again - I use raw HTML to set the color of the table headers.
- Again - I run the output of these commands through Select-Object with the use of the “Expression” option to set column labels appropriately.
- Again - I use ConvertTo-HTML –Fragment to get a nice HTML table outputted.
- Again – I implement color coding for individual entries in the table. I set each table cell to be “red” by default. I then do some string parsing to see if the health is good – and switch the background color if I get a positive result.
Cheers,
Ben
Comments
- Anonymous
March 20, 2014
Can you explain how powershell get value for "HealthStatus" field in the "Get-PhysicalDisk" cmdlet? How PS determine that disk healthy or not?