Tworzenie obrazu systemu Windows i dystrybuowanie go do galerii zasobów obliczeniowych platformy Azure

Dotyczy: ✔️ maszyny wirtualne z systemem Windows

Z tego artykułu dowiesz się, jak używać narzędzia Azure VM Image Builder i programu Azure PowerShell do tworzenia wersji obrazu w galerii obliczeń platformy Azure (wcześniej udostępnionej galerii obrazów), a następnie dystrybuować obraz globalnie. Można to również zrobić przy użyciu interfejsu wiersza polecenia platformy Azure.

Aby skonfigurować obraz, w tym artykule jest używany szablon JSON, który można znaleźć w pliku armTemplateWinSIG.json. Pobierzesz i zmodyfikujesz lokalną wersję szablonu, więc użyjesz również lokalnej sesji programu PowerShell.

Aby rozpowszechnić obraz w galerii obliczeniowej platformy Azure, szablon używa funkcji sharedImage jako wartości distribute sekcji szablonu.

Konstruktor obrazów maszyny wirtualnej jest uruchamiany Sysprep automatycznie w celu uogólninia obrazu. Polecenie jest ogólnym Sysprep poleceniem i można go zastąpić, jeśli jest to konieczne.

Należy pamiętać o liczbie dostosowań warstwy. Polecenie można uruchomić Sysprep ograniczoną liczbę razy na jednym obrazie systemu Windows. Po osiągnięciu limitu Sysprep należy ponownie utworzyć obraz systemu Windows. Aby uzyskać więcej informacji, zobacz Limity dotyczące liczby uruchomień programu Sysprep.

Rejestrowanie dostawców

Aby użyć narzędzia VM Image Builder, musisz zarejestrować dostawców.

  1. Sprawdź rejestracje dostawcy. Upewnij się, że każdy z nich zwraca wartość Zarejestrowano.

    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. Jeśli nie zostaną zwrócone zarejestrowane, zarejestruj dostawców, uruchamiając następujące polecenia:

    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. Zainstaluj moduły programu PowerShell:

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

Tworzenie zmiennych

Ponieważ będziesz używać niektórych informacji wielokrotnie, utwórz pewne zmienne do przechowywania tych informacji.

Zastąp wartości zmiennych, takich jak username i vmpassword, własnymi informacjami.

# 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

Tworzenie tożsamości przypisanej przez użytkownika i ustawianie uprawnień w grupie zasobów

Konstruktor obrazów maszyny wirtualnej używa podanej tożsamości użytkownika do wstrzykiwania obrazu do galerii obliczeń platformy Azure. W tym przykładzie utworzysz definicję roli platformy Azure z określonymi akcjami do dystrybucji obrazu. Definicja roli jest następnie przypisywana do tożsamości użytkownika.

# 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

Przypisywanie uprawnień do tożsamości w celu rozpowszechniania obrazów

Użyj tego polecenia, aby pobrać szablon definicji roli platformy Azure, a następnie zaktualizować go przy użyciu wcześniej określonych parametrów.

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

Uwaga

Jeśli zostanie wyświetlony błąd "New-AzRoleDefinition: Przekroczono limit definicji roli. Nie można utworzyć więcej definicji ról", zobacz Rozwiązywanie problemów z kontrolą dostępu opartą na rolach na platformie Azure.

Aby użyć konstruktora obrazów maszyny wirtualnej z galerią obliczeń platformy Azure, musisz mieć istniejącą galerię i definicję obrazu. Konstruktor obrazów maszyny wirtualnej nie tworzy galerii i definicji obrazu.

Jeśli nie masz jeszcze galerii i definicji obrazu do użycia, zacznij od ich utworzenia.

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

Pobieranie i konfigurowanie szablonu

Pobierz szablon JSON i skonfiguruj go przy użyciu zmiennych.


$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

Tworzenie wersji obrazu

Szablon musi zostać przesłany do usługi. Następujące polecenia będą pobierać wszelkie zależne artefakty, takie jak skrypty, i przechowywać je w przejściowej grupie zasobów, która jest poprzedzona IT_.

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

Aby skompilować obraz, wywołaj metodę "Uruchom" w szablonie.

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

Utworzenie obrazu i replikowanie go do obu regionów może potrwać kilka chwil. Przed rozpoczęciem tworzenia maszyny wirtualnej poczekaj na zakończenie tej części.

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

Tworzenie maszyny wirtualnej

Utwórz maszynę wirtualną na podstawie wersji obrazu utworzonej za pomocą narzędzia Vm Image Builder.

  1. Pobierz utworzoną wersję obrazu:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. Utwórz maszynę wirtualną w drugim regionie, w którym obraz został zreplikowany:

    $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
    

Weryfikowanie dostosowania

Utwórz połączenie pulpitu zdalnego z maszyną wirtualną przy użyciu nazwy użytkownika i hasła ustawionego podczas tworzenia maszyny wirtualnej. Na maszynie wirtualnej otwórz okno wiersza polecenia i uruchom następujące polecenie:

dir c:\

Powinien zostać wyświetlony katalog o nazwie buildActions , który został utworzony podczas dostosowywania obrazu.

Oczyszczanie zasobów

Uwaga

Jeśli chcesz teraz spróbować ponownie utworzyć wersję obrazu, aby utworzyć nową wersję tego samego obrazu, pomiń krok opisany tutaj i przejdź do sekcji Używanie narzędzia VM Image Builder, aby utworzyć inną wersję obrazu.

Jeśli nie potrzebujesz już zasobów utworzonych podczas wykonywania procesu opisanego w tym artykule, możesz je usunąć.

Poniższy proces usuwa zarówno obraz, który został utworzony, jak i wszystkie inne pliki zasobów. Przed usunięciem zasobów upewnij się, że to wdrożenie zostało ukończone.

Najpierw usuń szablon grupy zasobów. W przeciwnym razie tymczasowa grupa zasobów (IT_), która będzie używana przez narzędzie Vm Image Builder, nie zostanie wyczyszczona.

  1. Pobierz identyfikator ResourceID szablonu obrazu.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Usuń szablon obrazu.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Usuń przypisanie roli.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Usuń definicje.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Usuń tożsamość.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. Usuń grupę zasobów.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Następne kroki

Aby zaktualizować wersję obrazu utworzoną w tym artykule, zobacz Tworzenie innej wersji obrazu przy użyciu konstruktora obrazów maszyny wirtualnej.