Sdílet prostřednictvím


Vytvoření image Windows a její distribuce do galerie služby Azure Compute

Platí pro: ✔️ Virtuální počítače s Windows

V tomto článku se naučíte používat Azure VM Image Builder a Azure PowerShell k vytvoření verze image v Galerii výpočetních prostředků Azure (dříve Sdílená galerie imagí) a pak ji globálně distribuovat. Můžete to provést také pomocí Azure CLI.

Ke konfiguraci obrázku tento článek používá šablonu JSON, kterou najdete na armTemplateWinSIG.json. Stáhnete a upravíte místní verzi šablony, takže budete také používat místní relaci PowerShellu.

Pokud chcete distribuovat image do galerie služby Azure Compute, šablona jako hodnotu oddílu distribute šablony používá sharedImage.

VM Image Builder se automaticky spustí Sysprep , aby se image zobecněla. Příkaz je obecný Sysprep a v případě potřeby ho můžete přepsat .

Mějte na paměti, kolikrát přizpůsobení vrstvíte. Na Sysprep jedné imagi Windows můžete příkaz spustit několikrát. Po dosažení limitu Sysprep musíte znovu vytvořit image Windows. Další informace najdete v tématu Omezení počtu spuštění nástroje Sysprep.

Registrace poskytovatelů

Pokud chcete použít Nástroj Image Builder virtuálního počítače, musíte poskytovatele zaregistrovat.

  1. Zkontrolujte registraci poskytovatele. Ujistěte se, že každý z nich vrátí Zaregistrovaný.

    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. Pokud nevrátí zaregistrované, zaregistrujte poskytovatele spuštěním následujících příkazů:

    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. Instalace modulů PowerShellu:

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

Vytvoření proměnných

Protože budete opakovaně používat některé části informací, vytvořte některé proměnné pro uložení těchto informací.

Nahraďte hodnoty proměnných, například username a vmpassword, vlastními informacemi.

# 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

Vytvoření identity přiřazené uživatelem a nastavení oprávnění pro skupinu prostředků

Image Builder virtuálního počítače používá zadanou identitu uživatele k vložení image do Galerie výpočetních prostředků Azure. V tomto příkladu vytvoříte definici role Azure s konkrétními akcemi pro distribuci image. Definice role se pak přiřadí identitě uživatele.

# 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

Přiřazení oprávnění pro identitu k distribuci imagí

Tento příkaz použijte ke stažení šablony definice role Azure a pak ji aktualizujte pomocí dříve zadaných parametrů.

$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"

Poznámka:

Pokud se zobrazí chyba New-AzRoleDefinition: Byl překročen limit definice role. Žádné další definice rolí se nedají vytvořit," přečtěte si téma Řešení potíží s Azure RBAC (řízení přístupu na základě role).

Pokud chcete použít Tvůrce imagí virtuálních počítačů s galerií služby Azure Compute, musíte mít existující galerii a definici image. VM Image Builder za vás nevytvoří galerii a definici image.

Pokud ještě nemáte k dispozici galerii a definici obrázku, začněte jejich vytvořením.

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

Stažení a konfigurace šablony

Stáhněte si šablonu JSON a nakonfigurujte ji s vašimi proměnnými.


$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

Vytvoření verze image

Šablona musí být odeslána do služby. Následující příkazy stáhnutí všech závislých artefaktů, jako jsou skripty, a uloží je do přípravné skupiny prostředků, která má předponu IT_.

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

Pokud chcete vytvořit image, v šabloně spusťte příkaz Spustit.

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

Vytvoření image a jeho replikace do obou oblastí může chvíli trvat. Než začnete vytvářet virtuální počítač, počkejte na dokončení této části.

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

Vytvoření virtuálního počítače

Vytvořte virtuální počítač z verze image, kterou jste vytvořili pomocí Nástroje image virtuálního počítače.

  1. Získejte verzi image, kterou jste vytvořili:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. Vytvořte virtuální počítač v druhé oblasti, kde se image replikovala:

    $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
    

Ověření vlastního nastavení

Vytvořte připojení ke vzdálené ploše k virtuálnímu počítači pomocí uživatelského jména a hesla, které jste nastavili při vytváření virtuálního počítače. Na virtuálním počítači otevřete okno příkazového řádku a spusťte následující příkaz:

dir c:\

Měl by se zobrazit adresář buildActions , který byl vytvořen během přizpůsobení image.

Vyčištění prostředků

Poznámka:

Pokud se teď chcete pokusit znovu použít verzi image a vytvořit novou verzi stejné image, přeskočte zde uvedený krok a přejděte k vytvoření jiné verze image pomocí Nástroje image virtuálního počítače.

Pokud už nepotřebujete prostředky, které jste vytvořili podle postupu v tomto článku, můžete je odstranit.

Následující proces odstraní image, kterou jste vytvořili, i všechny ostatní soubory prostředků. Před odstraněním prostředků se ujistěte, že jste dokončili toto nasazení.

Nejprve odstraňte šablonu skupiny prostředků. Jinak se pracovní skupina prostředků (IT_), kterou nástroj Image Builder používá, nevyčistí.

  1. Získejte ID prostředku šablony obrázku.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Odstraňte šablonu obrázku.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Odstraňte přiřazení role.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Odeberte definice.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Odstraňte identitu.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. Odstraňte skupinu prostředků.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Další kroky

Pokud chcete aktualizovat verzi image, kterou jste vytvořili v tomto článku, přečtěte si téma Použití Nástroje image virtuálního počítače k vytvoření jiné verze image.