Freigeben über


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 nicht über ein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.

Wenn Sie PowerShell lokal verwenden möchten, muss in diesem Artikel das Azure PowerShell-Modul installiert und mithilfe des Cmdlets Connect-AzAccount eine Verbindung mit Ihrem Azure-Konto hergestellt werden. 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 "Ausprobieren" in der oberen rechten Ecke eines Code- oder Befehlsblocks aus. Wenn Sie "Testen" auswählen, wird der Code oder Befehl nicht automatisch in Cloud Shell kopiert. Screenshot eines Beispiels für
Wechseln Sie zu https://shell.azure.com, oder wählen Sie die Schaltfläche "Cloud Shell starten " aus, um Cloud Shell in Ihrem Browser zu öffnen. Schaltfläche zum Starten von Azure Cloud Shell.
Wählen Sie auf der Menüleiste oben rechts im Azure-Portal die Schaltfläche "Cloud Shell" aus. Screenshot der Schaltfläche

So verwenden Sie Azure Cloud Shell

  1. Starten Sie Cloud Shell.

  2. Wählen Sie die Schaltfläche "Kopieren " in einem 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. Wählen Sie die EINGABETASTE aus, 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 ein bestimmtes Abonnement mithilfe des Cmdlets "Set-AzContext " 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 eine Azure-Ressourcengruppe mithilfe des Cmdlets New-AzResourceGroup . 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", siehe Problembehandlung 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'
      HyperVGeneration = 'v1'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

Erstellen eines Images

  1. Erstellen Sie ein VM Image Builder-Quellobjekt. Gültige Parameterwerte finden Sie unter Suchen von Windows-VM-Images in 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:

  • Weitere Informationen finden Sie unter "Problembehandlung bei Fehlern beim Azure VM Image Builder".

  • Bevor Sie versuchen, die Vorlage zu übermitteln, löschen Sie sie wie im folgenden Beispiel:

    Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
    

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, überprüfen Sie den Abschnitt Problembehandlung bei Fehlern des Azure VM Image Builder.

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.

    Vorsicht

    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 JSON-Datei, die in diesem Artikel verwendet wird, finden Sie in der Vorlagenreferenz für vm Image Builder.