Настройка среды разработки для скриптов развертывания в шаблонах ARM

Узнайте, как создать среду разработки для создания и тестирования шаблона ARM со скриптами развертывания на основе образа скрипта развертывания. Для этого вы можете создать экземпляр контейнера Azure или применить Docker. В этой статье рассматриваются оба варианта.

Необходимые компоненты

Контейнер Azure PowerShell

Если у вас нет скрипта развертывания Azure PowerShell, вы можете создать файл hello.ps1 со следующим содержимым:

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

Контейнер Azure CLI

Для образа контейнера Azure CLI можно создать файл hello.ps1 со следующим содержимым:

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

Примечание.

Когда вы выполняете скрипт развертывания Azure CLI, в переменной среды с именем AZ_SCRIPTS_OUTPUT_PATH хранится расположения выходного файла для этого скрипта. Эта переменная среды недоступна в контейнере среды разработки. Дополнительные сведения о работе с выходными данными Azure CLI см. в разделе Использование выходных данных скрипта CLI.

Использование экземпляра контейнера Azure PowerShell

Чтобы создать скрипт на своем компьютере, следует сначала создать учетную запись хранения и подключить эту учетную запись к экземпляру контейнера. Это позволит вам отправить скрипт в учетную запись хранения и выполнить скрипт в экземпляре контейнера.

Примечание.

Учетная запись хранения, которую вы создаете для тестирования скрипта, не совпадает с учетной записью хранения, которую служба скрипта развертывания использует для выполнения скрипта. Служба скрипта развертывания создает общую папку с уникальным именем при каждом очередном выполнении.

Создание экземпляра контейнера Azure PowerShell

Следующий шаблон Azure Resource Manager (шаблон ARM) создает экземпляр контейнера и общую папку, а затем подключает эту общую папку к образу контейнера.

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

По умолчанию подключение выполняется к пути /mnt/azscripts/azscriptinput. Это путь внутри экземпляра контейнера, куда подключается общая папка.

Образ контейнера по умолчанию, указанный в шаблоне, mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Полный список поддерживаемых версий Azure PowerShell см. здесь.

Этот шаблон приостанавливает работу экземпляра контейнера после 1800 секунд. У вас есть 30 минут на работу с экземпляром контейнера, после которых он завершает выполнение и сеанс подключения.

Чтобы развернуть шаблон, выполните следующую команду:

$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

Отправка скрипта развертывания

Отправьте скрипт развертывания в учетную запись хранения. Так это можно сделать с помощью скрипта 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

Вы также можете отправить этот файл через портал Azure или Azure CLI.

Тестирование скрипта развертывания

  1. На портале Azure откройте группу ресурсов, в которой вы развернули экземпляр контейнера и учетную запись хранения.

  2. Откройте группу контейнеров. По умолчанию для имени группы контейнеров используется имя проекта с суффиксом cg. Этот экземпляр контейнера находится в состоянии Выполняется.

  3. В меню ресурсов выберите Контейнеры. Для имени экземпляра контейнера берется имя проекта с суффиксом container.

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

  4. Щелкните Подключить и выберите действие Подключить. Если подключение к экземпляру контейнера установить не удается, перезапустите группу контейнеров и попробуйте еще раз.

  5. На панели консоли выполните следующие команды:

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

    Они выводят ответ Hello John Dole.

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

Использование экземпляра контейнера Azure CLI

Чтобы создать скрипт на своем компьютере, сначала создайте учетную запись хранения и подключите эту учетную запись к экземпляру контейнера. Это позволит вам отправить скрипт в учетную запись хранения и выполнить скрипт в экземпляре контейнера.

Примечание.

Учетная запись хранения, которую вы создаете для тестирования скрипта, не совпадает с учетной записью хранения, которую служба скрипта развертывания использует для выполнения скрипта. Служба скрипта развертывания создает общую папку с уникальным именем при каждом очередном выполнении.

Создание экземпляра контейнера Azure CLI

Следующий шаблон ARM создает экземпляр контейнера и общую папку, а затем подключает эту общую папку к образу контейнера:

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

По умолчанию подключение выполняется к пути /mnt/azscripts/azscriptinput. Это путь внутри экземпляра контейнера, куда подключается общая папка.

В шаблоне указан образ контейнера по умолчанию mcr.microsoft.com/azure-cli:2.9.1. См. список поддерживаемые версии Azure CLI.

Важно!

Скрипт развертывания использует доступные образы CLI из Реестра контейнеров Майкрософт (MCR). Сертификация образа CLI для скрипта развертывания занимает около одного месяца. Не используйте версии CLI, выпущенные менее 30 дней назад. Чтобы найти даты выпуска образов, ознакомьтесь с заметками о выпуске Azure CLI. Если вы используете неподдерживаемую версию, в сообщении об ошибке выводится список поддерживаемых версий.

Этот шаблон приостанавливает работу экземпляра контейнера после 1800 секунд. У вас есть 30 минут на работу с экземпляром контейнера, после которых он завершает выполнение и сеанс подключения.

Чтобы развернуть шаблон, выполните следующую команду:

$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

Отправка скрипта развертывания

Отправьте скрипт развертывания в учетную запись хранения. Вот пример этой операции для 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

Вы также можете отправить этот файл через портал Azure или Azure CLI.

Тестирование скрипта развертывания

  1. На портале Azure откройте группу ресурсов, в которой вы развернули экземпляр контейнера и учетную запись хранения.

  2. Откройте группу контейнеров. По умолчанию для имени группы контейнеров используется имя проекта с суффиксом cg. Этот экземпляр контейнера отображается в состоянии Выполняется.

  3. В меню ресурсов выберите Контейнеры. Для имени экземпляра контейнера берется имя проекта с суффиксом container.

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

  4. Щелкните Подключить и выберите действие Подключить. Если подключение к экземпляру контейнера установить не удается, перезапустите группу контейнеров и попробуйте еще раз.

  5. На панели консоли выполните следующие команды:

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

    Они выводят ответ Hello John Dole.

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

Использование Docker

Вы можете использовать предварительно настроенный образ контейнера Docker в качестве среды разработки для скрипта развертывания. Чтобы установить Docker, воспользуйтесь этой статьей. Также вам нужно настроить общий доступ к файлам, чтобы подключить каталог со скриптами развертывания к контейнеру Docker.

  1. Извлеките образ контейнера сценария развертывания на локальный компьютер.

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

    В этом примере используется версия PowerShell 4.3.0.

    Чтобы извлечь образ CLI из реестра MCR, выполните:

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

    В этом примере используется версия CLI 2.0.80. Сценарий развертывания использует образы контейнеров CLI по умолчанию, доступные здесь.

  2. Запустите образ Docker в локальной среде.

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

    Замените <host driver letter> и <host directory name>, указав существующую папку на общем диске. Она будет сопоставлена с папкой /data в контейнере. Например, так можно указать для сопоставления папку D:\docker:

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

    -it означает поддержание активности образа контейнера.

    Пример для CLI.

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. На следующем снимке экрана показано, как запустить скрипт PowerShell, если файл helloworld.ps1 находится на общем диске.

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

После успешного тестирования скрипта его можно использовать в качестве скрипта развертывания в ваших шаблонах.

Следующие шаги

В этой статье вы узнали, как использовать сценарии развертывания. Теперь вы можете изучить учебник по сценариям развертывания: