Condividi tramite


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.

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

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.

  1. Ottenere la versione dell'immagine creata:

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

  1. Ottenere l'ID risorsa del modello di immagine.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Eliminare il modello di immagine.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Eliminare l'assegnazione di ruolo.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Rimuovere le definizioni.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Eliminare l'identità.

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