Freigeben über


Erstellen eines Windows-Images und Verteilen des Images an eine Azure Compute Gallery

Gilt für: ✔️ Windows-VMs

In diesem Artikel erfahren Sie, wie Sie mit Azure Image Builder und Azure PowerShell eine Imageversion in einer Azure Compute Gallery (ehemals Shared Image Gallery) erstellen und das Image dann global verteilen. Sie können hierfür auch die Azure CLI verwenden.

Um das Image zu konfigurieren, verwendet dieser Artikel eine JSON-Vorlage, die Sie unter armTemplateWinSIG.json abrufen können. Sie laden eine lokale Version der Vorlage herunter und bearbeiten sie, sodass Sie auch eine lokale PowerShell-Sitzung verwenden.

Die Vorlage verwendet sharedImage (freigegebenes Image) als Wert für den Abschnitt distribute der Vorlage, um das Image an die Azure Compute Gallery zu verteilen.

VM Image Builder führt Sysprep automatisch aus, um das Image zu generalisieren. Der Befehl ist ein generischer Sysprep-Befehl, und Sie können ihn außer Kraft setzen, wenn dies erforderlich sein sollte.

Achten Sie darauf, wie oft Sie Anpassungen ausführen. Sie können den Sysprep-Befehl für ein einzelnes Windows-Image nur eine begrenzte Anzahl von Malen ausführen. Nachdem Sie den Sysprep-Grenzwert erreicht haben, müssen Sie Ihr Windows-Image erneut erstellen. Weitere Informationen finden Sie unter Grenzwerte für die Ausführung von Sysprep.

Registrieren Sie die Anbieter

Um den VM Image Builder zu verwenden, müssen Sie die Anbieter registrieren.

  1. Überprüfen Sie Ihre Anbieterregistrierungen. Stellen Sie sicher, dass für jeden Anbieter Registriert zurückgegeben wird.

    Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState 
    Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance | Format-table -Property ResourceTypes,RegistrationState
    
  2. Wenn nicht Registriert zurückgegeben wird, registrieren Sie die Anbieter, indem Sie die folgenden Befehle ausführen:

    Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    Register-AzResourceProvider -ProviderNamespace Microsoft.Storage
    Register-AzResourceProvider -ProviderNamespace Microsoft.Compute
    Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
    Register-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
    
  3. Installieren Sie PowerShell-Module:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    

Erstellen von Variablen

Da Sie einige Informationen wiederholt verwenden werden, erstellen Sie einige Variablen, um diese Informationen zu speichern.

Ersetzen Sie die Werte für die Variablen (z. B. username und vmpassword) durch Ihre eigenen Angaben.

# Get existing context
$currentAzContext = Get-AzContext

# Get your current subscription ID. 
$subscriptionID=$currentAzContext.Subscription.Id

# Destination image resource group
$imageResourceGroup="aibwinsig"

# Location
$location="westus"

# Image distribution metadata reference name
$runOutputName="aibCustWinManImg02ro"

# Image template name
$imageTemplateName="helloImageTemplateWin02ps"

# Distribution properties object name (runOutput).
# This gives you the properties of the managed image on completion.
$runOutputName="winclientR01"

# Create a resource group for the VM Image Builder template and Azure Compute Gallery
New-AzResourceGroup `
   -Name $imageResourceGroup `
   -Location $location

Erstellen einer vom Benutzer zugewiesene Identität und Festlegen von Berechtigungen für die Ressourcengruppe

VM Image Builder verwendet die angegebene Benutzeridentität, um das Image in Azure Compute Gallery einzufügen. In diesem Beispiel erstellen Sie eine Azure-Rollendefinition mit spezifischen Aktionen für die Verteilung des Images. Die Rollendefinition wird dann der Benutzeridentität zugewiesen.

# setup role def names, these need to be unique
$timeInt=$(get-date -UFormat "%s")
$imageRoleDefName="Azure Image Builder Image Def"+$timeInt
$identityName="aibIdentity"+$timeInt

## Add an Azure PowerShell module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

# Create an identity
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName

$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

Verwenden Sie diesen Befehl, um eine Azure-Rollendefinitionsvorlage herunterzuladen und dann mit den zuvor angegebenen Parametern zu aktualisieren.

$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
$aibRoleImageCreationPath = "aibRoleImageCreation.json"

# Download the configuration
Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing

((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath

# Create a role definition
New-AzRoleDefinition -InputFile  ./aibRoleImageCreation.json

# Grant the role definition to the VM Image Builder service principal
New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"

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).

Zum Verwenden von VM Image Builder mit Azure Compute Gallery benötigen Sie einen vorhandenen Katalog und eine Imagedefinition. Der Katalog und die Imagedefinition werden nicht von VM Image Builder für Sie erstellt.

Wenn Sie noch nicht über einen zu verwendenden Katalog und eine Imagedefinition verfügen, erstellen Sie diese zunächst.

# Gallery name
$sigGalleryName= "myIBSIG"

# Image definition name
$imageDefName ="winSvrimage"

# Additional replication region
$replRegion2="eastus"

# Create the gallery
New-AzGallery `
   -GalleryName $sigGalleryName `
   -ResourceGroupName $imageResourceGroup  `
   -Location $location

# Create the image definition
New-AzGalleryImageDefinition `
   -GalleryName $sigGalleryName `
   -ResourceGroupName $imageResourceGroup `
   -Location $location `
   -Name $imageDefName `
   -OsState generalized `
   -OsType Windows `
   -Publisher 'myCompany' `
   -Offer 'WindowsServer' `
   -Sku 'WinSrv2019'

Herunterladen und Konfigurieren der Vorlage

Laden Sie die JSON-Vorlage herunter, und konfigurieren Sie diese mit Ihren Variablen.


$templateFilePath = "armTemplateWinSIG.json"

Invoke-WebRequest `
   -Uri "https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Win_Shared_Image_Gallery_Image/armTemplateWinSIG.json" `
   -OutFile $templateFilePath `
   -UseBasicParsing

(Get-Content -path $templateFilePath -Raw ) `
   -replace '<subscriptionID>',$subscriptionID | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<rgName>',$imageResourceGroup | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<runOutputName>',$runOutputName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<imageDefName>',$imageDefName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<sharedImageGalName>',$sigGalleryName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<region1>',$location | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath

Erstellen der Imageversion

Ihre Vorlage muss an den Dienst übermittelt werden. Die folgenden Befehle laden alle abhängigen Artefakte (z. B. Skripts) herunter und speichern sie in der Stagingressourcengruppe, der IT_ als Präfix vorangestellt ist.

New-AzResourceGroupDeployment `
   -ResourceGroupName $imageResourceGroup `
   -TemplateFile $templateFilePath `
   -ApiVersion "2022-02-14" `
   -imageTemplateName $imageTemplateName `
   -svclocation $location

Um das Image zu erstellen, rufen Sie „Ausführen“ für die Vorlage auf.

Invoke-AzResourceAction `
   -ResourceName $imageTemplateName `
   -ResourceGroupName $imageResourceGroup `
   -ResourceType Microsoft.VirtualMachineImages/imageTemplates `
   -ApiVersion "2022-02-14" `
   -Action Run

Das Erstellen des Images und Replizieren in beiden Regionen kann etwas Zeit in Anspruch nehmen. Bevor Sie mit dem Erstellen einer VM beginnen, warten Sie, bis dieser Teil abgeschlossen wurde.

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

Erstellen des virtuellen Computers

Erstellen Sie eine VM aus der Imageversion, die mit VM Image Builder erstellt wurde.

  1. Rufen Sie die von Ihnen erstellte Imageversion ab:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. Erstellen Sie die VM in der zweiten Region, in die das Image repliziert wurde:

    $vmResourceGroup = "myResourceGroup"
    $vmName = "myVMfromImage"
    
    # Create user object
    $cred = Get-Credential -Message "Enter a username and password for the virtual machine."
    
    # Create a resource group
    New-AzResourceGroup -Name $vmResourceGroup -Location $replRegion2
    
    # Network pieces
    $subnetConfig = New-AzVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24
    $vnet = New-AzVirtualNetwork -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
    $pip = New-AzPublicIpAddress -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
    $nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP  -Protocol Tcp `
    -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
    -DestinationPortRange 3389 -Access Deny
    $nsg = New-AzNetworkSecurityGroup -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
    $nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
    
    # Create a virtual machine configuration using $imageVersion.Id to specify the image
    $vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1_v2 | `
    Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
    Set-AzVMSourceImage -Id $imageVersion.Id | `
    Add-AzVMNetworkInterface -Id $nic.Id
    
    # Create a virtual machine
    New-AzVM -ResourceGroupName $vmResourceGroup -Location $replRegion2 -VM $vmConfig
    

Überprüfen der Anpassung

Stellen Sie eine Remotedesktopverbindung mit der VM mit dem Benutzernamen und dem Kennwort her, die Sie beim Erstellen der VM festgelegt haben. Öffnen Sie ein Eingabeaufforderungsfenster, und führen Sie den folgenden Befehl aus:

dir c:\

Es sollte das Verzeichnis buildActions angezeigt werden, das bei der Anpassung des Images erstellt wurde.

Bereinigen von Ressourcen

Hinweis

Wenn Sie jetzt die Imageversion erneut anpassen möchten, um eine neue Version desselben Images zu erstellen, überspringen Sie die hier beschriebenen Schritte, und gehen Sie zu Verwenden von VM Image Builder, um eine weitere Imageversion zu erstellen.

Wenn Sie die Ressourcen, die Sie wie in diesem Artikel beschrieben erstellt haben, nicht mehr benötigen, können Sie sie löschen.

Der folgende Prozess löscht sowohl das Image, das Sie erstellt haben, als auch alle anderen Ressourcendateien. Stellen Sie sicher, dass Sie diese Bereitstellung abgeschlossen haben, bevor Sie die Ressourcen löschen.

Löschen Sie zuerst die Ressourcengruppenvorlage. Andernfalls wird die Stagingressourcengruppe (IT_), die VM Image Builder verwendet, nicht bereinigt.

  1. Rufen Sie die Ressourcen-ID der Imagevorlage ab.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Löschen Sie die Imagevorlage.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Löschen Sie die Rollenzuweisung.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Entfernen Sie die Definitionen.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Löschen Sie die Identität.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. Löschen Sie die Ressourcengruppe.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Nächste Schritte

Informationen zum Aktualisieren der in diesem Artikel erstellten Imageversion finden Sie unter Verwenden von VM Image Builder zum Erstellen einer anderen Imageversion.