Creare una macchina virtuale Windows usando Image Builder di macchine virtuali di Azure

Si applica a: ✔️ Macchine virtuali Windows

Questo articolo illustra come creare un'immagine Windows personalizzata usando Image Builder di macchine virtuali di Azure. L'esempio in questo articolo usa i personalizzatori per personalizzare l'immagine:

  • PowerShell (ScriptUri): scaricare ed eseguire uno script di PowerShell.
  • Riavvio di Windows: riavvia la macchina virtuale.
  • PowerShell (inline): esegue un comando specifico. In questo esempio viene creata una directory nella macchina virtuale usando mkdir c:\\buildActions.
  • File: copia un file da GitHub alla macchina virtuale. In questo esempio index.mdc:\buildArtifacts\index.html viene copiato nella macchina virtuale.
  • buildTimeoutInMinutes: specifica un tempo di compilazione, espresso in minuti. Il valore predefinito è 240 minuti, che è possibile aumentare per consentire compilazioni con esecuzione più lunga. Il valore minimo consentito è 6 minuti. I valori inferiori a 6 minuti causeranno errori.
  • vmProfile: specifica le proprietà di rete vmSize e .
  • osDiskSizeGB: può essere usato per aumentare le dimensioni di un'immagine.
  • identity. Fornisce un'identità per Image Builder di macchine virtuali da usare durante la compilazione.

Usare il modello JSON di esempio seguente per configurare l'immagine: helloImageTemplateWin.json.

Nota

Gli utenti di Windows possono eseguire gli esempi seguenti dell'interfaccia della riga di comando di Azure in Azure Cloud Shell usando Bash.

Registrare i provider

Per usare Image Builder di macchine virtuali, è necessario registrare la funzionalità. Controllare la registrazione eseguendo i comandi seguenti:

az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState

Se l'output non dice registrato, eseguire i comandi seguenti:

az provider register -n Microsoft.VirtualMachineImages
az provider register -n Microsoft.Compute
az provider register -n Microsoft.KeyVault
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Network
az provider register -n Microsoft.ContainerInstance

Impostare variabili

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

# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='WestUS2'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'

Creare una variabile per l'ID sottoscrizione:

subscriptionID=$(az account show --query id --output tsv)

Creare il gruppo di risorse

Per archiviare l'artefatto del modello di configurazione dell'immagine e l'immagine, usare il gruppo di risorse seguente:

az group create -n $imageResourceGroup -l $location

Creare un'identità assegnata dall'utente e impostare autorizzazioni per il gruppo di risorse

Vm Image Builder usa l'identità utente fornita per inserire l'immagine nel gruppo di risorse. In questo esempio viene creata una definizione di ruolo di Azure con autorizzazioni specifiche per la distribuzione dell'immagine. La definizione del ruolo viene quindi assegnata all'identità utente.

Creare un'identità gestita assegnata dall'utente e concedere autorizzazioni

Creare un'identità assegnata dall'utente in modo che Image Builder della macchina virtuale possa accedere all'account di archiviazione in cui è archiviato lo script.

identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download the preconfigured role definition example
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')

# Update the definition
sed -i -e "s%<subscriptionID>%$subscriptionID%g" aibRoleImageCreation.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" aibRoleImageCreation.json
sed -i -e "s%Azure Image Builder Service Image Creation Role%$imageRoleDefName%g" aibRoleImageCreation.json

# Create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json

# Grant a role definition to the user-assigned identity
az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup

Scaricare il modello di configurazione dell'immagine

È stato creato un modello di configurazione dell'immagine con parametri da provare. Scaricare il file JSON di esempio e quindi configurarlo con le variabili impostate in precedenza.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json

sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json

È possibile modificare questo esempio nel terminale usando un editor di testo, viad esempio .

vi helloImageTemplateWin.json

Nota

Per l'immagine di origine, specificare sempre una versione. Non è possibile specificare latest come versione.

Se si aggiunge o si modifica il gruppo di risorse in cui viene distribuita l'immagine, assicurarsi che le autorizzazioni siano impostate nel gruppo di risorse.

Creare l'immagine

Inviare la configurazione dell'immagine al servizio Image Builder della macchina virtuale eseguendo i comandi seguenti:

az resource create \
    --resource-group $imageResourceGroup \
    --properties @helloImageTemplateWin.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Al termine, viene restituito un messaggio di esito positivo alla console e viene creato un modello di configurazione di Image Builder della macchina virtuale in $imageResourceGroup. Per visualizzare questa risorsa nel gruppo di risorse, passare alla portale di Azure e quindi abilitare Mostra tipi nascosti.

In background Image Builder crea anche un gruppo di risorse di staging nella sottoscrizione. Questo gruppo di risorse viene usato per compilare l'immagine nel formato seguente: IT_<DestinationResourceGroup>_<TemplateName>.

Nota

Non eliminare direttamente il gruppo di risorse di staging. Prima di tutto, eliminare l'artefatto del modello di immagine, che causa l'eliminazione del gruppo di risorse di staging.

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

  • Vedere Risolvere i problemi del servizio Image Builder di macchine virtuali di Azure.
  • Prima di provare a inviare di nuovo il modello, eliminarlo eseguendo i comandi seguenti:
az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Avviare la compilazione dell'immagine

Avviare il processo di creazione di immagini usando az resource invoke-action.

az resource invoke-action \
     --resource-group $imageResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n helloImageTemplateWin01 \
     --action Run

Attendere il completamento della compilazione.

Se si verificano errori, vedere Risolvere i problemi del servizio Image Builder di macchine virtuali di Azure.

Creare la macchina virtuale

Creare la macchina virtuale usando l'immagine creata. Nel codice seguente sostituire <la password> con la propria password per aibuser nella macchina virtuale.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgWinVm00 \
  --admin-username aibuser \
  --admin-password <password> \
  --image $imageName \
  --location $location

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 e quindi digitare:

dir c:\

Durante la personalizzazione dell'immagine vengono create le due directory seguenti:

  • buildActions
  • buildArtifacts

Pulire le risorse

Al termine, eliminare le risorse create.

  1. Eliminare il modello image builder della macchina virtuale.

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. Eliminare l'assegnazione di ruolo, la definizione del ruolo e l'identità utente.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Eliminare il gruppo di risorse immagine.

    az group delete -n $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.