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.
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
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
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.
Créer une instance Azure Compute Gallery
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.
Procurez-vous la version d’image que vous avez créée :
$imageVersion = Get-AzGalleryImageVersion ` -ResourceGroupName $imageResourceGroup ` -GalleryName $sigGalleryName ` -GalleryImageDefinitionName $imageDefName $imageVersionId = $imageVersion.Id
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é.
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"
Supprimez le modèle d'image.
Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
Supprimez l’attribution de rôle.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Supprimez les définitions.
Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Supprimez l’identité.
Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
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.