Konfigurowanie środowiska projektowego na potrzeby skryptów wdrażania w szablonach usługi ARM

Dowiedz się, jak utworzyć środowisko programistyczne do tworzenia i testowania skryptów wdrażania szablonu usługi ARM przy użyciu obrazu skryptu wdrożenia. Możesz utworzyć wystąpienie kontenera platformy Azure lub użyć platformy Docker. Obie opcje zostały omówione w tym artykule.

Wymagania wstępne

Kontener programu Azure PowerShell

Jeśli nie masz skryptu wdrażania programu Azure PowerShell, możesz utworzyć plik hello.ps1 przy użyciu następującej zawartości:

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

Kontener interfejsu wiersza polecenia platformy Azure

W przypadku obrazu kontenera interfejsu wiersza polecenia platformy Azure można utworzyć plik hello.sh przy użyciu następującej zawartości:

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

Uwaga

Po uruchomieniu skryptu wdrażania interfejsu wiersza polecenia platformy Azure zmienna środowiskowa o nazwie AZ_SCRIPTS_OUTPUT_PATH przechowuje lokalizację pliku wyjściowego skryptu. Zmienna środowiskowa nie jest dostępna w kontenerze środowiska deweloperskiego. Aby uzyskać więcej informacji na temat pracy z danymi wyjściowymi interfejsu wiersza polecenia platformy Azure, zobacz Praca z danymi wyjściowymi skryptu interfejsu wiersza polecenia.

Korzystanie z wystąpienia kontenera programu Azure PowerShell

Aby utworzyć skrypty na komputerze, musisz utworzyć konto magazynu i zainstalować konto magazynu w wystąpieniu kontenera. Aby można było przekazać skrypt do konta magazynu i uruchomić skrypt w wystąpieniu kontenera.

Uwaga

Konto magazynu utworzone do testowania skryptu nie jest tym samym kontem magazynu, którego usługa skryptu wdrażania używa do wykonania skryptu. Usługa skryptu wdrażania tworzy unikatową nazwę jako udział plików w każdym wykonaniu.

Tworzenie wystąpienia kontenera programu Azure PowerShell

Poniższy szablon usługi Azure Resource Manager (szablon usługi ARM) tworzy wystąpienie kontenera i udział plików, a następnie instaluje udział plików w obrazie kontenera.

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

Wartość domyślna ścieżki instalacji to /mnt/azscripts/azscriptinput. Jest to ścieżka w wystąpieniu kontenera, w którym jest zainstalowany w udziale plików.

Domyślny obraz kontenera określony w szablonie jest mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Zobacz listę wszystkich obsługiwanych wersji programu Azure PowerShell.

Szablon zawiesza wystąpienie kontenera po 1800 sekundach. Zanim wystąpienie kontenera przejdzie w stan zakończenia, a sesja zakończy się przez 30 minut.

Aby wdrożyć szablon:

$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

Przekazywanie skryptu wdrażania

Przekaż skrypt wdrożenia do konta magazynu. Oto przykład skryptu programu PowerShell:

$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

Plik można również przekazać przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

Testowanie skryptu wdrażania

  1. W witrynie Azure Portal otwórz grupę zasobów, w której wdrożono wystąpienie kontenera i konto magazynu.

  2. Otwórz grupę kontenerów. Domyślna nazwa grupy kontenerów to nazwa projektu dołączona z cg. Wystąpienie kontenera jest w stanie Uruchomiony .

  3. W menu zasobów wybierz pozycję Kontenery. Nazwa wystąpienia kontenera to nazwa projektu dołączona z kontenerem.

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

  4. Wybierz pozycję Połączenie, a następnie wybierz pozycję Połączenie. Jeśli nie możesz nawiązać połączenia z wystąpieniem kontenera, uruchom ponownie grupę kontenerów i spróbuj ponownie.

  5. W okienku konsoli uruchom następujące polecenia:

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

    Dane wyjściowe to Hello John Dole.

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

Korzystanie z wystąpienia kontenera interfejsu wiersza polecenia platformy Azure

Aby utworzyć skrypty na komputerze, utwórz konto magazynu i zainstaluj konto magazynu w wystąpieniu kontenera. Następnie możesz przekazać skrypt do konta magazynu i uruchomić skrypt w wystąpieniu kontenera.

Uwaga

Konto magazynu utworzone w celu przetestowania skryptu nie jest tym samym kontem magazynu, którego usługa skryptu wdrażania używa do wykonania skryptu. Usługa skryptu wdrażania tworzy unikatową nazwę jako udział plików w każdym wykonaniu.

Tworzenie wystąpienia kontenera interfejsu wiersza polecenia platformy Azure

Poniższy szablon usługi ARM tworzy wystąpienie kontenera i udział plików, a następnie instaluje udział plików w obrazie kontenera:

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

Wartość domyślna ścieżki instalacji to /mnt/azscripts/azscriptinput. Jest to ścieżka w wystąpieniu kontenera, w którym jest zainstalowany w udziale plików.

Domyślny obraz kontenera określony w szablonie jest mcr.microsoft.com/azure-cli:2.9.1. Zobacz listę obsługiwanych wersji interfejsu wiersza polecenia platformy Azure.

Ważne

Skrypt wdrażania używa dostępnych obrazów interfejsu wiersza polecenia z usługi Microsoft Container Registry (MCR). Certyfikowanie obrazu interfejsu wiersza polecenia dla skryptu wdrożenia trwa około miesiąca. Nie używaj wersji interfejsu wiersza polecenia, które zostały wydane w ciągu 30 dni. Aby znaleźć daty wydania obrazów, zobacz Informacje o wersji interfejsu wiersza polecenia platformy Azure. Jeśli używasz nieobsługiwanej wersji, komunikat o błędzie zawiera listę obsługiwanych wersji.

Szablon zawiesza wystąpienie kontenera po 1800 sekundach. Przed przejściem wystąpienia kontenera do stanu terminalu i zakończenie sesji trwa 30 minut.

Aby wdrożyć szablon:

$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

Przekazywanie skryptu wdrażania

Przekaż skrypt wdrożenia do konta magazynu. Poniżej przedstawiono przykład programu PowerShell:

$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

Plik można również przekazać przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

Testowanie skryptu wdrażania

  1. W witrynie Azure Portal otwórz grupę zasobów, w której wdrożono wystąpienie kontenera i konto magazynu.

  2. Otwórz grupę kontenerów. Domyślna nazwa grupy kontenerów to nazwa projektu dołączona z cg. Wystąpienie kontenera jest wyświetlane w stanie Uruchomiony .

  3. W menu zasobów wybierz pozycję Kontenery. Nazwa wystąpienia kontenera to nazwa projektu dołączona z kontenerem.

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

  4. Wybierz pozycję Połączenie, a następnie wybierz pozycję Połączenie. Jeśli nie możesz nawiązać połączenia z wystąpieniem kontenera, uruchom ponownie grupę kontenerów i spróbuj ponownie.

  5. W okienku konsoli uruchom następujące polecenia:

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

    Dane wyjściowe to Hello John Dole.

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

Korzystanie z platformy Docker

Możesz użyć wstępnie skonfigurowanego obrazu kontenera platformy Docker jako środowiska deweloperskiego skryptu wdrażania. Aby zainstalować platformę Docker, zobacz Pobieranie platformy Docker. Należy również skonfigurować udostępnianie plików, aby zainstalować katalog zawierający skrypty wdrażania w kontenerze platformy Docker.

  1. Pobierz obraz kontenera skryptu wdrożenia na komputer lokalny:

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

    W przykładzie użyto wersji programu PowerShell 4.3.0.

    Aby ściągnąć obraz interfejsu wiersza polecenia z mcR:

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

    W tym przykładzie użyto interfejsu wiersza polecenia w wersji 2.0.80. Skrypt wdrażania używa domyślnych obrazów kontenerów interfejsu wiersza polecenia znalezionych tutaj.

  2. Uruchom obraz platformy Docker lokalnie.

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

    Zastąp <literę> sterownika hosta i <nazwę> katalogu hosta istniejącym folderem na dysku udostępnionym. Mapuje folder na folder /data w kontenerze. Aby na przykład mapować D:\docker:

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

    — oznacza to utrzymanie obrazu kontenera przy życiu.

    Przykład interfejsu wiersza polecenia:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. Poniższy zrzut ekranu przedstawia sposób uruchamiania skryptu programu PowerShell, biorąc pod uwagę, że masz plik helloworld.ps1 na dysku udostępnionym.

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

Po pomyślnym przetestowaniu skryptu możesz użyć go jako skryptu wdrażania w szablonach.

Następne kroki

W tym artykule przedstawiono sposób używania skryptów wdrażania. Aby zapoznać się z samouczkiem dotyczącym skryptu wdrażania: