Erstellen einer Windows-VM mithilfe von Azure VM Image Builder

Gilt für: ✔️ Windows-VMs

In diesem Artikel erfahren Sie, wie Sie ein angepasstes Windows-Image mithilfe von VM Image Builder erstellen. Im Beispiel in diesem Artikel werden Anpassungen für das Image verwendet:

  • PowerShell (ScriptUri): Lädt ein PowerShell-Skript herunter und führt es aus.
  • Windows-Neustart: Startet die VM neu.
  • PowerShell (inline): Führt einen bestimmten Befehl aus. In diesem Beispiel wird mit mkdir c:\\buildActions ein Verzeichnis auf der VM erstellt.
  • Datei: Kopiert eine Datei aus GitHub auf die VM. In diesem Beispiel wird index.md in c:\buildArtifacts\index.html auf den virtuellen Computer kopiert.
  • buildTimeoutInMinutes: Gibt eine Buildzeit in Minuten an. Der Standardwert ist 240 Minuten. Sie können diesen Wert erhöhen, um zeitintensivere Builds zuzulassen. Der minimal zulässige Wert ist 6 Minuten. Werte, die kürzer als 6 Minuten sind, verursachen Fehler.
  • vmProfile: Gibt eine vmSize und Netzwerkeigenschaften an.
  • osDiskSizeGB: Kann verwendet werden, um die Größe eines Images zu erhöhen.
  • identity. Gibt eine Identität an, die Azure Image Builder während des Buildprozesses verwenden soll.

Verwenden Sie die folgende JSON-Beispielvorlage, um das Image zu konfigurieren: helloImageTemplateWin.json.

Hinweis

Windows-Benutzer können die folgenden Azure CLI-Beispiele in Azure Cloud Shell unter Verwendung von Bash ausführen.

Registrieren Sie die Anbieter

Um den VM Image Builder zu verwenden, müssen Sie das Feature registrieren. Überprüfen Sie Ihre Registrierung, indem Sie die folgenden Befehle ausführen:

az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState

Wenn die Ausgabe nicht registered (registriert) lautet, führen Sie die folgenden Befehle aus:

az provider register -n Microsoft.VirtualMachineImages
az provider register -n Microsoft.Compute
az provider register -n Microsoft.KeyVault
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Network
az provider register -n Microsoft.ContainerInstance

Festlegen von Variablen

Da Sie einige Informationen wiederholt verwenden werden, erstellen Sie einige Variablen, um diese Informationen zu speichern:

# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='WestUS2'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'

Erstellen Sie eine Variable für Ihre Abonnement-ID:

subscriptionID=$(az account show --query id --output tsv)

Erstellen der Ressourcengruppe

Verwenden Sie die folgende Ressourcengruppe, um das Imagekonfigurationsvorlagen-Artefakt und das Image zu speichern:

az group create -n $imageResourceGroup -l $location

Erstellen einer vom Benutzer zugewiesene Identität und Festlegen von Berechtigungen für die Ressourcengruppe

VM Image Builder verwendet die angegebene Benutzeridentität, um das Image in die Ressourcengruppe einzufügen. In diesem Beispiel erstellen Sie eine Azure-Rollendefinition mit spezifischen Berechtigungen für die Verteilung des Images. Die Rollendefinition wird dann der Benutzeridentität zugewiesen.

Erstellen einer benutzerseitig zugewiesenen verwalteten Identität und Gewähren von Berechtigungen

Erstellen Sie eine benutzerseitig zugewiesene Identität, sodass VM Image Builder auf das Speicherkonto zugreifen kann, in dem das Skript gespeichert ist.

identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download the preconfigured role definition example
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')

# Update the definition
sed -i -e "s%<subscriptionID>%$subscriptionID%g" aibRoleImageCreation.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" aibRoleImageCreation.json
sed -i -e "s%Azure Image Builder Service Image Creation Role%$imageRoleDefName%g" aibRoleImageCreation.json

# Create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json

# Grant a role definition to the user-assigned identity
az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup

Herunterladen der Vorlage für die Imagekonfiguration

Wir haben eine parametrisierte Imagekonfigurationsvorlage erstellt, die Sie verwenden können. Laden Sie die JSON-Beispieldatei herunter, und konfigurieren Sie sie mit den zuvor festgelegten Variablen.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json

sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json

Sie können dieses Beispiel im Terminal mithilfe eines Text-Editors wie vi ändern.

vi helloImageTemplateWin.json

Hinweis

Geben Sie für das Quellimage immer eine Version an. Sie können nicht latest als Version angeben.

Wenn Sie die Ressourcengruppe hinzufügen oder ändern, in der das Image verteilt wird, müssen Sie sicherstellen, dass die Berechtigungen für die Ressourcengruppe festgelegt sind.

Erstellen des Images

Senden Sie die Imagekonfiguration an den VM Image Builder-Dienst, indem Sie die folgenden Befehle ausführen:

az resource create \
    --resource-group $imageResourceGroup \
    --properties @helloImageTemplateWin.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Wenn Sie fertig sind, wird eine Erfolgsnachricht an die Konsole zurückgegeben, und eine VM Image Builder-Konfigurationsvorlage wird in der $imageResourceGroup erstellt.

Außerdem erstellt VM Image Builder im Hintergrund eine Stagingressourcengruppe in Ihrem Abonnement. Diese Ressourcengruppe wird verwendet, um das Image im folgenden Format zu erstellen: IT_<DestinationResourceGroup>_<TemplateName>.

Hinweis

Wenn das Löschen erforderlich ist, löschen Sie die Stagingressourcengruppe nicht direkt. Löschen Sie zunächst das Imagevorlagenartefakt, das anschließend die Stagingressourcengruppe löscht. Andernfalls kann die Imagevorlage in einen fehlerhaften Zustand übergehen.

Wenn der Dienst einen Fehler meldet, wenn Sie die Imagekonfigurationsvorlage übermitteln, gehen Sie wie folgt vor:

az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Starten des Imagebuilds

Starten Sie den Imagebuildprozess mithilfe von az resource invoke-action.

az resource invoke-action \
     --resource-group $imageResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n helloImageTemplateWin01 \
     --action Run

Warten Sie, bis der Build abgeschlossen ist.

Wenn Fehler auftreten, lesen Sie Problembehandlung des Azure VM Image Builder-Diensts.

Erstellen des virtuellen Computers

Erstellen Sie die VM mithilfe des erstellten Images. Ersetzen Sie im folgenden Code das <Kennwort> durch Ihr eigenes Kennwort für den aibuser auf der VM.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgWinVm00 \
  --admin-username aibuser \
  --admin-password <password> \
  --image $imageName \
  --location $location

Überprüfen der Anpassung

Stellen Sie eine Remotedesktopverbindung mit der VM mit dem Benutzernamen und dem Kennwort her, die Sie beim Erstellen der VM festgelegt haben. Öffnen Sie auf der VM ein Eingabeaufforderungsfenster, und geben Sie dann Folgendes ein:

dir c:\

Die folgenden beiden Verzeichnisse werden während der Imageanpassung erstellt:

  • buildActions
  • buildArtifacts

Bereinigen von Ressourcen

Wenn Sie fertig sind, löschen Sie die von Ihnen erstellten Ressourcen.

  1. Löschen Sie die VM Image Builder-Vorlage.

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. Löschen Sie die Rollenzuweisung, die Rollendefinition und die Benutzeridentität.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Löschen Sie die Imageressourcengruppe.

    az group delete -n $imageResourceGroup
    

Nächste Schritte

Weitere Informationen zu den Komponenten der in diesem Artikel verwendeten JSON-Datei finden Sie in der VM Image Builder-Vorlagenreferenz.