Letzte Woche musste ich eine große VMware vSphere Umgebung auf Konfigurationsprobleme und Risiken hin analysieren. Installierte VMware ESXi VIBs vergleichen um sicherzustellen, dass nicht nur der ESXi Kernel sondern wirklich alle Pakete (VIB) auf den ESXi Hosts identisch sind, ist eine Herausforderung bei entsprechender Hostanzahl aber ein wichtiger Teil bei einer solchen Analyse. Ein ungenutztes (nicht geladenes) Treiber Paket mag vielleicht kein großes Problem sein, aber unterschiedliche Netzwerkkarten Treiber in einem VMware NSX aktivierten Cluster ist hingegen ein gewaltiges Risiko für die Stabilität der Umgebung.
Die Funktion – Installierte VMware ESXi VIBs vergleichen
Der eigentliche Vergleich der ESXi VIBs basiert auf dem PowerShell Cmdlet Compare-Object:
The
Compare-Object
cmdlet compares two sets of objects. One set of objects is the „reference set,“ and the other set is the „difference set.“
Meine Arbeit war es quasi nur, die Daten für den Vergleich zu erfassen. Dafür verwende ich das VMware PowerCLI Cmdlet Get-ESXCLI -V2 um alle installierten VIBs in einem Array aufzulisten.
Die Funktion akzeptiert als Eingabe für den vSphere Cluster, der zu verifizierenden Host, nur ein einzelnes Objekt. Sollen mehrere Cluster gegen den Referenzhost geprüft werden, können diese per Pipe eingegeben werden: Get-Cluster | Validate-ESXiPackages -RefernceHost $(Get-VMHost „<Hostname>“)
In den vorherigen Beispielen fehlt in der Ausgabe immer die VibDiffSideIndicator Eigenschaft. Diese zusätzliche Information soll aufzeigen ob das Paket auf dem Referenzhost oder dem dagegen geprüften Host fehlt. Eine genauer Beschreibung findet sich direkt in der Compare-Object Dokumentation:
The result of the comparison indicates whether a property value appeared only in the object from the reference set (indicated by the <= symbol), only in the object from the difference set (indicated by the
=>
symbol) or, …
In meinem Beispiel ist das NSX-V VIB nicht auf dem Referenzhost installiert aber auf dem geprüften Host zusätzlich vorhanden:
function Validate-ESXiPackages { <# .DESCRIPTION Compares all ESXi Host VIBs within a vSphere with a reference Hosts. .NOTES File Name : Validate-ESXiPackages.ps1 Author : Markus Kraus Version : 1.0 State : Ready .LINK https://mycloudrevolution.com/ .EXAMPLE Validate-ESXiPackages -Cluster (Get-Cluster | Select-Object -First 1) -RefernceHost (Get-VMHost | Select-Object -First 1) .PARAMETER Cluster vSphere Cluster to verify .PARAMETER RefernceHost The VIB Reference ESXi Host #> [CmdletBinding()] param( [Parameter(Mandatory=$True, ValueFromPipeline=$True, HelpMessage="vSphere Cluster to verify")] [ValidateNotNullorEmpty()] [VMware.VimAutomation.ViCore.Impl.V1.Inventory.ComputeResourceImpl] $Cluster, [Parameter(Mandatory=$True, ValueFromPipeline=$false, HelpMessage="The VIB Reference ESXi Host")] [ValidateNotNullorEmpty()] [VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl] $RefernceHost ) Process { #region: Get reference VIBs $EsxCli2 = Get-ESXCLI -VMHost $RefernceHost -V2 $RefernceVibList = $esxcli2.software.vib.list.invoke() #endregion #region: Compare reference VIBs $MyView = @() foreach ($VmHost in ($Cluster | Get-VMHost)) { $EsxCli2 = Get-ESXCLI -VMHost $VmHost -V2 $VibList = $esxcli2.software.vib.list.invoke() [Array]$VibDiff = Compare-Object -ReferenceObject $RefernceVibList.ID -DifferenceObject $VibList.ID if($VibDiff.Count -gt 0) { $VibDiffSideIndicator = @() foreach ($Item in $VibDiff) { $VibDiffSideIndicator += $($Item.SideIndicator + " " + $Item.InputObject) } } else { $VibDiffSideIndicator = $null } $Report = [PSCustomObject] @{ Host = $VmHost.Name Version = $VmHost.Version Build = $VmHost.Build VibDiffCount = $VibDiff.Count VibDiff = $VibDiff.InputObject VibDiffSideIndicator = $VibDiffSideIndicator } $MyView += $Report } #endregion $MyView } }
Wo ist die Funktion zu finden
Die Validate-ESXiPackages Funktion ist Teil meines vSphere-Modules GitHub Repository. Direkter Linkt zu der Funktion: Validate-ESXiPackages.psm1
Falls mein Pull Request angenommen wird, ist die Funktion auch in dem VMware PowerCLI-Example-Scripts GitHub Repository zu finden.