Créer une machine virtuelle Windows à l’aide d’Azure VM Image Builder

S’applique à : ✔️ Machine virtuelles Windows

Dans cet article, vous allez apprendre à créer une image Windows personnalisée à l’aide d’Azure VM Image Builder. L’exemple de cet article utilise des personnalisateurs pour la personnalisation de l’image :

  • PowerShell (ScriptUri) : télécharger et exécuter un script PowerShell.
  • Redémarrage de Windows : redémarre la machine virtuelle.
  • PowerShell (inline) : exécute une commande spécifique. Dans cet exemple, il crée un répertoire sur la machine virtuelle à l’aide de mkdir c:\\buildActions.
  • Fichier : copie un fichier de GitHub vers la machine virtuelle. Cet exemple copie index.md vers c:\buildArtifacts\index.html sur la machine virtuelle.
  • buildTimeoutInMinutes : spécifie une heure de génération, en minutes. La valeur par défaut est de 240 minutes, que vous pouvez augmenter pour permettre l’exécution de builds plus longues. La valeur minimale autorisée est de 6 minutes. Les valeurs inférieures à 6 minutes entraînent des erreurs.
  • vmProfile : spécifie une propriété réseau et vmSize.
  • osDiskSizeGB : peut être utilisé pour augmenter la taille d’une image.
  • identity. Fournit une identité pour qu’Azure VM Image Builder l’utilise pendant la génération.

Utilisez l’exemple de modèle JSON suivant pour configurer l’image : helloImageTemplateWin.json.

Notes

Les utilisateurs Windows peuvent exécuter les exemples de Azure CLI suivants peuvent être exécutés sur Azure Cloud Shell à l’aide de Bash.

Inscrire les fournisseurs

Pour utiliser Azure VM Image Builder, vous devez inscrire cette fonctionnalité. Vérifiez votre inscription en exécutant les commandes suivantes :

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

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éfinition des variables

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

# 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'

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

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

Créer le groupe de ressources

Pour stocker l’artefact du modèle de configuration d’image et l’image, utilisez le groupe de ressources suivant :

az group create -n $imageResourceGroup -l $location

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

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

Créer une identité managée affectée par l’utilisateur et octroyer des autorisations

Créez une identité affectée par l’utilisateur afin que Azure VM Image Builder puisse accéder au compte de stockage où le script est stocké.

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

Télécharger le modèle de configuration d’image

Nous avons créé un modèle de configuration d’image paramétrable pour vous permettre d'essayer. Téléchargez l’exemple de fichier JSON, puis configurez-le avec les variables que vous avez définies précédemment.

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

Vous pouvez modifier cet exemple dans le terminal à l’aide d’un éditeur de texte tel que vi.

vi helloImageTemplateWin.json

Notes

Pour l’image source, spécifiez toujours une version. Vous ne pouvez pas spécifier latest comme version.

Si vous ajoutez ou modifiez le groupe de ressources où l’image est distribuée, assurez-vous que les autorisations sont définies sur le groupe de ressources.

Création de l’image

Envoyez la configuration de l’image au service Azure VM Image Builder en exécutant les commandes suivantes :

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

Lorsque vous avez terminé, un message de réussite est retourné à la console et un modèle de configuration Image Builder de machine virtuelle est créé dans $imageResourceGroup. Pour afficher cette ressource dans le groupe de ressources, accédez au Portail Azure, puis activez Afficher les types masqués.

En outre, en arrière-plan, Azure VM Image Builder crée un groupe de ressources de mise en lots dans votre abonnement. Ce groupe de ressources est utilisé pour générer l’image au format suivant : IT_<DestinationResourceGroup>_<TemplateName>.

Notes

Ne supprimez pas directement le groupe de ressources de mise en lots. Commencez par supprimer l’artefact de modèle d’image ; cela supprimera le groupe de ressources de mise en lots.

Si le service signale une défaillance lorsque vous envoyez le modèle de configuration d’image, procédez comme suit :

az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Lancer la génération de l’image

Démarrez le processus de génération de l'image à l'aide d’az resource invoke-action.

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

Attendez que la compilation soit terminée.

Si vous rencontrez des erreurs, consultez Résoudre les problèmes liés au service Azure VM Image Builder.

Création de la machine virtuelle

Créez la machine virtuelle en utilisant l’image que vous avez générée. Dans le code suivant, remplacez <password> par votre mot de passe pour l’abuser sur la machine virtuelle.

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

Vérifier la personnalisation

Créez une connexion Bureau à distance à la machine virtuelle avec le nom d’utilisateur et le mot de passe que vous avez définis lors de la création de la machine virtuelle. Dans la machine virtuelle, ouvrez une fenêtre d’invite de commandes, puis tapez :

dir c:\

Les deux répertoires suivants sont créés pendant la personnalisation de l’image :

  • buildActions
  • buildArtifacts

Nettoyer vos ressources

Lorsque vous avez terminé, supprimez les ressources que vous avez créées.

  1. Supprimez le modèle Azure VM Image Builder.

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. Supprimez l’attribution de rôle, la définition de rôle et l’identité de l’utilisateur.

    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. Supprimez le groupe de ressources d’image.

    az group delete -n $imageResourceGroup
    

Étapes suivantes

Pour en savoir plus sur les composants du fichier JSON utilisé dans cet article, consultez les informations de référence sur le modèle VM Image Builder.