Créer une image Linux et la distribuer à une galerie Azure Compute Gallery avec Azure CLI

S’applique à : ✔️ Machines virtuelles Linux ✔️ Groupes identiques flexibles

Dans cet article, vous apprenez à utiliser Azure VM Image Builder et Azure CLI pour créer une version d’image dans une galerie Azure Compute Gallery (anciennement Shared Image Gallery) avant de distribuer l’image globalement. Vous pouvez également créer une version d’image avec Azure PowerShell.

Cet article utilise un exemple de modèle JSON pour configurer l’image. Le fichier JSON se trouve dans helloImageTemplateforSIG.json.

Pour distribuer l’image à une galerie Azure Compute Gallery, le modèle utilise sharedImage en tant que valeur de la section distribute du modèle.

Inscrire les fournisseurs

Pour utiliser le Générateur d’images de machine virtuelle, vous devez inscrire les fournisseurs. Vérifiez votre inscription en exécutant les commandes suivantes :

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

Si la sortie ne retourne pas Registered, exécutez les commandes suivantes :

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

Définir des variables et des autorisations

Comme nous allons utiliser certains éléments d’information à plusieurs reprises, créez des variables pour les stocker.

VM Image Builder ne prend en charge la création d’images personnalisées que dans le même groupe de ressources que l’image managée source. Dans l’exemple suivant, remplacez le nom du groupe de ressources par celui de votre image managée source.

# 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

Créez une variable pour votre ID d’abonnement :

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

Créez le groupe de ressources :

az group create -n $sigResourceGroup -l $location

Créer une identité affectée par l’utilisateur et définir des autorisations sur le groupe de ressources

VM Image Builder utilise l’identité de l’utilisateur fournie pour injecter l’image dans une galerie Azure Compute Gallery. Dans cet exemple, vous créez une définition de rôle Azure avec des actions spécifiques pour distribuer l’image. La définition de rôle est alors attribuée à l’identité de l’utilisateur.

# 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

Pour utiliser VM Image Builder avec Azure Compute Gallery, vous devez disposer d’une galerie et d’une définition d’image existantes. VM Image Builder ne crée pas la galerie et la définition d’image pour vous.

Si vous n’avez pas encore de définition d’image et de galerie à utiliser, commencez par les créer.

Commencez par créer une galerie :

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

Ensuite, créez une définition d’image :

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

Télécharger et configurer le fichier JSON

Téléchargez le modèle JSON et configurez-le avec vos variables :

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

Créer la version de l’image

Dans cette section, vous créez la version de l’image dans la galerie.

Envoyez la configuration de l’image au service Azure VM Image Builder :

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

Lancez la génération d’image :

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

La création de l’image et sa réplication dans les deux régions peuvent prendre quelques instants. Attendez la fin de cette partie pour passer à la création d’une machine virtuelle.

Création de la machine virtuelle

Créez la machine virtuelle à partir de la version de l’image créée par VM Image Builder.

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

Connectez-vous à la machine virtuelle par le biais de Secure Shell (SSH) :

ssh aibuser@<publicIpAddress>

Dès que la connexion SSH est établie, l’image est personnalisée avec un Message du jour :

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

Nettoyer vos ressources

Notes

Si à présent vous souhaitez essayer de repersonnaliser la version de l’image pour créer une nouvelle version de la même image, ignorez l’étape indiquée ici et passez à Utiliser VM Image Builder pour créer une autre version de l’image.

Si vous n’avez plus besoin des ressources que vous avez créées tout au long de cet article, vous pouvez les supprimer en procédant comme suit.

Ce processus supprime à la fois l’image que vous avez créée et tous les autres fichiers de ressources. Assurez-vous que vous avez terminé ce déploiement avant de supprimer les ressources.

Quand vous supprimez des ressources de la galerie, vous devez supprimer toutes les versions de l’image pour pouvoir supprimer la définition de l’image qui a été utilisée pour les créer. Supprimer une galerie implique de supprimer au préalable toutes les définitions de l’image qu’elle comporte.

  1. Supprimez le modèle VM Image Builder.

    az resource delete \
        --resource-group $sigResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateforSIG01
    
  2. Supprimez les affectations d’autorisations, les rôles et les identités.

    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. Récupérez la version de l’image créée par VM Image Builder (elle commence toujours par 0.), puis supprimez-la.

    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. Supprimez la définition de l’image.

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

    az sig delete -r $sigName -g $sigResourceGroup
    
  6. Supprimez le groupe de ressources.

    az group delete -n $sigResourceGroup -y
    

Étapes suivantes

Apprenez-en davantage sur Azure Compute Gallery.