Tworzenie maszyny wirtualnej z systemem Windows przy użyciu programu Image Builder przy użyciu programu PowerShell

Dotyczy: ✔️ maszyny wirtualne z systemem Windows

W tym artykule pokazano, jak utworzyć dostosowany obraz maszyny wirtualnej z systemem Windows przy użyciu modułu Programu PowerShell dla maszyny wirtualnej platformy Azure.

Wymagania wstępne

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Jeśli zdecydujesz się używać programu PowerShell lokalnie, ten artykuł wymaga zainstalowania modułu Azure PowerShell i nawiązania połączenia z kontem platformy Azure przy użyciu polecenia cmdlet Połączenie-AzAccount. Aby uzyskać więcej informacji, zobacz Instalowanie programu Azure PowerShell.

Niektóre kroki wymagają poleceń cmdlet z modułu Az.ImageBuilder . Zainstaluj oddzielnie przy użyciu następującego polecenia.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Na platforma Azure hostowane jest Azure Cloud Shell, interaktywne środowisko powłoki, z którego można korzystać w przeglądarce. Do pracy z usługami platformy Azure można używać programu Bash lub PowerShell w środowisku Cloud Shell. Aby uruchomić kod w tym artykule, możesz użyć wstępnie zainstalowanych poleceń usługi Cloud Shell bez konieczności instalowania niczego w środowisku lokalnym.

Aby uruchomić środowisko Azure Cloud Shell:

Opcja Przykład/link
Wybierz pozycję Wypróbuj w prawym górnym rogu bloku kodu lub polecenia. Wybranie pozycji Wypróbuj nie powoduje automatycznego skopiowania kodu lub polecenia do usługi Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Przejdź do witryny https://shell.azure.com lub wybierz przycisk Uruchom Cloud Shell, aby otworzyć środowisko Cloud Shell w przeglądarce. Button to launch Azure Cloud Shell.
Wybierz przycisk Cloud Shell na pasku menu w prawym górnym rogu witryny Azure Portal. Screenshot that shows the Cloud Shell button in the Azure portal

Aby użyć usługi Azure Cloud Shell:

  1. Uruchom usługę Cloud Shell.

  2. Wybierz przycisk Kopiuj w bloku kodu (lub bloku poleceń), aby skopiować kod lub polecenie.

  3. Wklej kod lub polecenie do sesji usługi Cloud Shell, wybierając klawisze Ctrl+Shift V w systemach Windows i Linux lub wybierając pozycję Cmd+Shift++V w systemie macOS.

  4. Wybierz klawisz Enter, aby uruchomić kod lub polecenie.

Jeśli masz wiele subskrypcji platformy Azure, wybierz odpowiednią subskrypcję, w której mają być rozliczane zasoby. Wybierz określoną subskrypcję przy użyciu polecenia cmdlet Set-AzContext .

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

Rejestrowanie dostawców

Jeśli jeszcze tego nie zrobiono, zarejestruj następujących dostawców zasobów do użycia z subskrypcją platformy Azure:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Definiowanie zmiennych

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

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Utwórz zmienną dla identyfikatora subskrypcji platformy Azure. Aby potwierdzić, że zmienna subscriptionID zawiera identyfikator subskrypcji, możesz uruchomić drugi wiersz w poniższym przykładzie:

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

Tworzenie grupy zasobów

Utwórz grupę zasobów platformy Azure przy użyciu polecenia cmdlet New-AzResourceGroup. Grupa zasobów to logiczny kontener przeznaczony do wdrażania zasobów platformy Azure i zarządzania nimi w formie grupy.

Poniższy przykład tworzy grupę zasobów opartą na nazwie w $imageResourceGroup zmiennej w regionie określonym w zmiennej $location . Ta grupa zasobów służy do przechowywania artefaktu szablonu konfiguracji obrazu i obrazu.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Tworzenie tożsamości użytkownika i ustawianie uprawnień roli

Przy użyciu poniższego przykładu przyznaj konstruktorowi obrazów platformy Azure uprawnienia do tworzenia obrazów w określonej grupie zasobów. Bez tego uprawnienia proces kompilacji obrazu nie zakończy się pomyślnie.

  1. Utwórz zmienne dla definicji roli i nazw tożsamości. Te wartości muszą być unikatowe.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Utwórz tożsamość użytkownika.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Przechowuj zasób tożsamości i identyfikatory podmiotów zabezpieczeń w zmiennych.

    $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

  1. Pobierz plik konfiguracji JSON, a następnie zmodyfikuj go na podstawie ustawień zdefiniowanych w tym artykule.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. Utwórz definicję roli.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Udziel definicji roli jednostce usługi Konstruktor obrazów maszyny wirtualnej.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

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.

  1. Utwórz galerię.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Utwórz definicję galerii.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

Tworzenie obrazu

  1. Utwórz obiekt źródłowy konstruktora obrazów maszyny wirtualnej. Aby uzyskać prawidłowe wartości parametrów, zobacz Znajdowanie obrazów maszyn wirtualnych z systemem Windows w witrynie Azure Marketplace przy użyciu programu Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Utwórz obiekt dystrybutora konstruktora obrazów maszyny wirtualnej.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. Utwórz obiekt dostosowywania konstruktora obrazów maszyny wirtualnej.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. Utwórz drugi obiekt dostosowywania konstruktora obrazów maszyny wirtualnej.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. Utwórz szablon konstruktora obrazów maszyny wirtualnej.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

Po utworzeniu szablonu zostanie zwrócony komunikat, a szablon konfiguracji konstruktora obrazów maszyny wirtualnej zostanie utworzony w programie $imageResourceGroup.

Aby określić, czy proces tworzenia szablonu zakończył się pomyślnie, użyj następującego przykładu:

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

W tle narzędzie VM Image Builder tworzy również tymczasową grupę zasobów w ramach subskrypcji. Ta grupa zasobów jest używana na potrzeby kompilacji obrazu. IT_<DestinationResourceGroup>_<TemplateName>Ma format .

Ostrzeżenie

Nie usuwaj tymczasowej grupy zasobów bezpośrednio. Aby spowodować usunięcie przejściowej grupy zasobów, usuń artefakt szablonu obrazu.

Jeśli usługa zgłasza błąd podczas przesyłania szablonu konfiguracji obrazu, wykonaj następujące czynności:

Uruchamianie kompilacji obrazu

Prześlij konfigurację obrazu do usługi Vm Image Builder, uruchamiając następujące polecenie:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Poczekaj na zakończenie procesu tworzenia obrazu, co może potrwać do godziny.

Jeśli wystąpią błędy, zapoznaj się z artykułem Rozwiązywanie problemów z błędami narzędzia Image Builder maszyny wirtualnej platformy Azure.

Tworzenie maszyny wirtualnej

  1. Zapisz poświadczenia logowania maszyny wirtualnej w zmiennej. Hasło musi być złożone.

    $Cred = Get-Credential
    
  2. Utwórz maszynę wirtualną przy użyciu utworzonego obrazu.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

Weryfikowanie dostosowań

  1. Utwórz połączenie pulpitu zdalnego z maszyną wirtualną przy użyciu nazwy użytkownika i hasła ustawionego podczas tworzenia maszyny wirtualnej.

  2. Na maszynie wirtualnej otwórz program PowerShell i uruchom polecenie Get-Content, jak pokazano w poniższym przykładzie:

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    Dane wyjściowe są oparte na zawartości pliku utworzonego podczas procesu dostosowywania obrazu.

    Azure-Image-Builder-Was-Here
    
  3. W tej samej sesji programu PowerShell sprawdź, czy drugie dostosowanie zakończyło się pomyślnie, sprawdzając obecność c:\buildArtifacts\index.htmlelementu , jak pokazano w poniższym przykładzie:

    Get-ChildItem c:\buildArtifacts\
    

    Wynikiem powinna być lista katalogów pokazująca, że plik został pobrany podczas procesu dostosowywania obrazu.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

Oczyszczanie zasobów

Jeśli nie potrzebujesz już zasobów utworzonych podczas tego procesu, możesz je usunąć, wykonując następujące czynności:

  1. Usuń szablon konstruktora obrazów maszyny wirtualnej.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Usuń grupę zasobów obrazu.

    Uwaga

    Poniższy przykład usuwa określoną grupę zasobów i wszystkie zawarte w niej zasoby. Jeśli jakiekolwiek zasoby spoza zakresu tego artykułu istnieją w grupie zasobów, zostaną również usunięte.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Następne kroki

Aby dowiedzieć się więcej o składnikach pliku JSON używanego w tym artykule, zobacz dokumentację szablonu narzędzia Image Builder maszyny wirtualnej.