DevOps-Task des Azure VM Image Builder-Diensts (Vorschau)

Gilt für: ✔️ Linux-VMs ✔️ Flexible Skalierungsgruppen

In diesem Artikel erfahren Sie, wie Sie einen Azure DevOps-Task verwenden, um Buildartefakte in ein VM-Image zu injizieren, damit Sie Ihre Anwendung und Ihr Betriebssystem installieren und konfigurieren können.

DevOps-Taskversionen

Zurzeit gibt es zwei DevOps-Tasks in Azure VM Image Builder:

Voraussetzungen

Hinweis

Der VM Image Builder-Task unterstützt derzeit weder einen Windows-Neustart noch die Ausführung von Befehlen mit erhöhten Berechtigungen als Administrator. Dies bedeutet, dass der Task nicht für Azure Virtual Desktop-Szenarien oder Windows-Anpassungen geeignet ist, die diese Funktionen erfordern. Um DevOps mit VM Image Builder zu nutzen, schachteln Sie die Vorlage in einen Azure Resource Manager-Task, und verwenden Sie Azure CLI- oder PowerShell-Tasks.

Führen Sie zur Vorbereitung folgende Schritte aus:

  • Installieren Sie den stabilen DevOps-Task aus Visual Studio Marketplace.

  • Erstellen Sie ein Azure DevOps Services-Konto (früher Visual Studio Team Services oder VSTS) und eine Buildpipeline.

  • Registrieren Sie sich, und aktivieren Sie die erforderlichen VM Image Builder-Features in dem von den Pipelines verwendeten Abonnement:

  • Erstellen Sie ein Azure-Standardspeicherkonto in der Ressourcengruppe des Quellimages. Sie können andere Ressourcengruppen oder Speicherkonten verwenden. Das Speicherkonto wird verwendet, um die Buildartefakte von der DevOps-Aufgabe zum Image zu übertragen.

    # Azure PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # Create a storage account and blob in the resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # The Azure CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # Create a storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

Hinzufügen eines Tasks zur Releasepipeline

  1. Wählen Sie Releasepipeline>Bearbeiten aus.

  2. Wählen Sie im Benutzer-Agent das Pluszeichen (+) aus, um Image Builder hinzuzufügen bzw. danach zu suchen.

  3. Wählen Sie Hinzufügen.

Legen Sie in den folgenden Abschnitten die Taskeigenschaften fest.

Azure-Abonnement

Wählen Sie in der Dropdownliste das Abonnement aus, das VM Image Builder ausführen soll. Verwenden Sie das Abonnement, in dem Ihre Quellimages gespeichert sind und in dem die Images verteilt werden sollen. Sie müssen VM Image Builder Zugriff als Mitwirkender auf das Abonnement oder die Ressourcengruppe gewähren.

Ressourcengruppe

Verwenden Sie die Ressourcengruppe, in der das Artefakt der temporären Imagevorlage gespeichert wird. Beim Erstellen eines Vorlagenartefakts wird eine weitere temporäre Image Builder-Ressourcengruppe (IT_<DestinationResourceGroup>_<TemplateName>_guid) erstellt. Die temporäre Ressourcengruppe speichert die Imagemetadaten, wie zu. B. Skripts. Nach Abschluss des Tasks werden das Imagevorlagenartefakt und die temporäre VM Image Builder-Ressourcengruppe gelöscht.

Standort

Der Standort entspricht der Region, in der VM Image Builder ausgeführt wird. Es wird nur eine festgelegte Anzahl von Regionen unterstützt. Die Quellimages müssen an diesem Standort vorhanden sein. Wenn Sie zum Beispiel Azure Compute Gallery (früher: Shared Image Gallery) verwenden, muss in der Region ein Replikat vorhanden sein.

Verwaltete Identität (erforderlich)

VM Image Builder erfordert eine verwaltete Identität, die zum Lesen von benutzerdefinierten Quellimages, zum Herstellen einer Verbindung mit Azure Storage und zum Erstellen von benutzerdefinierten Images verwendet wird. Weitere Informationen finden Sie unter Informationen zu VM Image Builder.

Unterstützung für virtuelle Netzwerke

Sie können die erstellte VM so konfigurieren, dass sie sich in einem bestimmten virtuellen Netzwerk befindet. Wenn Sie den Task konfigurieren, geben Sie im Eingabefeld VNet-Konfiguration (optional) die Ressourcen-ID eines bereits vorhandenen Subnetzes an. Lassen Sie die Ressourcen-ID aus, wenn kein bestimmtes virtuelles Netzwerk verwendet werden muss. Weitere Informationen finden Sie unter Netzwerkoptionen des Azure VM Image Builder-Diensts.

`Source`

Die Quellimages müssen von den unterstützten VM Image Builder-Betriebssystemen stammen. Sie können vorhandene benutzerdefinierte Images in derselben Region auswählen, von der aus VM Image Builder ausgeführt wird:

  • Verwaltetes Image: Übergeben der Ressourcen-ID. Beispiel:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Compute Gallery: Übergeben der Ressourcen-ID der Imageversion. Beispiel:

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    Wenn Sie die neueste Compute Gallery-Version abrufen müssen, verwenden Sie einen Azure PowerShell- oder Azure CLI-Task, um die Version abzurufen und eine DevOps-Variable festzulegen. Verwenden Sie die Variable im DevOps-Task von Azure VM Image Builder. Weitere Informationen finden Sie in den Beispielen unter Abrufen der neuesten Ressourcen-ID der Imageversion.

  • (Marketplace) Basisimage: Verwenden Sie die Dropdownliste beliebter Images, die immer die neueste Version der unterstützten Betriebssysteme verwenden.

    Wenn das Basisimage nicht in der Liste enthalten ist, können Sie das genaue Image mit Publisher:Offer:Sku angeben.

    (Optional) Basisimageversion: Sie können die Version des zu verwendenden Images angeben. Die Standardversion ist latest.

Anpassen

In den folgenden Abschnitten werden verschiedene Möglichkeiten zum Anpassen von Tasks erläutert.

Bereitstellung

Anfänglich werden zwei Anpassungen unterstützt: Shell und PowerShell. Nur Inlinebefehle werden unterstützt. Wenn Sie Skripts herunterladen möchten, können Sie zu diesem Zweck Inlinebefehle übergeben.

Wählen Sie passend zu Ihrem Betriebssystem PowerShell bzw. Shell aus.

Der Windows Update-Task

Nur für Windows führt der Task Windows Update am Ende der Anpassungen aus. Dabei werden auch die erforderlichen Neustarts ausgeführt.

Der Task führt die folgende Windows Update-Konfiguration wird aus:

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

Der Task installiert wichtige und empfohlene Windows-Updates, die keine Vorschauversionen sind.

Ausführen von Neustarts

Der DevOps-Task unterstützt derzeit nicht den Neustart von Windows-Builds. Wenn Sie versuchen, mit PowerShell-Code einen Neustart auszuführen, schlägt der Build fehl. Linux-Builds können Sie jedoch mithilfe von Code neu starten.

Buildpfad

Der Task ist so konzipiert, dass sie Releaseartefakte des DevOps-Builds in das Image einfügen kann. Damit dies funktioniert, müssen Sie eine Buildpipeline einrichten. Bei der Einrichtung der Releasepipeline müssen Sie das Repository der Buildartefakte hinzufügen.

Screenshot: Hinzufügen eines Artefakts in der Releasepipeline.

Wählen Sie die Schaltfläche Buildpfad aus, um den Buildordner auszuwählen, in dem Sie das Image platzieren möchten. Alle Dateien und Verzeichnisse innerhalb des VM Image Builder-Tasks werden kopiert. Wenn das Image erstellt wird, werden die Dateien und Verzeichnisse von VM Image Builder abhängig vom Betriebssystem in unterschiedlichen Pfaden bereitgestellt.

Wichtig

Wenn Sie ein Repositoryartefakt hinzufügen, stellen Sie möglicherweise fest, dass dem Verzeichnisnamen ein Unterstrichzeichen (_) vorangestellt wird. Der Unterstrich kann Probleme mit Inlinebefehlen verursachen. Achten Sie darauf, die entsprechenden Anführungszeichen in den Befehlen zu verwenden.

Das folgende Beispiel veranschaulicht die Funktionsweise:

Screenshot: Verzeichnisstruktur mit einer Hierarchie.

  • Für Windows: Dateien sind auf dem Laufwerk C: vorhanden. Es wird ein Verzeichnis mit dem Namen buildArtifacts erstellt, das das Verzeichnis webapp enthält.

  • Für Linux: Dateien sind im Verzeichnis /tmp vorhanden. Es wird das Verzeichnis webapp erstellt, in dem sich alle Dateien und Verzeichnisse befinden. Da es sich um ein temporäres Verzeichnis handelt, müssen Sie die Dateien aus diesem Verzeichnis verschieben. Andernfalls werden sie gelöscht.

Inline-Anpassungsskript

  • Für Windows: Sie können PowerShell-Inlinebefehle eingeben, die durch Kommas getrennt sind. Wenn Sie in Ihrem Buildverzeichnis ein Skript ausführen möchten, können Sie Folgendes verwenden:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    Sie können auf mehrere Skripts verweisen oder weitere Befehle hinzufügen. Beispiel:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • Für Linux: Die Buildartefakte werden im Verzeichnis /tmp abgelegt. Bei vielen Linux-Betriebssystemen wird der Inhalt des Verzeichnisses /tmp jedoch bei einem Neustart gelöscht. Wenn Sie möchten, dass die Artefakte im Image vorhanden sind, müssen Sie ein weiteres Verzeichnis erstellen, die Artefakte kopieren und in das neue Verzeichnis einfügen. Beispiel:

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    Wenn Sie mit der Verwendung des Verzeichnisses /tmp keine Probleme haben, können Sie das Skript mit dem folgenden Code ausführen:

    # Grant execute permissions to run scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

Was geschieht mit den Buildartefakten nach der Imageerstellung?

Hinweis

VM Image Builder entfernt die Buildartefakte nicht automatisch. Es wird dringend empfohlen, immer Code zu verwenden, um die Buildartefakte zu entfernen.

  • Für Windows: VM Image Builder stellt Dateien im Verzeichnis C:\buildArtifacts bereit. Da das Verzeichnis beibehalten wird, müssen Sie es entfernen, indem Sie ein Skript ausführen. Beispiel:

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force 
    
  • Für Linux: Die Buildartefakte werden im Verzeichnis /tmp abgelegt. Bei vielen Linux-Betriebssystemen wird der Inhalt des Verzeichnisses /tmp jedoch bei einem Neustart gelöscht. Es wird empfohlen, die Inhalte mit Hilfe von Code zu entfernen und sich nicht darauf zu verlassen, dass das Betriebssystem die Inhalte entfernt. Beispiel:

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

Gesamtdauer der Imageerstellung

Die Gesamtdauer kann im DevOps-Pipelinetask noch nicht geändert werden. Diese verwendet den Standardwert von 240 Minuten. Wenn Sie den Parameter buildTimeoutInMinutes erhöhen möchten, können Sie einen Azure CLI-Task in der Releasepipeline verwenden. Konfigurieren Sie den Task, um eine Vorlage zu kopieren und zu übermitteln. Eine Beispiellösung finden Sie unter Verwenden von Umgebungsvariablen und Parametern mit VM Image Builder, oder verwenden Sie Azure PowerShell.

Speicherkonto

Wählen Sie das Speicherkonto aus, das Sie in den Voraussetzungen erstellt haben. Wenn es nicht in der Liste angezeigt wird, besitzt VM Image Builder keine Zugriffsberechtigungen für dieses Konto.

Wenn der Build gestartet wird, erstellt VM Image Builder einen Container namens imagebuilder-vststask, in dem die Buildartefakte aus dem Repository gespeichert werden.

Hinweis

Sie müssen das Speicherkonto oder den Container nach jedem Build manuell löschen.

Verteilen

Die folgenden drei Verteilungstypen werden unterstützt.

Verwaltetes Image

  • Ressourcen-ID:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Standorte

Die Compute Gallery-Instanz muss bereits vorhanden sein.

  • Ressourcen-ID:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • Regionen: Eine Liste der Regionen, durch Kommas getrennt. Beispiel: westus, eastus, centralus.

Virtuelle Festplatte

Sie können keine Werte an diese übergeben. VM Image Builder sendet die virtuelle Festplatten-VHD an die temporäre VM Image Builder-Ressourcengruppe (IT_<DestinationResourceGroup>_<TemplateName>) im Container vhds. Wenn Sie den Releasebuild starten, gibt VM Image Builder Protokolle aus. Wenn der VM Image Builder den Vorgang abgeschlossen hat, wird die VHD-URL ausgegeben.

Optionale Einstellungen

Sie können die Einstellung VM-Größe abweichend von ihrer Standardgröße Standard_D1_v2 festlegen. Möglicherweise möchten Sie so vorgehen, um die Gesamtanpassungszeit zu verringern. Oder Sie möchten Images erstellen, die von bestimmten VM-Größen abhängen, z. B. GPU (Graphics Processing Unit), HPC (High-Performance Computing) usw.

Funktionsweise des Tasks

Bei der Releaseerstellung erstellt der Task einen Container im Speicherkonto mit dem Namen imagebuilder-vststask. Dabei werden Ihre Buildartefakte gezippt (komprimiert) und hochgeladen, und es wird ein SAS-Token (Shared Access Signature) für die ZIP-Datei erstellt.

Der Task verwendet die Eigenschaften, die an den Task übergeben werden, um das VM Image Builder-Vorlagenartefakt zu erstellen. Dieser Task führt Folgendes aus:

  • Sie lädt die Buildartefakt-ZIP-Datei und alle damit verbundenen Skripts herunter. Die Dateien werden in einem Speicherkonto in der temporären VM Image Builder-Ressourcengruppe IT_<DestinationResourceGroup>_<TemplateName> gespeichert.

  • Erstellt eine Vorlage mit dem Präfix t_ und einem 10-stelligen monotonen Integerwert. Die Vorlage wird in der von Ihnen ausgewählten Ressourcengruppe gespeichert und ist für die Dauer des Builds in der Ressourcengruppe vorhanden.

Beispielausgabe:

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

Wenn der Imagebuild gestartet wird, wird in den Releaseprotokollen der Status „wird ausgeführt“ angezeigt:

starting run template...

Nach Abschluss des Imagebuilds ähnelt die Ausgabe dem folgenden Text:

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

Die Imagevorlage und IT_<DestinationResourceGroup>_<TemplateName> werden gelöscht.

Sie können die Azure DevOps Services-Variable $(imageUri) (früher Visual Studio Team Services oder VSTS) nutzen und im nächsten Task verwenden oder einfach den Wert verwenden und eine VM erstellen.

Ausgeben von DevOps-Variablen

Dies sind der Herausgeber, das Angebot, die SKU und die Version des Marketplace-Quellimages:

  • $(pirPublisher)
  • $(pirOffer)
  • $(pirSku)
  • $(pirVersion)

Dies ist die Image-URI, der die Ressourcen-ID des verteilten Images ist:

  • $(imageUri)

Häufig gestellte Fragen

Kann ich eine vorhandene Imagevorlage verwenden, die ich außerhalb von DevOps bereits erstellt habe?

Derzeit leider nicht.

Kann ich den Namen der Imagevorlage festlegen?

Nein. Ein eindeutiger Vorlagenname wird verwendet und anschließend gelöscht.

Für den VM Image Builder-Task ist ein Fehler aufgetreten. Wie kann ich das Problem beheben?

Bei einem Buildfehler wird die Stagingressourcengruppe nicht vom DevOps-Task gelöscht. Sie können auf die Stagingressourcengruppe zugreifen, die das Buildanpassungsprotokoll enthält.

Im DevOps-Protokoll wird für den VM Image Builder-Task ein Fehler angezeigt, und die Meldung enthält den Speicherort der Datei customization.log. Beispiel:

Screenshot: Beispiel für einen Fehler des DevOps-Tasks mit Beschreibung des Fehlers und Angabe des Speicherorts der Datei „customization.log“.

Weitere Informationen finden Sie unter Problembehandlung des VM Image Builder-Diensts.

Nachdem Sie den Fehler untersucht haben, können Sie die Stagingressourcengruppe löschen. Löschen Sie zuerst das VM Image Builder-Vorlagenressourcenartefakt. Dem Artefakt ist t_ als Präfix vorangestellt, und Sie finden es im Buildprotokoll des DevOps-Tasks:

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

Das VM Image Builder-Vorlagenressourcenartefakt befindet sich in der anfangs im Task festgelegten Ressourcengruppe. Wenn Sie das Problem behoben haben, löschen Sie das Artefakt. Wenn Sie es über das Azure-Portal löschen, wählen Sie innerhalb der Ressourcengruppe Ausgeblendete Typen anzeigen aus, um das Artefakt anzuzeigen.

Nächste Schritte

Weitere Informationen finden Sie unter Übersicht über VM Image Builder.