Erstellen eines virtuellen Windows-Computers mit VM Image Builder unter Verwendung von PowerShell

Gilt für: ✔️ Windows-VMs

In diesem Artikel erfahren Sie, wie Sie mit dem PowerShell-Modul von Azure VM Image Builder ein benutzerdefiniertes Windows-VM-Image erstellen können.

Voraussetzungen

Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Falls Sie PowerShell lokal verwenden möchten, müssen Sie für diesen Artikel das Azure PowerShell-Modul installieren und mit dem Cmdlet Connect-AzAccount eine Verbindung mit Ihrem Azure-Konto herstellen. Weitere Informationen finden Sie unter Installieren von Azure PowerShell.

Einige der Schritte erfordern Cmdlets aus dem Az.ImageBuilder-Modul. Installieren Sie dies mit dem folgenden Befehl separat.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure hostet Azure Cloud Shell, eine interaktive Shell-Umgebung, die Sie über Ihren Browser nutzen können. Sie können entweder Bash oder PowerShell mit Cloud Shell verwenden, um mit Azure-Diensten zu arbeiten. Sie können die vorinstallierten Befehle von Cloud Shell verwenden, um den Code in diesem Artikel auszuführen, ohne etwas in Ihrer lokalen Umgebung installieren zu müssen.

Starten von Azure Cloud Shell:

Option Beispiel/Link
Wählen Sie rechts oben in einem Code- oder Befehlsblock die Option Ausprobieren aus. Durch die Auswahl von Ausprobieren wird der Code oder Befehl nicht automatisch in Cloud Shell kopiert. Screenshot that shows an example of Try It for Azure Cloud Shell.
Rufen Sie https://shell.azure.com auf, oder klicken Sie auf die Schaltfläche Cloud Shell starten, um Cloud Shell im Browser zu öffnen. Button to launch Azure Cloud Shell.
Wählen Sie im Azure-Portal rechts oben im Menü die Schaltfläche Cloud Shell aus. Screenshot that shows the Cloud Shell button in the Azure portal

So verwenden Sie Azure Cloud Shell:

  1. Starten Sie Cloud Shell.

  2. Wählen Sie die Schaltfläche Kopieren für einen Codeblock (oder Befehlsblock) aus, um den Code oder Befehl zu kopieren.

  3. Fügen Sie den Code oder Befehl mit STRG+UMSCHALT+V unter Windows und Linux oder CMD+UMSCHALT+V unter macOS in die Cloud Shell-Sitzung ein.

  4. Drücken Sie die EINGABETASTE, um den Code oder Befehl auszuführen.

Wenn Sie über mehrere Azure-Abonnements verfügen, müssen Sie das entsprechende Abonnement auswählen, in dem die Ressourcen fakturiert werden sollen. Wählen Sie mit dem Cmdlet Set-AzContext ein bestimmtes Abonnement aus.

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

Registrieren von Anbietern

Wenn Sie dies noch nicht getan haben, registrieren Sie die folgenden Ressourcenanbieter für die Verwendung mit Ihrem Azure-Abonnement:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Definieren von Variablen

Da Sie einige Informationen wiederholt verwenden werden, erstellen Sie ein paar Variablen, um diese Informationen zu speichern:

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Erstellen Sie eine Variable für Ihre Azure Abonnement-ID. Um sich zu vergewissern, dass die subscriptionID-Variable Ihre Abonnement-ID enthält, können Sie die zweite Zeile im folgenden Beispiel ausführen:

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

Erstellen einer Ressourcengruppe

Erstellen Sie mit New-AzResourceGroup Cmdlet eine Azure-Ressourcengruppe. Eine Ressourcengruppe ist ein logischer Container, in dem Azure-Ressourcen als Gruppe bereitgestellt und verwaltet werden.

Im folgenden Beispiel wird eine Ressourcengruppe basierend auf dem Namen in der Variablen $imageResourceGroup in der Region erstellt, die in der Variablen $location angegeben ist. Diese Ressourcengruppe wird verwendet, um das Artefakt und Image der Imagekonfigurationsvorlage zu speichern.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Erstellen der Benutzeridentität und Festlegen von Rollenberechtigungen

Erteilen Sie Azure Image Builder-Berechtigungen zum Erstellen von Images in der angegebenen Ressourcengruppe, indem Sie das folgende Beispiel verwenden. Ohne diese Berechtigung kann der Prozess der Imageerstellung nicht erfolgreich abgeschlossen werden.

  1. Erstellen Sie Variablen für die Rollendefinition und die Identitätsnamen. Diese Werte müssen eindeutig sein.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Erstellen Sie eine Benutzeridentität.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Speichern Sie die Identitätsressource und die Prinzipal-IDs in Variablen.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

Zuweisen von Berechtigungen für die Identität zur Verteilung der Images

  1. Laden Sie die JSON-Konfigurationsdatei herunter, und ändern Sie sie anhand der in diesem Artikel definierten Einstellungen.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. Erstellen Sie die Rollendefinition.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Gewähren Sie dem VM Image Builder-Dienstprinzipal die Rollendefinition.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

Hinweis

Wenn Sie die Fehlermeldung „New-AzRoleDefinition: Rollendefinitionsgrenze überschritten. Es können keine weiteren Rollendefinitionen erstellt werden“ erhalten, siehe Fehlerbehebung für Azure RBAC (rollenbasierte Zugriffssteuerung).

  1. Erstellen Sie den Katalog.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Erstellen Sie eine Katalogdefinition.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

Erstellen eines Images

  1. Erstellen Sie ein VM Image Builder-Quellobjekt. Gültige Parameterwerte finden Sie unter Suchen nach Windows-VM-Images im Azure Marketplace mit Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Erstellen Sie ein VM Image Builder-Distributor-Objekt.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. Erstellen Sie ein VM Image Builder-Anpassungsobjekt.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. Erstellen Sie ein zweites VM Image Builder-Anpassungsobjekt.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. Erstellen Sie eine VM Image Builder-Vorlage.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

Wenn die Vorlage erstellt wurde, wird eine Nachricht zurückgegeben, und eine VM Image Builder-Konfigurationsvorlage wird in $imageResourceGroup erstellt.

Um festzustellen, ob die Vorlagenerstellung erfolgreich war, können Sie das folgende Beispiel verwenden:

Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
  Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState

Außerdem erstellt VM Image Builder im Hintergrund eine Stagingressourcengruppe in Ihrem Abonnement. Diese Ressourcengruppe wird für den Imagebuild verwendet. Sie hat das Format IT_<DestinationResourceGroup>_<TemplateName>.

Warnung

Löschen Sie die Stagingressourcengruppe nicht direkt. Löschen Sie das Artefakt der Imagevorlage. Dadurch wird die Löschung der Stagingressourcengruppe veranlasst.

Wenn der Dienst einen Fehler meldet, wenn Sie die Imagekonfigurationsvorlage übermitteln, gehen Sie wie folgt vor:

Starten des Imagebuilds

Senden Sie die Imagekonfiguration an den VM Image Builder-Dienst, indem Sie die folgenden Befehle ausführen:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Warten Sie, bis der Imageerstellungsvorgang abgeschlossen ist, was bis zu einer Stunde dauern kann.

Wenn Fehler auftreten, lesen Sie das Dokument Problembehandlung bei Azure VM Image Builder-Fehlern.

Erstellen einer VM

  1. Speichern Sie die Anmeldeinformationen für die VM in einer Variablen. Das Kennwort muss komplex sein.

    $Cred = Get-Credential
    
  2. Erstellen Sie die VM mithilfe des erstellten Images.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

Überprüfen der Anpassungen

  1. Stellen Sie mit dem Benutzernamen und dem Kennwort, die Sie beim Erstellen der VM festgelegt haben, eine Remotedesktopverbindung mit der VM her.

  2. Öffnen Sie PowerShell in der VM, und führen Sie Get-Content wie im folgenden Beispiel gezeigt aus:

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    Die Ausgabe basiert auf dem Inhalt der Datei, die Sie während des Imageanpassungsvorgangs erstellt haben.

    Azure-Image-Builder-Was-Here
    
  3. Überprüfen Sie in derselben PowerShell-Sitzung, ob die zweite Anpassung erfolgreich abgeschlossen wurde, indem Sie auf das Vorhandensein von c:\buildArtifacts\index.html prüfen, wie im folgenden Beispiel gezeigt:

    Get-ChildItem c:\buildArtifacts\
    

    Das Ergebnis sollte eine Verzeichnisliste sein, die zeigt, dass die Datei während des Imageanpassungsvorgangs heruntergeladen wurde.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

Bereinigen von Ressourcen

Wenn Sie die Ressourcen, die während dieses Vorgangs erstellt wurden, nicht mehr benötigen, können Sie sie wie folgt löschen:

  1. Löschen Sie die VM Image Builder-Vorlage.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Löschen Sie die Imageressourcengruppe.

    Achtung

    Im folgenden Beispiel werden die angegebene Ressourcengruppe und alle in ihr enthaltenen Ressourcen gelöscht. Wenn in der Ressourcengruppe Ressourcen vorhanden sind, die nicht in diesem Artikel behandelt werden, werden sie ebenfalls gelöscht.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Nächste Schritte

Weitere Informationen zu den Komponenten der in diesem Artikel verwendeten JSON-Datei finden Sie in der VM Image Builder-Vorlagenreferenz.