VMware – VMs mit PowerCLI/PowerShell provisionieren

Wir arbeiten aktuell an einem kleinen Projekt, in dem wir einige VM-“Placeholder” erstellen müssen.

Konkret geht es um VMs ohne Disks. Man könnte das alles mittels GUI machen, allerdings gibt es da angenehmere Varianten. Hier eine kurze Herangehensweise wie man das mit der PowerCLI machen kann:

new-vm -Name "heiterbiswolkig"

Diese Zeile legt die VM “heiterbiswolkig” an. Der Rest der VM besteht aus Default-Settings (1 Core, 256MB RAM, 4GB HDD thick, 1 Network Adapter, OS = Windows XP).

Das diese Defaults nicht wirklich zu gebrauchen sind, ist klar und deshalb geben wir ein paar Parameter mehr mit:

new-vm -Name "heiterbiswolkig" -Datastore "datastore1" -NumCpu 2 -MemoryGB 2 -GuestId rhel7_64Guest -DiskGB 15 -DiskStorageFormat Thin -NetworkName "appl01"

Damit wird das schon alles konkreter. Unsere VM bekommt jetzt 2 Cores, 2 GB RAM und eine 15 GB thin provisionierte Disk. Außerdem hängt der Network Adapter schon in der richtigen Portgruppe und das OS ist auch korrekt gewählt.

Bzgl. des OS / GuestId Parameters: Die beste Übersicht welche GuestID auf welches OS mappt, habe ich hier gefunden: https://www.vmware.com/support/developer/converter-sdk/conv61_apireference/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html

Alle möglichen GuestId Values kann man sich mit dem folgenden Command anzeigen lassen (hier gefunden: https://communities.vmware.com/thread/529987):

[VMware.Vim.VirtualMachineGuestOsIdentifier].GetEnumValues()

 

Soviel zum Thema VM anlegen. Hier noch ein paar erweiterte Settings:

Netzwerk

Ich habe keinen Parameter gefunden, wie man direkt beim erstellen von VMs den Network Adapter Type definieren kann. Möchte man dediziert einen E1000 oder VMXNET3 Adapter verwenden, habe ich nur den Weg gefunden, dass man den Default-Adapter entfernt und dann den gewünschten Adapter hinzufügt. Braucht man übrigens mehr als eine Portgruppe in der VM, bietet sich eine Schleife an:

$myvm = get-vm -Name "heiterbiswolkig"
$vmnics = "appl01","dmz01"

# Remove all NICs from VM:
$myvm | Get-NetworkAdapter | Remove-NetworkAdapter -Confirm:$false


# Add a fresh VMXNET3 Adapter to VM + Portgroup placement:
foreach ($portgroup in $vmnics) {
   $myvm | New-NetworkAdapter -Type Vmxnet3 -NetworkName $portgroup -StartConnected:$true
}

 

Ressourcen reservieren

Wie im letzten Artikel beschrieben, wird ja immer ein Swap-File in der Größe des zugewiesen Memory angelegt. Eine Reservierung des Speichers verhindert das. Man kann das mit dem GUI machen, aber eben auch wie folgt (ohne Zeilenumbruch):

Get-VM -name "heiterbiswolkig" | Get-VMResourceConfiguration | Set-VMResourceConfiguration -MemReservationGB 2

Achtung: Nicht mehr reservieren als zugewiesen, sonst Error 🙂

 

Harddisk

Wir benötigen in unserem Setup keine Harddisk (stateless). Ich habe keine Möglichkeit gefunden eine VM ohne Disk anzulegen (Hier kommt uns der Default Wert von 4GB thick in die Quere).

Ich habe das dann ähnlich wie mit dem Netzwerk gelöst und die per Default angelegte Disk entfernt. Dabei ist wichtig, dass die Disk “permanently” gelöscht wird. Sonst wird das VMDK nur von der VM abgehangen und vegetiert weiterhin am Datastore herum:

$myvm = get-vm -Name "heiterbiswolkig"

$myvm | Get-HardDisk | Remove-HardDisk -DeletePermanently:$true -Confirm:$false

$myvm | New-HardDisk -Datastore "datastore1" -CapacityGB 3 -ThinProvisioned:$true

 

Boot up

Zu guter Letzt sollten wir die VM noch starten:

$myvm | Start-VM

 

Natürlich gibt es hier noch unendlich viele Möglichkeiten, aber ich wollte auch nur einen kurzen Überblick geben.

 

Bis demnächst.

Falk

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses Akismet to reduce spam. Learn how your comment data is processed.