Christoph_A4 10 Geschrieben 17. November 2014 Melden Teilen Geschrieben 17. November 2014 Hallo, ich bin gerade dabei ein Skript zu basteln, welches zur Automatisierung diverser Livemigration unter Hyper-V dient. Die Thematik HyperV steht aber vorerst hier gar nicht zur Debatte. Wir haben 6 physikalische HyperV-Server in einem Cluster. Ich möchte mit dem Ausführen des Skriptes ein Gleichgewicht der VMs herstellen, gemessen am Arbeitsspeicher der physikalischen Server. D.h. vor jeder VM-Livemigration soll eine Abfrage stattfinden, welcher Server zum gegenwärtigen Zeitpunkt die größten Speicherressourcen hat. Der Server mit der größten verfügbaren RAM-Kapazität soll die nächste VM erhalten. Das Problem im Detail: Ich habe folgendes Skript, welches mir bisher den freien physikalischen Arbeitsspeicher von jedem Server preisgibt und danach den maximalen Wert ausgibt: $Server_gesamt="server1","server2","server3" $free=foreach ($bla in $Server_gesamt) { (( Get-WMIObject Win32_OperatingSystem -ComputerName $bla).FreePhysicalMemory ) /1048576 } $free | measure-object -max Jetzt wird mir zwar der Maximalwert ausgegeben, allerdings ohne Bezug zum entsprechenden Server. Mir müsste das Ergebnis aussagen, welcher der drei Server mit diesem Maximalwert in Verbindung zu setzen ist. Ich hoffe ich konnte es einigermaßen klar darstellen und ihr könnt mir ein paar Ansätze liefern. Vielen Dank im Voraus. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 17. November 2014 Melden Teilen Geschrieben 17. November 2014 Hole dir doch von allen VM's den (belegten?) Speicher und sortiere diese Liste nach der Größe. Zitieren Link zu diesem Kommentar
Christoph_A4 10 Geschrieben 21. November 2014 Autor Melden Teilen Geschrieben 21. November 2014 Das ginge natürlich auch, aber meine grundsätzliche Frage bleibt dann doch auch bestehen. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 21. November 2014 Melden Teilen Geschrieben 21. November 2014 (bearbeitet) Wenn du dies wie oben machen willst würde ich das nicht mit measure-object machen, da dies, wie du schon gemerkt hast, auf den ganzen Script Block zählt und nicht auf ein Objekt. Du könntest dir ein Array bauen, dort Servername und Speicher eintragen und dann das, mit dem höchsten Wert aufgeben oder alle Systeme nach dem gewonnen Wert in $free suchen (dabei auch am besten immer ein Array bauen). Edit: Wieso teilst du durch 1048576? bearbeitet 21. November 2014 von Dukel Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 21. November 2014 Melden Teilen Geschrieben 21. November 2014 Hallo Christoph, Für solche Aufgabenstellungen bietet sich ein selbstdefiniertes [psobject] an $Names = @("SRV00","SRV01","SRV02") $Servers = @() ForEach($Name in $Names){ [psobject]$Server = "" | select ServerName,FreePhysicalMemory $Server.ServerName = $Name $FreePhysicalMemory = ((Get-WMIObject Win32_OperatingSystem -ComputerName $Name).FreePhysicalMemory) /1MB $Server.FreePhysicalMemory = $FreePhysicalMemory.Tostring("0.00") $Servers += $Server } #Alle Server $Servers | ft -auto #Maximum $Servers | sort -descending FreePhysicalMemory | select -first 1 ---- Ausgabe: ServerName FreePhysicalMemory ---------- ------------------ SRV00 5,41 SRV01 6,72 SRV02 5,26 ServerName FreePhysicalMemory ---------- ------------------ SRV01 6,72 blub Zitieren Link zu diesem Kommentar
Christoph_A4 10 Geschrieben 24. November 2014 Autor Melden Teilen Geschrieben 24. November 2014 Hallo blub, super, vielen Dank! Das war ein wertvoller Ansatz und Teil meines Skriptes, welches jetzt fertig gestellt ist. :-) Dukel: Auch Dir vielen Dank. Das ist der Divisor, um auf GB zu kommen. Zitieren Link zu diesem Kommentar
HaikoH 1 Geschrieben 18. Dezember 2014 Melden Teilen Geschrieben 18. Dezember 2014 Anmerkung: Man könnte auch "WERT /1GB" schreiben, statt das Gigabyte als "/1048576" zu beschreiben... Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.