Creare un'immagine Windows e distribuirla in una raccolta di calcolo di Azure
Si applica a: ✔️ macchine virtuali di Windows
Questo articolo illustra come usare Image Builder di macchine virtuali di Azure e Azure PowerShell per creare una versione dell'immagine in una raccolta di calcolo di Azure (in precedenza Raccolta immagini condivise) e quindi distribuire l'immagine a livello globale. A tale scopo, è anche possibile usare l'interfaccia della riga di comando di Azure.
Per configurare l'immagine, questo articolo usa un modello JSON, disponibile in armTemplateWinSIG.json. Si scarifierà e si modificherà una versione locale del modello, quindi si userà anche una sessione di PowerShell locale.
Per distribuire l'immagine in una Raccolta di calcolo di Azure, il modello usa sharedImage come valore per la sezione distribute
del modello.
Image Builder vm viene eseguito Sysprep
automaticamente per generalizzare l'immagine. Il comando è un comando generico Sysprep
ed è possibile eseguirne l'override se necessario.
Tenere presente il numero di volte in cui si applicano personalizzazioni a più livelli. È possibile eseguire il Sysprep
comando un numero limitato di volte in una singola immagine di Windows. Dopo aver raggiunto il Sysprep
limite, è necessario ricreare l'immagine di Windows. Per altre informazioni, vedere Limiti del numero di volte in cui è possibile eseguire Sysprep.
Registrare i provider
Per usare Image Builder per macchine virtuali, è necessario registrare i provider.
Controllare le registrazioni del provider. Assicurarsi che ognuno restituisca Registrato.
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
Se non restituiscono Registrato, registrare i provider eseguendo i comandi seguenti:
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
Installare i moduli di PowerShell:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
Creare le variabili
Poiché si useranno ripetutamente alcune informazioni, creare alcune variabili per archiviare tali informazioni.
Sostituire i valori per le variabili, ad esempio username
e vmpassword
, con le proprie informazioni.
# 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
Creare un'identità assegnata dall'utente e impostare autorizzazioni per il gruppo di risorse
Image Builder di macchine virtuali usa l'identità utente fornita per inserire l'immagine nella raccolta di calcolo di Azure. In questo esempio viene creata una definizione di ruolo di Azure con azioni specifiche per la distribuzione dell'immagine. La definizione del ruolo viene quindi assegnata all'identità utente.
# 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
Assegnare all'identità le autorizzazioni per la distribuzione delle immagini
Usare questo comando per scaricare un modello di definizione di ruolo di Azure e quindi aggiornarlo con i parametri specificati in precedenza.
$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"
Nota
Se viene visualizzato l'errore "New-AzRoleDefinition: Limite di definizione del ruolo superato. Non è possibile creare altre definizioni di ruolo", vedere Risolvere i problemi relativi al controllo degli accessi in base al ruolo di Azure.
Creare una Raccolta di calcolo di Azure
Per usare Image Builder di macchine virtuali con una raccolta di calcolo di Azure, è necessario avere una raccolta esistente e una definizione di immagine. Image Builder per macchine virtuali non crea automaticamente la raccolta e la definizione di immagine.
Se non si ha già una raccolta e una definizione di immagine da usare, iniziare creando questi elementi.
# 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'
Scaricare e configurare il modello
Scaricare il modello JSON e configurarlo con le variabili.
$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
Creare una versione di immagine
Il modello deve essere inviato al servizio. I comandi seguenti scaricano tutti gli artefatti dipendenti, ad esempio gli script, e li archivieranno nel gruppo di risorse di staging, preceduto da IT_.
New-AzResourceGroupDeployment `
-ResourceGroupName $imageResourceGroup `
-TemplateFile $templateFilePath `
-ApiVersion "2022-02-14" `
-imageTemplateName $imageTemplateName `
-svclocation $location
Per compilare l'immagine, richiamare 'Esegui' nel modello.
Invoke-AzResourceAction `
-ResourceName $imageTemplateName `
-ResourceGroupName $imageResourceGroup `
-ResourceType Microsoft.VirtualMachineImages/imageTemplates `
-ApiVersion "2022-02-14" `
-Action Run
La creazione dell'immagine e la replica in entrambe le aree possono richiedere alcuni istanti. Prima di iniziare a creare una macchina virtuale, attendere il completamento di questa parte.
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
Creare la macchina virtuale
Creare una macchina virtuale dalla versione dell'immagine creata con Image Builder della macchina virtuale.
Ottenere la versione dell'immagine creata:
$imageVersion = Get-AzGalleryImageVersion ` -ResourceGroupName $imageResourceGroup ` -GalleryName $sigGalleryName ` -GalleryImageDefinitionName $imageDefName $imageVersionId = $imageVersion.Id
Creare la macchina virtuale nella seconda area in cui è stata replicata l'immagine:
$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
Verificare la personalizzazione
Creare una Connessione Desktop remoto alla macchina virtuale usando il nome utente e la password impostati al momento della creazione della macchina virtuale. Nella macchina virtuale aprire una finestra del prompt dei comandi ed eseguire il comando seguente:
dir c:\
Verrà visualizzata una directory denominata buildActions
creata durante la personalizzazione dell'immagine.
Pulire le risorse
Nota
Se si vuole ora provare a ripersonalizzare l'immagine per ricrearne una nuova versione, ignorare il passaggio descritto qui e passare a Usare Image Builder per creare un'altra versione dell'immagine.
Se non sono più necessarie le risorse create durante la procedura descritta in questo articolo, è possibile eliminarle.
Il processo seguente elimina sia l'immagine creata che tutti gli altri file di risorse. Assicurarsi di aver completato questa distribuzione prima di eliminare le risorse.
Eliminare prima il modello del gruppo di risorse. In caso contrario, il gruppo di risorse di staging (IT_) usato da Image Builder della macchina virtuale non verrà pulito.
Ottenere l'ID risorsa del modello di immagine.
$resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
Eliminare il modello di immagine.
Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
Eliminare l'assegnazione di ruolo.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Rimuovere le definizioni.
Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Eliminare l'identità.
Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
Eliminare il gruppo di risorse.
Remove-AzResourceGroup $imageResourceGroup -Force
Passaggi successivi
Per aggiornare la versione dell'immagine creata in questo articolo, vedere Usare Image Builder per creare un'altra versione dell'immagine.