Konfigurace vývojového prostředí pro skripty nasazení v šablonách ARM

Zjistěte, jak vytvořit vývojové prostředí pro vývoj a testování skriptů nasazení šablon ARM pomocí image skriptu nasazení. Můžete buď vytvořit instanci kontejneru Azure, nebo použít Docker. Obě možnosti jsou popsané v tomto článku.

Předpoklady

Kontejner Azure PowerShellu

Pokud nemáte skript nasazení Azure PowerShellu, můžete vytvořit soubor hello.ps1 pomocí následujícího obsahu:

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

Kontejner Azure CLI

Pro image kontejneru Azure CLI můžete vytvořit soubor hello.sh pomocí následujícího obsahu:

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

Poznámka:

Když spustíte skript nasazení Azure CLI, proměnná prostředí s názvem AZ_SCRIPTS_OUTPUT_PATH ukládá umístění výstupního souboru skriptu. Proměnná prostředí není v kontejneru vývojového prostředí dostupná. Další informace o práci s výstupy Azure CLI najdete v tématu Práce s výstupy ze skriptu rozhraní příkazového řádku.

Použití instance kontejneru Azure PowerShellu

Pokud chcete vytvořit skripty na počítači, musíte vytvořit účet úložiště a připojit ho k instanci kontejneru. Abyste mohli nahrát skript do účtu úložiště a spustit skript v instanci kontejneru.

Poznámka:

Účet úložiště, který vytvoříte k otestování skriptu, není stejný účet úložiště, který služba skriptů nasazení používá ke spuštění skriptu. Služba skriptů nasazení vytvoří jedinečný název jako sdílenou složku při každém spuštění.

Vytvoření instance kontejneru Azure PowerShellu

Následující šablona Azure Resource Manageru (šablona ARM) vytvoří instanci kontejneru a sdílenou složku a pak připojí sdílenou složku k imagi kontejneru.

{
  "$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'))]"
      ]
    }
  ]
}

Výchozí hodnota pro cestu připojení je /mnt/azscripts/azscriptinput. Toto je cesta v instanci kontejneru, kde je připojená ke sdílené složce.

Výchozí image kontejneru zadaná v šabloně je mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Podívejte se na seznam všech podporovaných verzí Azure PowerShellu.

Šablona pozastaví instanci kontejneru po 1 800 sekundách. Máte 30 minut, než instance kontejneru přejde do ukončeného stavu a relace skončí.

Nasazení šablony:

$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

Nahrání skriptu nasazení

Nahrajte skript nasazení do účtu úložiště. Tady je příklad skriptu PowerShellu:

$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

Soubor můžete nahrát také pomocí webu Azure Portal nebo Azure CLI.

Testování skriptu nasazení

  1. Na webu Azure Portal otevřete skupinu prostředků, do které jste nasadili instanci kontejneru a účet úložiště.

  2. Otevřete skupinu kontejnerů. Výchozí název skupiny kontejnerů je název projektu připojený cg. Instance kontejneru je ve stavu Spuštěno.

  3. V nabídce prostředků vyberte Kontejnery. Název instance kontejneru je název projektu připojený ke kontejneru.

    Screenshot of the deployment script connect container instance option in the Azure portal.

  4. Vyberte Připojení a pak vyberte Připojení. Pokud se nemůžete připojit k instanci kontejneru, restartujte skupinu kontejnerů a zkuste to znovu.

  5. V podokně konzoly spusťte následující příkazy:

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

    Výstupem je Hello John Dole.

    Screenshot of the deployment script connect container instance test output displayed in the console.

Použití instance kontejneru Azure CLI

Pokud chcete vytvořit skripty v počítači, vytvořte účet úložiště a připojte ho k instanci kontejneru. Pak můžete skript nahrát do účtu úložiště a spustit skript v instanci kontejneru.

Poznámka:

Účet úložiště, který vytvoříte k otestování skriptu, není stejný účet úložiště, který služba skriptů nasazení používá ke spuštění skriptu. Služba skriptů nasazení vytvoří jedinečný název jako sdílenou složku při každém spuštění.

Vytvoření instance kontejneru Azure CLI

Následující šablona ARM vytvoří instanci kontejneru a sdílenou složku a pak připojí sdílenou složku k imagi kontejneru:

{
  "$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"
      ]
    }
  ]
}

Výchozí hodnota pro cestu připojení je /mnt/azscripts/azscriptinput. Toto je cesta v instanci kontejneru, kde je připojená ke sdílené složce.

Výchozí image kontejneru zadaná v šabloně je mcr.microsoft.com/azure-cli:2.9.1. Podívejte se na seznam podporovaných verzí Azure CLI.

Důležité

Skript nasazení používá dostupné image rozhraní příkazového řádku ze služby Microsoft Container Registry (MCR). Certifikace image rozhraní příkazového řádku pro skript nasazení trvá přibližně jeden měsíc. Nepoužívejte verze rozhraní příkazového řádku vydané do 30 dnů. Pokud chcete zjistit data vydání imagí, přečtěte si poznámky k verzi Azure CLI. Pokud používáte nepodporovanou verzi, zobrazí se v chybové zprávě seznam podporovaných verzí.

Šablona pozastaví instanci kontejneru po 1 800 sekundách. Máte 30 minut, než instance kontejneru přejde do stavu terminálu a relace skončí.

Nasazení šablony:

$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

Nahrání skriptu nasazení

Nahrajte skript nasazení do účtu úložiště. Následuje příklad PowerShellu:

$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

Soubor můžete nahrát také pomocí webu Azure Portal nebo Azure CLI.

Testování skriptu nasazení

  1. Na webu Azure Portal otevřete skupinu prostředků, do které jste nasadili instanci kontejneru a účet úložiště.

  2. Otevřete skupinu kontejnerů. Výchozí název skupiny kontejnerů je název projektu připojený cg. Instance kontejneru se zobrazí ve stavu Spuštěno.

  3. V nabídce prostředků vyberte Kontejnery. Název instance kontejneru je název projektu připojený ke kontejneru.

    Screenshot of the deployment script connect container instance option in the Azure portal.

  4. Vyberte Připojení a pak vyberte Připojení. Pokud se nemůžete připojit k instanci kontejneru, restartujte skupinu kontejnerů a zkuste to znovu.

  5. V podokně konzoly spusťte následující příkazy:

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

    Výstupem je Hello John Dole.

    Screenshot of the deployment script container instance test output displayed in the console.

Použití Dockeru

Jako vývojové prostředí skriptu nasazení můžete použít předem nakonfigurovanou image kontejneru Dockeru. Pokud chcete nainstalovat Docker, přečtěte si téma Get Docker. Musíte také nakonfigurovat sdílení souborů pro připojení adresáře, který obsahuje skripty nasazení do kontejneru Dockeru.

  1. Stáhněte image kontejneru skriptu nasazení do místního počítače:

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

    Příklad používá verzi PowerShellu 4.3.0.

    Načtení image rozhraní příkazového řádku z MCR:

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

    Tento příklad používá verzi CLI 2.0.80. Skript nasazení používá výchozí image kontejnerů rozhraní příkazového řádku, které najdete tady.

  2. Spusťte image Dockeru místně.

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

    Nahraďte <písmeno> ovladače hostitele a< název> adresáře hostitele existující složkou na sdílené jednotce. Namapuje složku do složky /data v kontejneru. Pokud chcete například namapovat D:\docker:

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

    -to znamená zachovat image kontejneru naživu.

    Příklad rozhraní příkazového řádku:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. Následující snímek obrazovky ukazuje, jak spustit skript PowerShellu vzhledem k tomu, že máte na sdílené jednotce soubor helloworld.ps1 .

    Screenshot of the Resource Manager template deployment script using Docker command.

Po úspěšném otestování skriptu ho můžete použít jako skript nasazení ve svých šablonách.

Další kroky

V tomto článku jste zjistili, jak používat skripty nasazení. Kurz skriptu nasazení: