Skapa en Windows-avbildning och distribuera den till ett Azure Compute-galleri
Gäller för: ✔️ Virtuella Windows-datorer
I den här artikeln får du lära dig hur du använder Azure VM Image Builder och Azure PowerShell för att skapa en avbildningsversion i ett Azure Compute-galleri (tidigare delat bildgalleri) och sedan distribuera avbildningen globalt. Du kan också göra detta med hjälp av Azure CLI.
För att konfigurera avbildningen använder den här artikeln en JSON-mall som du hittar på armTemplateWinSIG.json. Du laddar ned och redigerar en lokal version av mallen, så du använder även en lokal PowerShell-session.
För att distribuera avbildningen till ett Azure Compute-galleri använder mallen sharedImage som värde för distribute
avsnittet i mallen.
Vm Image Builder körs Sysprep
automatiskt för att generalisera avbildningen. Kommandot är ett allmänt Sysprep
kommando och du kan åsidosätta det om du behöver det.
Tänk på hur många gånger du anpassar lager. Du kan köra Sysprep
kommandot ett begränsat antal gånger på en enda Windows-avbildning. När du har nått gränsen måste du återskapa Windows-avbildningen Sysprep
. Mer information finns i Begränsningar för hur många gånger du kan köra Sysprep.
Registrera leverantörerna
Om du vill använda VM Image Builder måste du registrera leverantörerna.
Kontrollera dina providerregistreringar. Kontrollera att var och en returnerar Registrerad.
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
Om de inte returnerar Registrerad registrerar du leverantörerna genom att köra följande kommandon:
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
Installera PowerShell-moduler:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
Skapa variabler
Eftersom du kommer att använda viss information upprepade gånger skapar du vissa variabler för att lagra den informationen.
Ersätt värdena för variablerna, till exempel username
och vmpassword
, med din egen information.
# 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
Skapa en användartilldelad identitet och ange behörigheter för resursgruppen
Vm Image Builder använder den angivna användaridentiteten för att mata in avbildningen i Azure Compute Gallery. I det här exemplet skapar du en Azure-rolldefinition med specifika åtgärder för att distribuera avbildningen. Rolldefinitionen tilldelas sedan till användaridentiteten.
# 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
Tilldela behörigheter för identiteten för att distribuera avbildningarna
Använd det här kommandot för att ladda ned en Mall för Azure-rolldefinition och uppdatera den sedan med de tidigare angivna parametrarna.
$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"
Kommentar
Om du får felet "New-AzRoleDefinition: Rolldefinitionsgränsen har överskridits. Inga fler rolldefinitioner kan skapas", se Felsöka Azure RBAC (rollbaserad åtkomstkontroll).
Skapa ett Azure Compute-galleri
Om du vill använda VM Image Builder med ett Azure Compute-galleri måste du ha ett befintligt galleri och en bilddefinition. Vm Image Builder skapar inte galleriet och avbildningsdefinitionen åt dig.
Om du inte redan har ett galleri och en bilddefinition att använda börjar du med att skapa dem.
# 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'
Ladda ned och konfigurera mallen
Ladda ned JSON-mallen och konfigurera den med dina variabler.
$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
Skapa avbildningsversionen
Mallen måste skickas till tjänsten. Följande kommandon laddar ned beroende artefakter, till exempel skript, och lagrar dem i mellanlagringsresursgruppen, som är prefix med IT_.
New-AzResourceGroupDeployment `
-ResourceGroupName $imageResourceGroup `
-TemplateFile $templateFilePath `
-ApiVersion "2022-02-14" `
-imageTemplateName $imageTemplateName `
-svclocation $location
Om du vill skapa avbildningen anropar du "Kör" på mallen.
Invoke-AzResourceAction `
-ResourceName $imageTemplateName `
-ResourceGroupName $imageResourceGroup `
-ResourceType Microsoft.VirtualMachineImages/imageTemplates `
-ApiVersion "2022-02-14" `
-Action Run
Det kan ta en stund att skapa avbildningen och replikera den till båda regionerna. Innan du börjar skapa en virtuell dator väntar du tills den här delen är klar.
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
Skapa den virtuella datorn
Skapa en virtuell dator från den avbildningsversion som du skapade med VM Image Builder.
Hämta den avbildningsversion som du skapade:
$imageVersion = Get-AzGalleryImageVersion ` -ResourceGroupName $imageResourceGroup ` -GalleryName $sigGalleryName ` -GalleryImageDefinitionName $imageDefName $imageVersionId = $imageVersion.Id
Skapa den virtuella datorn i den andra regionen, där avbildningen replikerades:
$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
Verifiera anpassningen
Skapa en fjärrskrivbordsanslutning till den virtuella datorn med det användarnamn och lösenord som du angav när du skapade den virtuella datorn. Öppna kommandotolken på den virtuella datorn och kör följande kommando:
dir c:\
Du bör se en katalog med namnet buildActions
som skapades under avbildningsanpassningen.
Rensa dina resurser
Kommentar
Om du nu vill försöka anpassa avbildningsversionen igen för att skapa en ny version av samma avbildning hoppar du över steget som beskrivs här och går till Använd VM Image Builder för att skapa en annan avbildningsversion.
Om du inte längre behöver de resurser som du skapade när du följde processen i den här artikeln kan du ta bort dem.
Följande process tar bort både avbildningen som du skapade och alla andra resursfiler. Kontrollera att du har slutfört distributionen innan du tar bort resurserna.
Ta först bort resursgruppsmallen. Annars rensas inte den mellanlagringsresursgrupp (IT_) som vm Image Builder använder.
Hämta ResourceID för bildmallen.
$resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
Ta bort bildmall.
Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
Ta bort rolltilldelningen.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Ta bort definitionerna.
Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Ta bort identiteten.
Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
Ta bort resursgruppen.
Remove-AzResourceGroup $imageResourceGroup -Force
Nästa steg
Information om hur du uppdaterar avbildningsversionen som du skapade i den här artikeln finns i Använda VM Image Builder för att skapa en annan avbildningsversion.