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 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.
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
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
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.
Tworzenie galerii zasobów obliczeniowych platformy 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.
Pobierz utworzoną wersję obrazu:
$imageVersion = Get-AzGalleryImageVersion ` -ResourceGroupName $imageResourceGroup ` -GalleryName $sigGalleryName ` -GalleryImageDefinitionName $imageDefName $imageVersionId = $imageVersion.Id
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.
Pobierz identyfikator ResourceID szablonu obrazu.
$resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
Usuń szablon obrazu.
Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
Usuń przypisanie roli.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Usuń definicje.
Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Usuń tożsamość.
Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
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.