Freigeben über


Konfigurieren der Entwicklungsumgebung für Bereitstellungsskripts in ARM-Vorlagen

Hier erfahren Sie, wie Sie eine Bereitstellungsumgebung für das Erstellen und Testen von Bereitstellungsskripts der ARM-Vorlage anhand eines Bereitstellungsskriptimage erstellen. Sie können entweder eine Azure-Containerinstanz erstellen oder Docker verwenden. Beide Optionen werden in diesem Artikel beschrieben.

Voraussetzungen

Azure PowerShell-Container

Wenn Sie über kein Azure PowerShell-Bereitstellungsskript verfügen, können Sie eine Datei hello.ps1 mit dem folgenden Inhalt erstellen:

param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Azure CLI-Container

Wenn Sie ein Azure CLI-Containerimage verwenden möchten, können Sie eine Datei hello.sh mit dem folgenden Inhalt erstellen:

FIRSTNAME=$1
LASTNAME=$2
OUTPUT="{\"name\":{\"displayName\":\"$FIRSTNAME $LASTNAME\",\"firstName\":\"$FIRSTNAME\",\"lastName\":\"$LASTNAME\"}}"
echo -n "Hello "
echo $OUTPUT | jq -r '.name.displayName'

Hinweis

Wenn Sie ein Azure CLI-Bereitstellungsskript ausführen, wird der Speicherort der Skriptausgabedatei in einer Umgebungsvariablen namens AZ_SCRIPTS_OUTPUT_PATH gespeichert. Die Umgebungsvariable ist im Container der Entwicklungsumgebung nicht verfügbar. Weitere Informationen zum Arbeiten mit Azure CLI-Ausgaben finden Sie unter Arbeiten mit Ausgaben von CLI-Skripts.

Verwenden einer Azure PowerShell-Containerinstanz

Sie müssen ein Speicherkonto erstellen und dieses in die Containerinstanz einbinden, um die Skripts auf Ihrem Computer zu erstellen. Auf diese Weise können Sie Ihr Skript in das Speicherkonto hochladen und in der Containerinstanz ausführen.

Hinweis

Das Speicherkonto, das Sie zum Testen Ihres Skripts erstellen, ist nicht das gleiche Speicherkonto, das der Bereitstellungsskriptdienst zum Ausführen des Skripts verwendet. Der Bereitstellungsskriptdienst erstellt bei jeder Ausführung einen eindeutigen Namen als Dateifreigabe.

Erstellen einer Azure PowerShell-Containerinstanz

Die folgende Azure Resource Manager-Vorlage (ARM-Vorlage) erstellt eine Containerinstanz sowie eine Dateifreigabe und bindet die Freigabe in das Containerimage ein.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/sh",
                "-c",
                "pwsh -c 'Start-Sleep -Seconds 1800'"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    }
  ]
}

Der Standardwert für den Einbindungspfad lautet /mnt/azscripts/azscriptinput. Dies ist der Pfad in der Containerinstanz, unter dem sie in die Dateifreigabe eingebunden wird.

Das in der Vorlage angegebene Standardcontainerimage ist mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Eine Liste aller unterstützter Azure PowerShell-Versionen finden Sie hier.

Die Vorlage hält die Containerinstanz nach 1.800 Sekunden an. Sie haben 30 Minuten Zeit, bis die Containerinstanz in einen Beendigungsstatus wechselt und die Sitzung beendet wird.

So stellen Sie die Vorlage bereit:

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

Hochladen des Bereitstellungsskripts

Laden Sie Ihr Bereitstellungsskript in das Speicherkonto hoch. Nachfolgend sehen Sie ein Beispiel für ein PowerShell-Skript:

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

Sie können die Datei auch mithilfe des Azure-Portals oder über die Azure CLI hochladen.

Testen des Bereitstellungsskripts

  1. Öffnen Sie im Azure-Portal die Ressourcengruppe, in der Sie die Containerinstanz und das Speicherkonto bereitgestellt haben.

  2. Öffnen Sie die Containergruppe. Der Name der Standardcontainergruppe entspricht dem Projektnamen mit dem Zusatz cg. Die Containerinstanz weist den Status Wird ausgeführt auf.

  3. Wählen Sie im Ressourcenmenü die Option Container aus. Der Name der Containerinstanz entspricht dem Projektnamen mit dem Zusatz container.

    Screenshot: Option für Verbindungscontainerinstanz des Bereitstellungsskripts im Azure-Portal

  4. Klicken Sie auf Verbinden und dann auf Verbinden. Wenn Sie keine Verbindung mit der Containerinstanz herstellen können, starten Sie die Containergruppe neu, und versuchen Sie es noch mal.

  5. Führen Sie im Konsolenbereich die folgenden Befehle aus:

    cd /mnt/azscripts/azscriptinput
    ls
    pwsh ./hello.ps1 "John Dole"
    

    Die Ausgabe ist Hello John Dole.

    Screenshot: Anzeige der Testausgabe der Verbindungscontainerinstanz des Bereitstellungsskripts auf der Konsole

Verwenden einer Azure CLI-Containerinstanz

Sie müssen ein Speicherkonto erstellen und in die Containerinstanz einbinden, um Skripts auf Ihrem Computer zu erstellen. Anschließend können Sie Ihr Skript in das Speicherkonto hochladen und in der Containerinstanz ausführen.

Hinweis

Das Speicherkonto, das Sie zum Testen Ihres Skripts erstellen, ist nicht das gleiche Speicherkonto, das der Bereitstellungsskriptdienst zum Ausführen des Skripts verwendet. Der Bereitstellungsskriptdienst erstellt bei jeder Ausführung einen eindeutigen Namen als Dateifreigabe.

Verwenden einer Azure CLI-Containerinstanz

Mit der folgenden ARM-Vorlage werden eine Containerinstanz und eine Dateifreigabe erstellt. Letztere wird dann in das Containerimage eingebunden:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azure-cli:2.9.1",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/bash",
                "-c",
                "echo hello; sleep 1800"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "storageAccount"
      ]
    }
  ]
}

Der Standardwert für den Einbindungspfad lautet /mnt/azscripts/azscriptinput. Dies ist der Pfad in der Containerinstanz, unter dem sie in die Dateifreigabe eingebunden wird.

Das in der Vorlage angegebene Standardcontainerimage ist mcr.microsoft.com/azure-cli:2.9.1. Eine Liste mit den unterstützten Azure CLI-Versionen finden Sie hier.

Wichtig

Das Bereitstellungsskript verwendet die verfügbaren CLI-Images von Microsoft Container Registry (MCR). Das Zertifizieren eines CLI-Images für ein Bereitstellungsskript dauert ungefähr einen Monat. Verwenden Sie nicht die CLI-Versionen, die innerhalb von 30 Tagen veröffentlicht wurden. Die Veröffentlichungsdaten für die Images finden Sie unter Versionshinweise für die Azure CLI. Wenn Sie eine nicht unterstützte Version verwenden, werden in der Fehlermeldung die unterstützten Versionen aufgelistet.

Die Vorlage hält die Containerinstanz nach 1.800 Sekunden an. Sie haben 30 Minuten Zeit, bis die Containerinstanz in einen Beendigungsstatus wechselt und die Sitzung beendet wird.

So stellen Sie die Vorlage bereit:

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

Hochladen des Bereitstellungsskripts

Laden Sie Ihr Bereitstellungsskript in das Speicherkonto hoch. Dies ist ein PowerShell-Beispiel:

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

Sie können die Datei auch mithilfe des Azure-Portals oder über die Azure CLI hochladen.

Testen des Bereitstellungsskripts

  1. Öffnen Sie im Azure-Portal die Ressourcengruppe, in der Sie die Containerinstanz und das Speicherkonto bereitgestellt haben.

  2. Öffnen Sie die Containergruppe. Der Name der Standardcontainergruppe entspricht dem Projektnamen mit dem Zusatz cg. Die Containerinstanz wird mit dem Status Wird ausgeführt angezeigt.

  3. Wählen Sie im Ressourcenmenü die Option Container aus. Der Name der Containerinstanz entspricht dem Projektnamen mit dem Zusatz container.

    Screenshot: Option für Verbindungscontainerinstanz des Bereitstellungsskripts im Azure-Portal

  4. Klicken Sie auf Verbinden und dann auf Verbinden. Wenn Sie keine Verbindung mit der Containerinstanz herstellen können, starten Sie die Containergruppe neu, und versuchen Sie es noch mal.

  5. Führen Sie im Konsolenbereich die folgenden Befehle aus:

    cd /mnt/azscripts/azscriptinput
    ls
    ./hello.sh John Dole
    

    Die Ausgabe ist Hello John Dole.

    Screenshot: Anzeige der Testausgabe der Containerinstanz des Bereitstellungsskripts auf der Konsole

Verwenden von Docker

Sie können ein vorkonfiguriertes Docker-Containerimage als Entwicklungsumgebung für Ihr Bereitstellungsskript verwenden. Informationen zum Installieren von Docker finden Sie hier. Darüber hinaus muss die Dateifreigabe so konfiguriert werden, dass das Verzeichnis mit den Bereitstellungsskripts in den Docker-Container eingebunden wird.

  1. Pullen Sie das Containerimage für das Bereitstellungsskript auf den lokalen Computer:

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    In diesem Beispiel wird die PowerShell-Version 4.3.0 verwendet.

    So rufen Sie ein CLI-Image per Pull aus MCR ab

    docker pull mcr.microsoft.com/azure-cli:2.0.80
    

    In diesem Beispiel wird Version 2.0.80 der CLI verwendet. Das Bereitstellungsskript verwendet die standardmäßigen CLI-Containerimages, die Sie hier finden.

  2. Führen Sie das Docker-Image lokal aus.

    docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    Ersetzen Sie <host drive letter> und <host directory name> durch einen vorhandenen Ordner auf dem freigegebenen Laufwerk. Der Ordner wird dem Ordner /data im Container zugeordnet. Bei der Zuordnung von D:\docker gilt beispielsweise:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    -it bedeutet, dass das Containerimage aktiv bleibt.

    Ein CLI-Beispiel:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. Der folgende Screenshot zeigt die Ausführung eines PowerShell-Skripts, wenn sich auf dem freigegebenen Laufwerk eine Datei namens helloworld.ps1 befindet.

    Screenshot: Resource Manager-Vorlage: Bereitstellungsskript mit Docker-Befehl

Nachdem das Skript erfolgreich getestet wurde, können Sie es als Bereitstellungsskript in Ihren Vorlagen verwenden.

Nächste Schritte

In diesem Artikel haben Sie erfahren, wie Sie Bereitstellungsskripts verwenden. Ein Tutorial zu Bereitstellungsskripts finden Sie unter: