PowerCLI: Show HBA Path Status *Updated*
Because our storage team was doing some upgrades lately they asked if I could the check the storage path status. We have 2 FC HBA’s per server which are connected to a seperate FC switch. Storage normally upgrades 1 path then we check to be sure before starting to upgrade the other path.
Got my inspiration from internet and credits go to them :
https://jfrmilner.wordpress.com/2011/08/27/checking-for-dead-paths-on-hbas-with-powercli/ * Used the output as a starting point where I want to go.
http://practical-admin.com/blog/powercli-show-hba-path-status/
* Pefect clean use of the get-view feature, only nasty part was the end
$result += "{0},{1},{2},{3},{4}" -f $view.Name.Split(".")[0], $hba, $active, $dead, $standby } } ConvertFrom-Csv -Header "VMHost", "HBA", "Active", "Dead", "Standby" -InputObject $result | ft -AutoSize
Which I changed by creating a new object.
$row = "" | Select VMhost,HBA,Active,Dead $row.VMhost = $view.Name.Split(".")[0] $row.HBA = $hba $row.Active = $active $row.Dead = $dead $result += $row } } $result|ft -AutoSize
This object then can easily be exported to CSV/Table whatever you like. It also can be easy to for a wrap up like I made at the end.
$result |Measure-Object -Property Active,Dead -Sum|select property,sum|ft -AutoSize
Especially in a larger environment you don’t have to keep scrolling to see where it failed, just look at the summary to see if you need to scroll up 🙂
cls function Check-DeadPaths{ <# .SYNOPSIS This function checks and reports path status .DESCRIPTION This function checks and reports path status .PARAMETER Outputfile Specify a output file, exported in CSV format. .EXAMPLE PS C:\> Check-DeadPaths -Outputfile "C:\temp\output.csv" .INPUTS System.String .OUTPUTS System.Collections.Hashtable #> [CmdletBinding( SupportsShouldProcess = $true, ConfirmImpact = "Low")] [OutputType([Hashtable])] param( [Parameter(Mandatory = $false)] [string]$Outputfile ) BEGIN { try { } catch { Throw } } PROCESS { try { if ($pscmdlet.ShouldProcess){ $views = Get-View -ViewType "HostSystem" -Property Name,Config.StorageDevice $result = @() foreach ($view in $views | Sort-Object -Property Name) { Write-Host "Checking" $view.Name $view.Config.StorageDevice.ScsiTopology.Adapter|Where-Object{ $_.Adapter -like "*FibreChannelHba*" } | ForEach-Object{ $active,$standby,$dead = 0 $key = $_.Adapter $wwn = $view.Config.StorageDevice.HostBusAdapter|Where-Object{$_.key -eq $key} $_.Target | ForEach-Object{ $_.Lun | ForEach-Object{ $id = $_.ScsiLun $multipathInfo = $view.Config.StorageDevice.MultipathInfo.Lun | ?{ $_.Lun -eq $id } $active = ([ARRAY]($multipathInfo.Path | ?{ $_.PathState -like "active" })).Count $standby = ([ARRAY]($multipathInfo.Path | ?{ $_.PathState -like "standby" })).Count $dead = ([ARRAY]($multipathInfo.Path | ?{ $_.PathState -like "dead" })).Count } } $row = "" | Select VMhost,HBA,PortWorldWideName,NodeWorldWideName,Active,Dead $row.VMhost = $view.Name.Split(".")[0] $row.HBA = $_.Adapter.Split("-")[2] $row.PortWorldWideName = "{0:X}" -f $wwn.PortWorldWideName $row.NodeWorldWideName = "{0:X}" -f $wwn.NodeWorldWideName $row.Active = $active $row.Dead = $dead $result += $row } } } } catch { [String]$returnMessage = "Failed to create Kibana dashboard for environment $Environment.`r`nScriptname: " + $_.InvocationInfo.ScriptName + "`r`nLine: " + $_.InvocationInfo.ScriptLineNumber + "`r`nError: " + $_.Exception.Message } $result|ft -AutoSize Write-Host "Total Wrap up:" $result |Measure-Object -Property Active,Dead -Sum|select property,sum|ft -AutoSize if ($outputfile){ $result|Export-Csv $outputfile -Confirm:$false -useculture -NoTypeInformation } END { try { return @{returnMessage = $returnMessage} } catch { Throw } } }
Hello. Great script. I do have a question. I would like to add wwn number to hba. how can i get this done?
thank you
Yes this is possible, as I was not sure which WWN you needed I added the PortWorldWideName and NodeWorldWideName to the output, hope this was one of the items you were looking for.
I edited the post with your requested information.
Yes Perfect. Thank you