Creare una macchina virtuale Windows con Image Builder di macchine virtuali usando PowerShell

Si applica a: ✔️ Macchine virtuali Windows

Questo articolo illustra come creare un'immagine di macchina virtuale Windows personalizzata usando il modulo PowerShell di Image Builder di macchine virtuali di Azure.

Prerequisiti

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Se si sceglie di usare PowerShell in locale, questo articolo richiede di installare il modulo Azure PowerShell e connettersi all'account Azure usando il cmdlet Connessione-AzAccount. Per altre informazioni, vedere Installare Azure PowerShell.

Alcuni passaggi richiedono cmdlet dal modulo Az.ImageBuilder . Eseguire l'installazione separatamente usando il comando seguente.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure Cloud Shell è un ambiente di shell interattivo ospitato in Azure e usato tramite il browser. È possibile usare Bash o PowerShell con Cloud Shell per usare i servizi di Azure. È possibile usare i comandi preinstallati di Cloud Shell per eseguire il codice in questo articolo, senza dover installare alcun elemento nell'ambiente locale.

Per avviare Azure Cloud Shell:

Opzione Esempio/Collegamento
Selezionare Prova nell'angolo superiore destro di un codice o di un blocco di comandi. Selezionando Prova non viene copiato automaticamente il codice o il comando in Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Passare a https://shell.azure.com o selezionare il pulsante Avvia Cloud Shell per aprire Cloud Shell nel browser. Button to launch Azure Cloud Shell.
Selezionare il pulsante Cloud Shell nella barra dei menu nell'angolo in alto a destra del portale di Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Per usare Azure Cloud Shell:

  1. Avviare Cloud Shell.

  2. Selezionare il pulsante Copia in un blocco di codice (o blocco di comandi) per copiare il codice o il comando.

  3. Incollare il codice o il comando nella sessione di Cloud Shell selezionando CTRL+MAIUSC+V in Windows e Linux oppure selezionando CMD+MAIUSC+V in macOS.

  4. Selezionare INVIO per eseguire il codice o il comando.

Se si possiedono più sottoscrizioni di Azure, scegliere quella appropriata in cui verranno fatturate le risorse. Selezionare una sottoscrizione specifica usando il cmdlet Set-AzContext .

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

Registrare i provider

Se non è già stato fatto, registrare i provider di risorse seguenti da usare con la sottoscrizione di Azure:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Definire le variabili

Poiché si useranno ripetutamente alcune informazioni, creare alcune variabili per archiviare tali informazioni:

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Creare una variabile per l'ID sottoscrizione di Azure. Per verificare che la variabile contenga l'ID subscriptionID sottoscrizione, è possibile eseguire la seconda riga nell'esempio seguente:

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

Creare un gruppo di risorse

Creare un gruppo di risorse di Azure usando il cmdlet New-AzResourceGroup . Un gruppo di risorse è un contenitore logico in cui le risorse di Azure vengono distribuite e gestite come gruppo.

Nell'esempio seguente viene creato un gruppo di risorse basato sul nome nella $imageResourceGroup variabile nell'area specificata nella $location variabile . Questo gruppo di risorse viene usato per archiviare l'artefatto del modello di configurazione dell'immagine e l'immagine.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Creare un'identità utente e impostare le autorizzazioni del ruolo

Concedere a Generatore immagini di Azure le autorizzazioni per creare immagini nel gruppo di risorse specificato usando l'esempio seguente. Senza questa autorizzazione, il processo di compilazione dell'immagine non verrà completato correttamente.

  1. Creare variabili per la definizione del ruolo e i nomi di identità. Questi valori devono essere univoci.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Creare un'identità utente.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Archiviare le risorse di identità e gli ID entità nelle variabili.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

Assegnare le autorizzazioni per l'identità per distribuire le immagini

  1. Scaricare il file di configurazione JSON e quindi modificarlo in base alle impostazioni definite in questo articolo.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. Creare la definizione di ruolo.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Concedere la definizione del ruolo all'entità servizio Image Builder della macchina virtuale.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

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.

  1. Creare la raccolta.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Creare una definizione della raccolta.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

Creare un'immagine

  1. Creare un oggetto di origine Image Builder della macchina virtuale. Per i valori dei parametri validi, vedere Trovare immagini di macchine virtuali Windows in Azure Marketplace con Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Creare un oggetto di distribuzione image builder di macchine virtuali.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. Creare un oggetto di personalizzazione image builder della macchina virtuale.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. Creare un secondo oggetto di personalizzazione image builder della macchina virtuale.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. Creare un modello di Generatore immagini macchina virtuale.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

Dopo aver creato il modello, viene restituito un messaggio e viene creato un modello di configurazione di Image Builder della macchina virtuale in $imageResourceGroup.

Per determinare se il processo di creazione del modello è riuscito, usare l'esempio seguente:

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

In background Image Builder crea anche un gruppo di risorse di staging nella sottoscrizione. Questo gruppo di risorse viene usato per la compilazione dell'immagine. È nel formato IT_<DestinationResourceGroup>_<TemplateName>.

Avviso

Non eliminare direttamente il gruppo di risorse di staging. Per eliminare il gruppo di risorse di staging, eliminare l'artefatto del modello di immagine.

Se il servizio segnala un errore quando viene inviato il modello di configurazione dell'immagine, eseguire le operazioni seguenti:

  • Vedere Risolvere gli errori di Image Builder di macchine virtuali di Azure.

  • Prima di riprovare a inviare il modello, eliminarlo seguendo questo esempio:

    Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
    

Avviare la compilazione dell'immagine

Inviare la configurazione dell'immagine al servizio Image Builder della macchina virtuale eseguendo il comando seguente:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Attendere il completamento del processo di compilazione dell'immagine, che potrebbe richiedere fino a un'ora.

Se si verificano errori, vedere Risolvere gli errori di Image Builder di macchine virtuali di Azure.

Creazione di una macchina virtuale

  1. Archiviare le credenziali di accesso della macchina virtuale in una variabile. La password deve essere complessa.

    $Cred = Get-Credential
    
  2. Creare la macchina virtuale usando l'immagine creata.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

Verificare le personalizzazioni

  1. Creare una connessione Desktop remoto alla macchina virtuale usando il nome utente e la password impostati al momento della creazione della macchina virtuale.

  2. All'interno della macchina virtuale aprire PowerShell ed eseguire Get-Content, come illustrato nell'esempio seguente:

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    L'output si basa sul contenuto del file creato durante il processo di personalizzazione dell'immagine.

    Azure-Image-Builder-Was-Here
    
  3. Dalla stessa sessione di PowerShell verificare che la seconda personalizzazione sia stata completata correttamente controllando la presenza di c:\buildArtifacts\index.html, come illustrato nell'esempio seguente:

    Get-ChildItem c:\buildArtifacts\
    

    Il risultato deve essere un elenco di directory che mostra che il file è stato scaricato durante il processo di personalizzazione dell'immagine.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

Pulire le risorse

Se non sono più necessarie le risorse create durante questo processo, è possibile eliminarle eseguendo le operazioni seguenti:

  1. Eliminare il modello image builder della macchina virtuale.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Eliminare il gruppo di risorse immagine.

    Attenzione

    Nell'esempio seguente vengono eliminati il gruppo di risorse specificato e tutte le risorse contenute. Se nel gruppo di risorse sono presenti risorse esterne all'ambito di questo articolo, verranno eliminate anche.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Passaggi successivi

Per altre informazioni sui componenti del file JSON usato da questo articolo, vedere le informazioni di riferimento sul modello di Image Builder della macchina virtuale.