Dela via


Skapa en virtuell Windows-dator med VM Image Builder med hjälp av PowerShell

Gäller för: ✔️ Virtuella Windows-datorer

Den här artikeln visar hur du skapar en anpassad Windows VM-avbildning med hjälp av PowerShell-modulen Azure VM Image Builder.

Förutsättningar

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Om du väljer att använda PowerShell lokalt kräver den här artikeln att du installerar Azure PowerShell-modulen och ansluter till ditt Azure-konto med hjälp av cmdleten Connect-AzAccount . Mer information finns i Installera Azure PowerShell.

Vissa av stegen kräver cmdletar från modulen Az.ImageBuilder . Installera separat med hjälp av följande kommando.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure är värd för Azure Cloud Shell, en interaktiv gränssnittsmiljö som du kan använda via webbläsaren. Du kan använda antingen Bash eller PowerShell med Cloud Shell för att arbeta med Azure-tjänster. Du kan använda förinstallerade Cloud Shell-kommandon för att köra koden i den här artikeln, utan att behöva installera något i din lokala miljö.

Så här startar du Azure Cloud Shell:

Alternativ Exempel/länk
Välj Prova i det övre högra hörnet i en kod eller ett kommandoblock. Om du väljer Prova kopieras inte koden eller kommandot automatiskt till Cloud Shell. Skärmbild som visar ett exempel på Try It for Azure Cloud Shell.
Gå till https://shell.azure.com eller Välj knappen Starta Cloud Shell för att öppna Cloud Shell i webbläsaren. Knapp för att starta Azure Cloud Shell.
Välj knappen Cloud Shell på menyn längst upp till höger i Azure-portalen. Skärmbild som visar Cloud Shell-knappen i Azure-portalen

Så här använder du Azure Cloud Shell:

  1. Starta Cloud Shell.

  2. Välj knappen Kopiera i ett kodblock (eller kommandoblock) för att kopiera koden eller kommandot.

  3. Klistra in koden eller kommandot i Cloud Shell-sessionen genom att välja Ctrl+Skift+V i Windows och Linux, eller genom att välja Cmd+Shift+V på macOS.

  4. Välj Retur för att köra koden eller kommandot.

Om du har flera Azure-prenumerationer väljer du den prenumeration där resurserna ska faktureras. Välj en specifik prenumeration med hjälp av cmdleten Set-AzContext .

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

Registrera providrar

Om du inte redan har gjort det registrerar du följande resursprovidrar som ska användas med din Azure-prenumeration:

  • 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

Definiera variabler

Eftersom du kommer att använda viss information upprepade gånger skapar du några variabler för att lagra den informationen:

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

Skapa en variabel för ditt Azure-prenumerations-ID. För att bekräfta att variabeln subscriptionID innehåller ditt prenumerations-ID kan du köra den andra raden i följande exempel:

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

Skapa en resursgrupp

Skapa en Azure-resursgrupp med hjälp av cmdleten New-AzResourceGroup . En resursgrupp är en logisk container där Azure-resurser distribueras och hanteras som en grupp.

I följande exempel skapas en resursgrupp som baseras på namnet i variabeln $imageResourceGroup i den region som du har angett i variabeln $location . Den här resursgruppen används för att lagra artefakten för avbildningskonfigurationsmallen och avbildningen.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Skapa en användaridentitet och ange rollbehörigheter

Ge Azure Image Builder behörighet att skapa avbildningar i den angivna resursgruppen med hjälp av följande exempel. Utan den här behörigheten slutförs inte avbildningsprocessen.

  1. Skapa variabler för rolldefinitionen och identitetsnamnen. Dessa värden måste vara unika.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Skapa en användaridentitet.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Lagra identitetsresursen och huvudnamns-ID:t i variabler.

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

Tilldela behörigheter för identiteten för att distribuera avbildningarna

  1. Ladda ned JSON-konfigurationsfilen och ändra den baserat på de inställningar som definieras i den här artikeln.

    $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. Skapa rolldefinitionen.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Bevilja rolldefinitionen till tjänstens huvudnamn för den virtuella datorn Image Builder.

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

Kommentar

Om du får felet "New-AzRoleDefinition: Rolldefinitionsgränsen har överskridits. Inga fler rolldefinitioner kan skapas", se Felsöka Azure RBAC (rollbaserad åtkomstkontroll).

  1. Skapa galleriet.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Skapa en galleridefinition.

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

Skapa en avbildning

  1. Skapa ett vm Image Builder-källobjekt. Giltiga parametervärden finns i Hitta avbildningar av virtuella Windows-datorer på Azure Marketplace med Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Skapa ett distributionsobjekt för image builder för virtuell dator.

    $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. Skapa ett anpassningsobjekt för VM Image Builder.

    $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. Skapa ett andra anpassningsobjekt för VM Image Builder.

    $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. Skapa en mall för VM Image Builder.

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

När mallen har skapats returneras ett meddelande och en konfigurationsmall för VM Image Builder skapas i $imageResourceGroup.

Använd följande exempel för att avgöra om processen för att skapa mallen lyckades:

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

I bakgrunden skapar VM Image Builder också en mellanlagringsresursgrupp i din prenumeration. Den här resursgruppen används för avbildningsversionen. Det är i formatet IT_<DestinationResourceGroup>_<TemplateName>.

Varning

Ta inte bort mellanlagringsresursgruppen direkt. Om du vill att mellanlagringsresursgruppen ska tas bort tar du bort artefakten för avbildningsmallen.

Om tjänsten rapporterar ett fel när avbildningskonfigurationsmallen skickas gör du följande:

  • Se Felsöka fel i Azure VM Image Builder.

  • Innan du försöker skicka mallen igen tar du bort den genom att följa det här exemplet:

    Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
    

Starta avbildningsversionen

Skicka avbildningskonfigurationen till tjänsten Image Builder för den virtuella datorn genom att köra följande kommando:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Vänta tills avbildningsprocessen har slutförts, vilket kan ta upp till en timme.

Om du får fel kan du läsa Felsöka fel med Azure VM Image Builder.

Skapa en virtuell dator

  1. Lagra inloggningsuppgifterna för den virtuella datorn i en variabel. Lösenordet måste vara komplext.

    $Cred = Get-Credential
    
  2. Skapa den virtuella datorn med den avbildning som du skapade.

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

Verifiera anpassningarna

  1. Skapa en fjärrskrivbordsanslutning till den virtuella datorn med det användarnamn och lösenord som du angav när du skapade den virtuella datorn.

  2. Öppna PowerShell på den virtuella datorn och kör Get-Content, som du ser i följande exempel:

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

    Utdata baseras på innehållet i filen som du skapade under anpassningsprocessen för avbildningen.

    Azure-Image-Builder-Was-Here
    
  3. Från samma PowerShell-session kontrollerar du att den andra anpassningen har slutförts genom att kontrollera förekomsten av c:\buildArtifacts\index.html, som du ser i följande exempel:

    Get-ChildItem c:\buildArtifacts\
    

    Resultatet bör vara en kataloglista som visar att filen laddades ned under anpassningsprocessen för avbildningen.

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

Rensa dina resurser

Om du inte längre behöver de resurser som skapades under den här processen kan du ta bort dem genom att göra följande:

  1. Ta bort mallen för VM Image Builder.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Ta bort bildresursgruppen.

    Varning

    I följande exempel tas den angivna resursgruppen bort och alla resurser som den innehåller. Om det finns resurser utanför omfånget för den här artikeln i resursgruppen tas de också bort.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Nästa steg

Mer information om komponenterna i JSON-filen som används i den här artikeln finns i mallreferensen för VM Image Builder.