Virtuelle Maschinen in Azure erstellen und verwalten mit PowerShell

    Azure Virtual MachineDas Azure-Portal bietet eine gra­fische Benutzer­ober­fläche für das An­legen und das Manage­ment von virtu­ellen Maschinen. Will man jedoch eine größere Zahl an VMs ver­walten, dann erweist sich PowerShell auch hier der GUI überlegen. Das Az-Modul enthält unter anderem die Be­fehle für das VM-Management.

    Wie üblich, kann man sich alle im Modul Az.Compute verfügbaren Befehle über Get-Command anzeigen lassen. Momentan gibt der Befehl

    Get-Command -Module Az.Compute

    190 Cmdlets aus.

    Cmdlets anzeigen, die im PowerShell-Modul Az.Compute enthalten sind.

    Je nach geplanter Aufgabe kann man bei der Suche nach einem bestimmten Befehl das Verb für den gewünschten Zweck spezifizieren. Zur Auswahl stehen hierbei New, Get, Remove oder Set:

    Get-Command -Module Az.Compute -Verb New

    Des Weiteren lässt sich die Ausgabe mit Wildcards auf bestimmte Namen einschränken:

    Get-Command -Module Az.Compute -Verb New -Noun "VM*"

    Erstellen einfacher VMs

    Jede neue Ressource in Azure benötigt zwingend einen Namen, eine Ressourcen­gruppe und eine Location. Eine VM verlangt zudem noch

    • ein Image, auf welchem sie basiert
    • eine Größe
    • eine OsDisk für das Betriebs­system
    • ein virtuelles Netzwerk mit Subnetz
    • eine Netzkarte zur Kommunikation mit der Außenwelt

    Letztere ist eine externe Ressource in Azure und wird nicht als virtuelle Hardware in die VM integriert.

    Neue Maschinen generiert man grundsätzlich mit dem Befehl New-AzVM, der neben der Location und Ressourcen­gruppe auch ein virtuelles Maschinen­objekt als Argument erwartet. Ein solches erzeugt man mit dem Cmdlet New-AzVMConfig.

    In der einfachsten Variante erstellt es eine Basis­konfiguration, welche man in einer Variablen speichert:

    $VM = New-AzVMConfig -VMName MyVM -VMSize Standard_D2s_v3

    Neue Basiskonfiguration für eine Azure-VM erstellen mit New-AzConfig

    Diese Grund­konfiguration lässt sich mit weiteren Befehlen beliebig anpassen. Unbedingt benötigt werden das bereits vorhandene HardwareProfile sowie die Kompo­nenten NetworkProfile, OsProfile sowie StorageProfile.

    • NetworkProfile wird über ein Netzwerk-Interface mit
      Add-VMNetworkInterface gesetzt.
    • StorageProfile legt man über ein Basis-Image mit
      Set-AzVMSourceImage fest.
    • OsProfile erzeugt man durch Einstellen des Betriebs­systems mit
      Set-AzVMOperatingSystem.

    Weitere Konfigurations­möglichkeiten ergeben sich über Befehle wie Set-DataDisk, Set-OSDisk oder Set-AzVMPlan.

    Netzwerk-Interface zu VM hinzufügen

    Um der VM ein Netzwerk-Interface hinzufügen zu können, muss dieses natürlich erst erstellt werden. Voraussetzung dafür ist ein bereits bestehendes virtuelles Netzwerk oder die Bereit­stellung einer komplett neuen Ressourcen­gruppe inklusive einem virtuellen Netzwerk.

    Der folgende Befehl demonstriert die Variante über eine neue Ressourcen­gruppe:

    Das Instanziieren des Netzwerk-Interfaces erfolgt durch New-AZNetworkInterface. Das zusätzlich benötigte Subnetz wird über Get-AzVirtualNetworkSubnetConfig abgegriffen. Ein anschließendes Hinzufügen zur VM-Konfiguration setzt das NetworkProfile:

    Storage-Profil definieren

    Zum Setzen des StorageProfile kann jedes verfügbare Systemabbild dienen, im folgenden Beispiel ein Image von Windows Server 2019 Datacenter:

    Set-AzVMSourceImage -VM $VM -PublisherName MicrosoftWindowsServer `
    -Offer WindowsServer -Skus 2019-Datacenter -Version Latest

    Der Administrator wird beim Definieren des Betriebs­systems mit Set-AzVMOperatingSystem als PSCredential-Objekt übergeben und somit das OSProfile bestimmt.

    Bei der Ausgabe des VM-Objekts sollten nun HardwareProfile, OsProfile, NetworkProfile und StorageProfile vorhanden sein. Durch Zugriff auf die Variable $VM kann man diese Komponenten beliebig inspizieren.

    Ausgabe der VM-Eigenschaften, die in der Variablen $VM gespeichert sind.

    Bei genauerer Betrachtung der Storage-Komponente sieht man, dass zwar ein Image gesetzt ist, jedoch fehlt unter OSDisk noch ein Laufwerk für das Betriebs­system. Spezifiziert man dieses nicht, dann wird ein solches bei der Bereitstellung automatisch generiert.

    Um das Anlegen der VM zu ver­einfachen, sollte man die standard­mäßig aktivierten BootDiagnostics abschalten:

    Set-AzVMBootDiagnostic -VM $VM -Disable

    Sie gewähren Einblicke in die Maschine während des Bootvorgans, benötigen aber noch einen zusätzlichen Storage-Account.

    Zum Schluss übergeben wir die VM an New-AzVM und leiten dadurch die Bereitstellung ein:

    New-AzVM -VM $VM -ResourceGroupName MyVMGroup -Location westeurope

    Parameter als Hashtable an New-AzVM übergeben

    Das Cmdlet New-AzVM besitzt auch einige Simple-Parameter, die eine direkte Erstellung einer VM ermöglichen. Um hierbei nicht alle Argumente in einer Zeile schreiben zu müssen und die Übersicht zu bewahren, ist es vorteilhaft, diese als Hashmap zu übergeben. Die Schlüssel werden bei Übergabe an die entsprechenden Parameter­namen gebunden.

    Parameter für New-AzVM als Hashtable übergeben

    Mehrere VMs gleicher Art lassen sich so in einem Durchgang mit einer Schleife erzeugen. Sie werden alle so konfiguriert, wie in der Hashmap angegeben, und im selben virtuellen Netz bzw. Subnetz erstellt. Anders als bei der obigen Variante werden dabei nicht vorhandene Komponenten, wie etwa das Netzwerk oder das Netzwerk-Interface, automatisch neu erstellt.

    VMs starten, stoppen oder löschen

    Alle vorhandenen VMs lassen sich über Get-AzVM auflisten. Durch zusätzliche Filter­kriterien wie Ressourcen­gruppe oder Name kann man die VMs eingrenzen.

    Wichtig zu beachten ist hier, dass sich der der Status einer virtuellen Maschine nur einsehen lässt, wenn man dem Cmdlet den Schalter Status mitgibt. Anschließend kann man über die Eigenschaft PowerState filtern, wenn man den Output über eine Pipe an Where-Object übergibt:

    Get-AzVM -ResourceGroupName MyVMGroup -Status | ? PowerState -like "*running"

    Eine virtuelle Maschine kann man durch Start-AzVM bzw. Stop-AzVM starten bzw. anhalten. Entfernen lässt sie sich durch Remove-AzVM. Alle Befehle erwarten die Angabe einer Ressourcen­gruppe und eines Namens.

    Alternativ kann man das Ergebnis von Get-AzVM über eine Pipe an diese Cmdlets weiterleiten, um die Operation auf mehrere VMs anzuwenden:

    Get-AzVm -ResourceGroupName "MyVMGroup" | Remove-AzVM -WhatIf

    Der Parameter Force würde bei Remove-AzVM die Bestätigung durch den Nutzer vermeiden. Besonders beim Löschen empfiehlt es sich aber, vorher einen Test mit WhatIf zu simulieren, um Fehler zu vermeiden. Eine Rückmeldung in Textform ist über Verbose möglich.

    Keine Kommentare