Installierte VMware ESXi VIBs vergleichen

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.

Installierte VMware ESXi VIBs vergleichen - Result

Um einen genaueren Einblick in die verwendeten Netzwerkkarten Treiber und deren Firmware zu bekommen habe ich eine weitere PowerShell Funktion geschrieben: Get-NICDetails.psm1 (Blog Artikel: Script – Get ESXi NIC Firmware and Driver Details).

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>“)

Installierte VMware ESXi VIBs vergleichen - Result multiple clusters

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:

Installierte VMware ESXi VIBs vergleichen - VibDiffSideIndicator

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.

Leave a Reply