Powershell: Automatisiertes Eintragen aller Baseboard Management Controller (BMC) in VMM

By | June 2, 2015

oder:
“Basispowermanagement und Grundlage für so vieles weiteres in System Center und VMM …”

Aufgabenstellung:
Starte mal alle Hosts der xyz Umgebung nach der Wartung der Stromversorgung am Wochenende wieder an!

Supi, per Browser auf jeden der zig Hosts gehen, dort anmelden und dann “Einschalten” drücken… Trauriges Smiley
Besser als jeden einzelnen Server im RZ besuchen, aber bleibt trotzdem ein stupide, langweiliger Praktikantenjob:

pic03122

(Fujitsu hat da auch eine zentralisierte Lösung, werden einige jetzt sagen, aber auch die ist leider nicht im Einsatz)

Aber VMM kann hier ja sicher helfen, denn genauso wie man VMs einschalten kann, kann man ausgeschaltete Hosts über einen einfachen Rechtsklick auf den Host auch einschalten:

image

Zumindest in der Theorie, weil bei dem Kunden sah das in VMM wie folgt aus:

image

Trauriges Smiley

Also alles außer “Restart” ausgegraut…schade eigentlich, ist aber leicht erklärt:
Diese Funktionalität ist abhängig von einem konfigurieren Baseboard Management Controller (BMC) in VMM und/oder hardwareseitig von einem vorhandenen iRMC (z.B. bei Fujitsu) oder iLO (z.B. bei HP) oder anderen IPMI bzw. SMASH kompatiblen Management Boards in den Hosts/Hardwareservern.

Einzutragen ist die IP des jeweiligen BMC dafür in den Eigenschaften jedes Hosts unter Hardware –> Advanced –> BMC Settings:

pic10585

An der Stelle kann über “Browse” hinter dem RunAs Account Feld und “Create Run As Account” auch gleich, wenn nicht schon vorher in VMM unter “Settings” erledigt, der entsprechend auf dem BMC konfigurierte und berechtigte “RunAs Account” erstellt werden. Dabei muss “User name” und “Password” dem im BMC (iRMC/iLO) konfiguriertem entsprechen.

Leider habe ich die Erfahrung gemacht, dass VMM 2012 R2 hier anscheinend immer noch (Stand: Juni 2015) einen kleinen Bug hat, der verhindert, dass die BMC Einstellungen aus der GUI auch wirklich übernommen werden.
Ein Klick auf “OK” führt also zuverlässig zum Zurücksetzen der BMC Settings auf  den unkonfigurierten Zustand, was etwas nervig ist. Mir ist es zwar nach mehrmaligem Versuchen dann gelungen die BMC IP und den User über die GUI zu Konfigurieren, aber es geht mit Powershell auch relativ einfach und ist, nicht nur wenn man das für zig Systeme machen will, auch deutlich praktischer und hat immer funktioniert, sprich wurde auch wirklich übernommen!

Ok, also wie kommt man am einfachsten an den entsprechenden Befehl?

Suchmaschine?
Viel zu aufwändig, da muss man ja wissen, wonach man sucht! Smiley

Nein, über die VMM GUI, indem man die gewünschte Konfiguration einstellt, dann aber nicht, durch einen klick auf OK ausführen lässt, sondern sich über den kleinen oft übersehenen Button unten Links “View Skript” das Powershell Skript anzeigen lässt, welches die gewünschte Konfiguration umsetzen würde!
Weil die GUI übersetzt auch nur alles in Powershell und lässt dann ein entsprechendes, automatisch erstelltes Skript für die eigentliche Konfiguration ablaufen!
(ist in Exchange und Co übrigens genauso und auch dort sehr praktisch um sich Skripte für automatisierte Konfigurationen zu “Klauen”)

Aber da wir nur die BMC Eigenschaften ändern wollen, reduzieren wir alles andere und überflüssige IDs einfach mal raus:

$vmHost = “Computername-des-Hardware-Hosts”
$bmcRunAsAccount = Get-SCRunAsAccount -Name “iRMC Adm”
Set-SCVMHost -VMHost $vmHost  -BMCProtocol “IPMI” -BMCAddress “192.168.34.11″ -BMCPort “623″
-BMCRunAsAccount $bmcRunAsAccount

Im Wesentlichen also der Set-SCVMHost Befehl mit Variablen gefüttert und gut ist.

Darauf aufbauend habe ich das Skript etwas erweitert, da ich ja nicht nur einen, sondern alle Hosts einer Domäne eintragen will.
Dabei habe ich mir Zunutze gemacht, dass der Kunde ein Namenskonzept für die Hosts und deren BMC hat:
Alle Host fangen mit C an und gehen mit einer Nummer weiter, die zugehörigen BMC Adapter mit einem I und dahinter dieselbe Nummer.
Also musste ich “nur” das C durch ein I ersetzen und dazu dann die passende IP abfragen! Ok…

# Alle Hosts einer Domain abfragen und in $Hosts speichern
$Hosts = Get-SCVMHost | ForEach-Object {$_.Computername}

# Für jeden dieser $Server in $Hosts folgende Schleife durchlaufen
ForEach ($Server in $Hosts)
{
# Windows Hostnamen in iRMC Hostnamen umwandeln (führendes “C”/”c” durch “I” ersetzen:
$irmc = $Server.ToUpper().Replace(“C”,”I”)

# IP Adressen des iRMC Adapters auslesen und in $ipAddresses speichern
$ipAddresses = [System.Net.Dns]::GetHostAddresses($irmc)
}

Soweit so gut.
Dann noch den SCVMhost Befehl oben in die Schleife einsetzen und mit den entsprechenden Variablen bei jedem Durchlauf füttern, sowie generell etwas “hübsch” machen:

<#
———————————————————————————
Add-BMCSet Skript
Fügt in SC VMM die Einstellungen für den iRMC Adapter der Hosts hinzu

#>

Clear-Host

# Dienstekonto “iRMC Administrator” muss in VMM vorhanden sein!
$bmcRunAsAccount = Get-SCRunAsAccount -Name “iRMC Adm”

# Alle Hosts einer Domain abfragen und in $Hosts speichern
$Hosts = Get-SCVMHost | ForEach-Object {$_.Computername}

# nur ein spezifischer Host (z.B. zum Testen des Skripts)
# $Hosts = “Host01″

# Für jeden dieser $Server in $Hosts folgende Schleife durchlaufen
ForEach ($Server in $Hosts)
{
# Windows Hostnamen in iRMC Hostnamen umwandeln (führendes “C”/”c” durch “I” ersetzen:
$irmc = $Server.ToUpper().Replace(“C”,”I”)

# IP Adressen des iRMC Adapters auslesen und in $ipAddresses speichern
$ipAddresses = [System.Net.Dns]::GetHostAddresses($irmc)

Write-Host iRMC Adresse von $Server lautet $irmc mit der IP $ipAddresses… -ForegroundColor Yellow
Write-Host

#iRMC Adapter in SC VMM Konfig des jeweiligen Host/Servers eintragen
Write-Host Setze iRMC Adresse für $Server auf $ipAddresses[0].IPAddressToString :  -ForegroundColor Yellow
Set-SCVMHost -VMHost $Server -BMCProtocol “IPMI” -BMCAddress $ipAddresses[0].IPAddressToString -BMCPort “623″ -BMCRunAsAccount $bmcRunAsAccount

}

Die Konfiguration eines BMC in VMM ist übrigens auch Voraussetzung für Bare Metal Deployment von Hosts und weiteren coolen Funktionalitäten die ein RZ erst richtig dynamisch und weitestgehend automatisierbar machen… aber dazu irgendwann später hoffentlich mal mehr an dieser Stelle! Smiley

Leave a Reply