Een Virtuele Windows-machine maken met VM Image Builder met behulp van PowerShell

Van toepassing op: ✔️ Windows-VM's

In dit artikel wordt gedemonstreerd hoe u een aangepaste Windows-VM-installatiekopieën maakt met behulp van de PowerShell-module van Azure VM Image Builder.

Vereisten

Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Als u PowerShell lokaal wilt gebruiken, moet u in dit artikel de Azure PowerShell-module installeren en verbinding maken met uw Azure-account met behulp van de cmdlet Verbinding maken-AzAccount. Zie Azure PowerShell installeren voor meer informatie.

Voor sommige van de stappen zijn cmdlets uit de Az.ImageBuilder-module vereist. Installeer deze afzonderlijk met behulp van de volgende opdracht.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure host Azure Cloud Shell, een interactieve shell-omgeving die u via uw browser kunt gebruiken. U kunt Bash of PowerShell gebruiken met Cloud Shell om met Azure-services te werken. U kunt de vooraf geïnstalleerde Cloud Shell-opdrachten gebruiken om de code in dit artikel uit te voeren zonder dat u iets hoeft te installeren in uw lokale omgeving.

Om Azure Cloud Shell op te starten:

Optie Voorbeeld/koppeling
Selecteer Uitproberen in de rechterbovenhoek van een code- of opdrachtblok. Als u Try It selecteert, wordt de code of opdracht niet automatisch gekopieerd naar Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Ga naar https://shell.azure.com, of selecteer de knop Cloud Shell starten om Cloud Shell in uw browser te openen. Button to launch Azure Cloud Shell.
Klik op de knop Cloud Shell in het menu in de balk rechtsboven in de Azure-portal. Screenshot that shows the Cloud Shell button in the Azure portal

Azure Cloud Shell gebruiken:

  1. Start Cloud Shell.

  2. Selecteer de knop Kopiëren op een codeblok (of opdrachtblok) om de code of opdracht te kopiëren.

  3. Plak de code of opdracht in de Cloud Shell-sessie door Ctrl+Shift+V in Windows en Linux te selecteren of door Cmd+Shift+V te selecteren in macOS.

  4. Selecteer Enter om de code of opdracht uit te voeren.

Als u meerdere Azure-abonnementen hebt, kiest u het juiste abonnement waarin de resource moet worden gefactureerd. Selecteer een specifiek abonnement met behulp van de cmdlet Set-AzContext .

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

Providers registreren

Als u dit nog niet hebt gedaan, registreert u de volgende resourceproviders voor gebruik met uw Azure-abonnement:

  • 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

Variabelen definiëren

Omdat u enkele stukjes gegevens herhaaldelijk gaat gebruiken, maakt u enkele variabelen om die informatie op te slaan:

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

Maak een variabele voor uw Azure-abonnements-id. Als u wilt controleren of de subscriptionID variabele uw abonnements-id bevat, kunt u de tweede regel uitvoeren in het volgende voorbeeld:

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

Een brongroep maken

Maak een Azure-resourcegroep met behulp van de cmdlet New-AzResourceGroup . Een resourcegroep is een logische container waarin Azure-resources worden geïmplementeerd en groepsgewijs worden beheerd.

In het volgende voorbeeld wordt een resourcegroep gemaakt die is gebaseerd op de naam in de $imageResourceGroup variabele in de regio die u in de $location variabele hebt opgegeven. Deze resourcegroep wordt gebruikt om het artefact voor de configuratiesjabloon voor installatiekopieën en de installatiekopieën op te slaan.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Een gebruikersidentiteit maken en rolmachtigingen instellen

Verdeel machtigingen voor de opbouwfunctie voor Azure-installatiekopieën om installatiekopieën te maken in de opgegeven resourcegroep met behulp van het volgende voorbeeld. Zonder deze machtiging wordt het buildproces van de installatiekopieën niet voltooid.

  1. Maak variabelen voor de roldefinitie en identiteitsnamen. Deze waarden moeten uniek zijn.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Maak een gebruikersidentiteit.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Sla de id-id's en principal-id's op in variabelen.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

Machtigingen toewijzen voor de identiteit om de installatiekopieën te distribueren

  1. Download het JSON-configuratiebestand en pas het vervolgens aan op basis van de instellingen die in dit artikel zijn gedefinieerd.

    $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. De roldefinitie maken.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Verwijs de roldefinitie aan de service-principal vm Image Builder.

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

Notitie

Als u de fout 'New-AzRoleDefinition: Limiet voor roldefinities is overschreden. Er kunnen geen roldefinities meer worden gemaakt, zie Problemen met Azure RBAC (op rollen gebaseerd toegangsbeheer) oplossen.

  1. Maak de galerie.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Een galeriedefinitie maken.

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

Een installatiekopie maken

  1. Maak een bronobject voor VM Image Builder. Zie Windows VM-installatiekopieën zoeken in Azure Marketplace met Azure PowerShell voor geldige parameterwaarden.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Maak een VM Image Builder-distributeurobject.

    $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. Maak een VM Image Builder-aanpassingsobject.

    $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. Maak een tweede VM Image Builder-aanpassingsobject.

    $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. Maak een VM Image Builder-sjabloon.

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

Wanneer de sjabloon is gemaakt, wordt er een bericht geretourneerd en wordt er een VM Image Builder-configuratiesjabloon gemaakt in $imageResourceGroup.

Gebruik het volgende voorbeeld om te bepalen of het proces voor het maken van de sjabloon is geslaagd:

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

Op de achtergrond maakt VM Image Builder ook een faseringsresourcegroep in uw abonnement. Deze resourcegroep wordt gebruikt voor de build van de installatiekopieën. Het heeft de notatie IT_<DestinationResourceGroup>_<TemplateName>.

Waarschuwing

Verwijder de faseringsresourcegroep niet rechtstreeks. Als u wilt dat de faseringsresourcegroep wordt verwijderd, verwijdert u het artefact van de afbeeldingssjabloon.

Als de service een fout meldt wanneer de installatiekopieconfiguratiesjabloon wordt verzonden, gaat u als volgt te werk:

  • Zie Problemen met azure VM Image Builder oplossen.

  • Voordat u de sjabloon opnieuw verzendt, verwijdert u deze door het volgende voorbeeld te volgen:

    Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
    

De build van de installatiekopieën starten

Verzend de installatiekopieënconfiguratie naar de VM Image Builder-service door de volgende opdracht uit te voeren:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Wacht tot het proces voor het bouwen van afbeeldingen is voltooid, wat maximaal een uur kan duren.

Als er fouten optreden, raadpleegt u Problemen met azure VM Image Builder oplossen.

Een VM maken:

  1. Sla de aanmeldingsreferenties van de VIRTUELE machine op in een variabele. Het wachtwoord moet complex zijn.

    $Cred = Get-Credential
    
  2. Maak de VIRTUELE machine met behulp van de installatiekopieën die u hebt gemaakt.

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

De aanpassingen controleren

  1. Maak een verbinding met extern bureaublad met de virtuele machine met behulp van de gebruikersnaam en het wachtwoord die u hebt ingesteld toen u de virtuele machine maakte.

  2. Open PowerShell in de virtuele machine en voer powershell uit Get-Content, zoals wordt weergegeven in het volgende voorbeeld:

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

    De uitvoer is gebaseerd op de inhoud van het bestand dat u hebt gemaakt tijdens het aanpassingsproces van de afbeelding.

    Azure-Image-Builder-Was-Here
    
  3. Controleer in dezelfde PowerShell-sessie of de tweede aanpassing is voltooid door te controleren op de aanwezigheid van c:\buildArtifacts\index.html, zoals wordt weergegeven in het volgende voorbeeld:

    Get-ChildItem c:\buildArtifacts\
    

    Het resultaat moet een mapvermelding zijn die laat zien dat het bestand is gedownload tijdens het aanpassingsproces van de installatiekopieën.

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

Uw resources opschonen

Als u de resources die tijdens dit proces zijn gemaakt niet meer nodig hebt, kunt u ze als volgt verwijderen:

  1. Verwijder de VM Image Builder-sjabloon.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Verwijder de resourcegroep van de installatiekopieën.

    Let op

    In het volgende voorbeeld worden de opgegeven resourcegroep en alle resources die deze bevat, verwijderd. Als er resources buiten het bereik van dit artikel aanwezig zijn in de resourcegroep, worden ze ook verwijderd.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Volgende stappen

Zie de sjabloonreferentie voor VM Image Builder voor meer informatie over de onderdelen van het JSON-bestand dat in dit artikel wordt gebruikt.