Dela via


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.

  1. 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
    
  2. 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
    
  3. 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).

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.

  1. Hämta den avbildningsversion som du skapade:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. 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.

  1. Hämta ResourceID för bildmallen.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Ta bort bildmall.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Ta bort rolltilldelningen.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Ta bort definitionerna.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Ta bort identiteten.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. 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.