Creare un'immagine Linux e distribuirla in una Raccolta di calcolo di Azure usando l'interfaccia della riga di comando di Azure

Si applica a: ✔️ macchine virtuali Linux ✔️ set di scalabilità flessibili

Questo articolo illustra come usare Image Builder per macchine virtuali di Azure e l'interfaccia della riga di comando di Azure 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. È anche possibile creare una versione dell'immagine usando Azure PowerShell.

Questo articolo usa un modello JSON di esempio per configurare l'immagine. Il file JSON si trova in helloImageTemplateforSIG.json.

Per distribuire l'immagine in una Raccolta di calcolo di Azure, il modello usa sharedImage come valore per la sezione distribute del modello.

Registrare i provider

Per usare Image Builder per macchine virtuali, è necessario registrare i provider. Controllare la registrazione eseguendo i comandi seguenti:

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

Se l'output non indica 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 e autorizzazioni

Poiché si useranno ripetutamente alcune informazioni, creare alcune variabili per archiviarle.

Image Builder per macchine virtuali supporta la creazione di immagini personalizzate solo nello stesso gruppo di risorse dell'immagine gestita dall'origine. Nell'esempio seguente aggiornare il nome del gruppo di risorse in modo che sia lo stesso gruppo di risorse dell'immagine gestita dall'origine.

# Resource group name - ibLinuxGalleryRG in this example
sigResourceGroup=ibLinuxGalleryRG
# Datacenter location - West US 2 in this example
location=westus2
# Additional region to replicate the image to - East US in this example
additionalregion=eastus
# Name of the Azure Compute Gallery - myGallery in this example
sigName=myIbGallery
# Name of the image definition to be created - myImageDef in this example
imageDefName=myIbImageDef
# Reference name in the image distribution metadata
runOutputName=aibLinuxSIG

Creare una variabile per l'ID di sottoscrizione:

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

Creare il gruppo di risorse:

az group create -n $sigResourceGroup -l $location

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

Image Builder per macchine virtuali usa il valore user-identity fornito per inserire l'immagine in una 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.

# Create user-assigned identity for VM Image Builder to access the storage account where the script is stored
identityName=aibBuiUserId$(date +'%s')
az identity create -g $sigResourceGroup -n $identityName

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

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

# Download an Azure role-definition template, and update the template with the parameters that were specified earlier
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>/$sigResourceGroup/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/$sigResourceGroup

Per usare Image Builder per macchine virtuali con la 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.

Innanzitutto, creare una raccolta:

az sig create \
    -g $sigResourceGroup \
    --gallery-name $sigName

Creare quindi una definizione dell'immagine:

az sig image-definition create \
   -g $sigResourceGroup \
   --gallery-name $sigName \
   --gallery-image-definition $imageDefName \
   --publisher myIbPublisher \
   --offer myOffer \
   --sku 20_04-lts-gen2 \
   --os-type Linux \
   --hyper-v-generation V2 \
   --features SecurityType=TrustedLaunchSupported

Scaricare e configurare il file JSON

Scaricare il modello JSON e configurarlo con le variabili:

curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Linux_Shared_Image_Gallery_Image/helloImageTemplateforSIG.json -o helloImageTemplateforSIG.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateforSIG.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" helloImageTemplateforSIG.json
sed -i -e "s/<imageDefName>/$imageDefName/g" helloImageTemplateforSIG.json
sed -i -e "s/<sharedImageGalName>/$sigName/g" helloImageTemplateforSIG.json
sed -i -e "s/<region1>/$location/g" helloImageTemplateforSIG.json
sed -i -e "s/<region2>/$additionalregion/g" helloImageTemplateforSIG.json
sed -i -e "s/<runOutputName>/$runOutputName/g" helloImageTemplateforSIG.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateforSIG.json

Creare una versione di immagine

In questa sezione viene creata la versione dell'immagine nella raccolta.

Inviare la configurazione dell'immagine al servizio Image Builder per macchine virtuali di Azure:

az resource create \
    --resource-group $sigResourceGroup \
    --properties @helloImageTemplateforSIG.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateforSIG01

Avviare la compilazione dell'immagine:

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

La creazione dell'immagine e la replica in entrambe le aree possono richiedere alcuni istanti. Attendere il completamento di questa fase prima di passare alla creazione di una macchina virtuale.

Creare la macchina virtuale

Creare la macchina virtuale dalla versione dell'immagine creata da Image Builder per macchine virtuali.

az vm create \
  --resource-group $sigResourceGroup \
  --name myAibGalleryVM \
  --admin-username aibuser \
  --location $location \
  --image "/subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/latest" \
  --security-type TrustedLaunch \
  --generate-ssh-keys

Connettersi alla macchina virtuale tramite Secure Shell (SSH):

ssh aibuser@<publicIpAddress>

Non appena viene stabilita la connessione SSH, si noterà che l'immagine è stata personalizzata con un Messaggio del giorno:

*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

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 eseguendo le operazioni seguenti.

Questo processo elimina sia l'immagine creata che tutti gli altri file di risorse. Assicurarsi di aver completato questa distribuzione prima di eliminare le risorse.

Quando si eliminano le risorse della raccolta, è necessario eliminare tutte le versioni dell'immagine prima di poter eliminare la definizione dell'immagine usata per crearle. Per eliminare una raccolta, è prima di tutto necessario eliminare tutte le definizioni immagine nella raccolta.

  1. Eliminare il modello Image Builder per macchine virtuali.

    az resource delete \
        --resource-group $sigResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateforSIG01
    
  2. Eliminare assegnazioni di autorizzazioni, ruoli e identità.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Ottenere la versione dell'immagine creata da Image Builder per macchine virtuali (inizia sempre con 0.) e quindi eliminarla.

    sigDefImgVersion=$(az sig image-version list \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID --query [].'name' -o json | grep 0. | tr -d '"')
    az sig image-version delete \
    -g $sigResourceGroup \
    --gallery-image-version $sigDefImgVersion \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  4. Eliminare la definizione immagine.

    az sig image-definition delete \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  5. Eliminare la raccolta.

    az sig delete -r $sigName -g $sigResourceGroup
    
  6. Eliminare il gruppo di risorse.

    az group delete -n $sigResourceGroup -y
    

Passaggi successivi

Altre informazioni su Raccolta di calcolo di Azure.