build 65d0a3ad | content blog-content@c8490fa · 338 posts | profiles 20 · corpus 228 | 0 skipped |
Scripting · 2017-10-05

Advanced Settings der ESXi Hosts gegen den VMware-Standard prüfen

Über die Jahre und Releases hinweg ändern sich die Best Practices von VMware. Deshalb gehören die gesetzten Advanced Settings bei jedem Release auf den Prüfstand.

2017-10-05Datum
Dario DörflingerAutor
2Min. Lesezeit
450words
no translation reviewed
Themen capabilities · idf weight Automation automation 1.80
Hersteller vendors · idf weight VMware vmware 0.89

Dieser Beitrag ist von 2017. Er bleibt online, weil er nach wie vor nachgefragt wird, beschreibt aber einen Produktstand von damals.

Über die Jahre und Releases hinweg ändern sich die Best Practices von VMware. Früher mussten wir eine Menge Advanced Settings setzen, damit eine gewünschte Funktion lief oder damit dem VMware Admin das Leben etwas leichter fiel.

Die Sache mit diesen Einstellungen: Du solltest sie bei jedem Release prüfen. Braucht es sie noch? Sind sie deprecated? Verhält sich das System immer noch gleich, wenn sie gesetzt sind?

Damit diese Prüfung leichter fällt, habe ich ein kleines Script geschrieben. Für Advanced Settings gibt es das Cmdlet «Get-AdvancedSetting». Ich habe aber festgestellt, dass es die Standardwerte nicht liefert, sondern nur Name und aktuellen Wert. Also hole ich die Advanced Settings über eine esxcli-Instanz. ESXCLI liefert genau diese wertvolle Information über die Standardwerte, als String oder Int.

Ich lese also alle Advanced Settings eines Hosts ein. Dann filtere ich ein paar Einstellungen heraus, die nicht im Report auftauchen sollen, weil ich weiss, warum ich sie gesetzt habe, und sie behalten will. Danach wird jeder Wert mit seinem Standardwert verglichen. Stimmen sie überein, fliegt auch dieser Eintrag heraus.

Am Ende habe ich eine Liste aller Einstellungen über alle Hosts, die nicht auf dem Standardwert stehen. Die kann ich dann in der Dokumentation nachschlagen und entweder auf den Standard zurücksetzen, falls ich sie nicht mehr brauche, oder in meinen Filter aufnehmen, wenn sie so bleiben sollen.

Update: Dieses Script liegt inzwischen auf GitHub.

Hier ist das Script:

<#
.EXAMPLE
    C:\foo> .\Get-AdvancedSettingsNotDefault.ps1 -hostName esx01.virtualfrog.lab -delta:$true

	Description
	-----------
	Gets All settings that are not at default value from given host
.EXAMPLE
    C:\foo> .\Get-AdvancedSettingsNotDefault.ps1 -delta:$true

    Description
    -----------
    Gets All settings from all hosts that are not at default value
.EXAMPLE
    C:\foo> .\Get-AdvancedSettingsNotDefault.ps1 -delta:$false

    Description
    -----------
    Gets All settings from all hosts
#> 

param (
	[Parameter(Mandatory=$False)]
	[string]$hostName="none",
    [Parameter(Mandatory=$False)]
    [boolean]$delta=$false
)

$excludedSettings = "/Migrate/Vmknic|/UserVars/ProductLockerLocation|/UserVars/SuppressShellWarning"
$AdvancedSettings = @()
$AdvancedSettingsFiltered = @()

# Checking if host exists
if ($hostName -ne "none") {
   try {
        $vmhost = Get-VMHost $hostName -ErrorAction Stop
    } catch {
        Write-Host -ForegroundColor Red "There is no host available with name" $hostName
        exit
    } 

    # Retrieving advanced settings
    $esxcli = $vmhost | get-esxcli -V2
    $AdvancedSettings = $esxcli.system.settings.advanced.list.Invoke(@{delta = $delta}) |select @{Name="Hostname"; Expression = {$vmhost}},Path,DefaultIntValue,IntValue,DefaultStringValue,StringValue,Description

    # Displaying results
    #$AdvancedSettings

} else {
    $vmhosts = get-vmhost
    foreach ($vmhost in $vmhosts) {
        $esxcli = $vmhost | get-esxcli -V2
        $AdvancedSettings += $esxcli.system.settings.advanced.list.Invoke(@{delta = $delta}) |select @{Name="Hostname"; Expression = {$vmhost}},Path,DefaultIntValue,IntValue,DefaultStringValue,StringValue,Description
    }
    #$AdvancedSettings
}

# Browsing advanced settings and check for mismatch
ForEach ($advancedSetting in $AdvancedSettings.GetEnumerator()) {
    if ( ($AdvancedSetting.Path -notmatch $excludedSettings) -And (($AdvancedSetting.IntValue -ne $AdvancedSetting.DefaultIntValue) -Or ($AdvancedSetting.StringValue -notmatch $AdvancedSetting.DefaultStringValue) ) ){
        $line = "" | Select Hostname,Path,DefaultIntValue,IntValue,DefaultStringValue,StringValue,Description
        $line.Hostname = $advancedSetting.Hostname
        $line.Path = $advancedSetting.Path
        $line.DefaultIntValue = $advancedSetting.DefaultIntValue
        $line.IntValue = $advancedSetting.IntValue
        $line.DefaultStringValue = $advancedSetting.DefaultStringValue
        $line.StringValue = $advancedSetting.StringValue
        $line.Description = $advancedSetting.Description
        $AdvancedSettingsFiltered += $line
    }
}
$AdvancedSettingsFiltered

Passt ausserdem