Créer une image Windows et la distribuer à une galerie Azure Compute Gallery

S’applique à : ✔️ Machine virtuelles Windows

Dans cet article, vous apprenez à utiliser Azure VM Image Builder et Azure PowerShell 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 effectuer cette opération à l’aide d’Azure CLI.

Pour configurer l’image, cet article utilise un modèle JSON, que vous trouverez sur armTemplateWinSIG.json. Vous allez télécharger et modifier une version locale du modèle et utiliserez donc également une session PowerShell locale.

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.

VM Image Builder exécute automatiquement Sysprep pour généraliser l’image. La commande est une commande Sysprep générique et vous pouvez la remplacer si vous en avez besoin.

Tenez compte du nombre de fois où vous stratifiez les personnalisations. Vous pouvez exécuter la commande Sysprep un nombre limité de fois sur une même image Windows. Une fois que vous avez atteint la limite Sysprep, vous devez recréer votre image Windows. Pour plus d'informations, consultez Nombre d'exécutions maximum de Sysprep.

Inscrire les fournisseurs

Pour utiliser le Générateur d’images de machine virtuelle, vous devez inscrire les fournisseurs.

  1. Vérifiez les inscriptions de votre fournisseur. Assurez-vous que chacun retourne Inscrit.

    Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState 
    Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState
    Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance | Format-table -Property ResourceTypes,RegistrationState
    
  2. S’ils ne retournent pas Inscrit, inscrivez les fournisseurs en exécutant les commandes suivantes :

    Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    Register-AzResourceProvider -ProviderNamespace Microsoft.Storage
    Register-AzResourceProvider -ProviderNamespace Microsoft.Compute
    Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
    Register-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
    
  3. Installez les modules PowerShell :

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    

Créer des variables

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

Remplacez la valeur des variables, comme username et vmpassword, par vos propres informations.

# Get existing context
$currentAzContext = Get-AzContext

# Get your current subscription ID. 
$subscriptionID=$currentAzContext.Subscription.Id

# Destination image resource group
$imageResourceGroup="aibwinsig"

# Location
$location="westus"

# Image distribution metadata reference name
$runOutputName="aibCustWinManImg02ro"

# Image template name
$imageTemplateName="helloImageTemplateWin02ps"

# Distribution properties object name (runOutput).
# This gives you the properties of the managed image on completion.
$runOutputName="winclientR01"

# Create a resource group for the VM Image Builder template and Azure Compute Gallery
New-AzResourceGroup `
   -Name $imageResourceGroup `
   -Location $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é d’utilisateur fournie pour injecter l’image dans 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.

# setup role def names, these need to be unique
$timeInt=$(get-date -UFormat "%s")
$imageRoleDefName="Azure Image Builder Image Def"+$timeInt
$identityName="aibIdentity"+$timeInt

## Add an Azure PowerShell module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

# Create an identity
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName

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

Attribuer à l’identité les autorisations nécessaires pour distribuer les images

Utilisez cette commande pour télécharger un modèle de définition de rôle Azure, puis mettez-le à jour avec les paramètres spécifiés précédemment.

$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
$aibRoleImageCreationPath = "aibRoleImageCreation.json"

# Download the configuration
Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing

((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath

# Create a role definition
New-AzRoleDefinition -InputFile  ./aibRoleImageCreation.json

# Grant the role definition to the VM Image Builder service principal
New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"

Notes

Si vous recevez l’erreur « New-AzRoleDefinition : Limite de définition de rôle dépassée. Aucune autre définition de rôle ne peut être créée. », consultez Résoudre les problèmes liés au contrôle d’accès en fonction du rôle (RBAC) Azure.

Pour utiliser VM Image Builder avec une galerie 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.

# Gallery name
$sigGalleryName= "myIBSIG"

# Image definition name
$imageDefName ="winSvrimage"

# Additional replication region
$replRegion2="eastus"

# Create the gallery
New-AzGallery `
   -GalleryName $sigGalleryName `
   -ResourceGroupName $imageResourceGroup  `
   -Location $location

# Create the image definition
New-AzGalleryImageDefinition `
   -GalleryName $sigGalleryName `
   -ResourceGroupName $imageResourceGroup `
   -Location $location `
   -Name $imageDefName `
   -OsState generalized `
   -OsType Windows `
   -Publisher 'myCompany' `
   -Offer 'WindowsServer' `
   -Sku 'WinSrv2019'

Télécharger et configurer le modèle

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


$templateFilePath = "armTemplateWinSIG.json"

Invoke-WebRequest `
   -Uri "https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Win_Shared_Image_Gallery_Image/armTemplateWinSIG.json" `
   -OutFile $templateFilePath `
   -UseBasicParsing

(Get-Content -path $templateFilePath -Raw ) `
   -replace '<subscriptionID>',$subscriptionID | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<rgName>',$imageResourceGroup | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<runOutputName>',$runOutputName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<imageDefName>',$imageDefName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<sharedImageGalName>',$sigGalleryName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<region1>',$location | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
   -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath

Créer la version de l’image

Votre modèle doit être envoyé au service. Les commandes suivantes téléchargent tous les artefacts dépendants, tels que les scripts, et les stockent dans le groupe de ressources intermédiaire, qui est précédé de IT_.

New-AzResourceGroupDeployment `
   -ResourceGroupName $imageResourceGroup `
   -TemplateFile $templateFilePath `
   -ApiVersion "2022-02-14" `
   -imageTemplateName $imageTemplateName `
   -svclocation $location

Pour générer l’image, invoquez « Run » sur le modèle.

Invoke-AzResourceAction `
   -ResourceName $imageTemplateName `
   -ResourceGroupName $imageResourceGroup `
   -ResourceType Microsoft.VirtualMachineImages/imageTemplates `
   -ApiVersion "2022-02-14" `
   -Action Run

La création de l’image et sa réplication dans les deux régions peuvent prendre un certain temps. Avant de commencer à créer une machine virtuelle, attendez que cette partie soit terminée.

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

Création de la machine virtuelle

Créez une machine virtuelle à partir de la version d’image que vous avez créée avec VM Image Builder.

  1. Procurez-vous la version d’image que vous avez créée :

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. Créez la machine virtuelle dans la deuxième région, où l’image a été répliquée :

    $vmResourceGroup = "myResourceGroup"
    $vmName = "myVMfromImage"
    
    # Create user object
    $cred = Get-Credential -Message "Enter a username and password for the virtual machine."
    
    # Create a resource group
    New-AzResourceGroup -Name $vmResourceGroup -Location $replRegion2
    
    # Network pieces
    $subnetConfig = New-AzVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24
    $vnet = New-AzVirtualNetwork -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
    $pip = New-AzPublicIpAddress -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
    $nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP  -Protocol Tcp `
    -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
    -DestinationPortRange 3389 -Access Deny
    $nsg = New-AzNetworkSecurityGroup -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
    $nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $vmResourceGroup -Location $replRegion2 `
    -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
    
    # Create a virtual machine configuration using $imageVersion.Id to specify the image
    $vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1_v2 | `
    Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
    Set-AzVMSourceImage -Id $imageVersion.Id | `
    Add-AzVMNetworkInterface -Id $nic.Id
    
    # Create a virtual machine
    New-AzVM -ResourceGroupName $vmResourceGroup -Location $replRegion2 -VM $vmConfig
    

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 et exécutez la commande suivante :

dir c:\

Le répertoire nommé buildActions, créé pendant la personnalisation de l’image, devrait apparaître.

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.

Le processus suivant 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.

Supprimez d’abord le modèle de groupe de ressources. Sinon, le groupe de ressources intermédiaire (IT_) utilisé par VM Image Builder ne sera pas nettoyé.

  1. Procurez-vous l’ID de ressource du modèle d’image.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Supprimez le modèle d'image.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Supprimez l’attribution de rôle.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Supprimez les définitions.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Supprimez l’identité.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. Supprimez le groupe de ressources.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Étapes suivantes

Pour mettre à jour la version d’image que vous avez créée dans cet article, consultez Utiliser VM Image Builder pour créer une autre version d’image.