Поделиться через


Настройка среды разработки для сценариев развертывания в файлах Bicep

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

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

Контейнер Azure PowerShell

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

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

Connect-AzAccount -UseDeviceAuthentication
Set-AzContext -subscription $subscription

$kv = Get-AzKeyVault
#Write-Output $kv

$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['greeting'] = $output
$DeploymentScriptOutputs['kv'] = $kv.resourceId
Write-Output $DeploymentScriptOutputs

В скрипте развертывания Azure PowerShell переменная $DeploymentScriptOutputs используется для хранения выходных значений. Дополнительные сведения о работе с выходными данными Azure PowerShell см. в статье "Работа с выходными данными".

Контейнер 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 PowerShell

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

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/sh'
            '-c'
            'pwsh -c \'Start-Sleep -Seconds 1800\''
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

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

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

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

Используйте следующий скрипт для развертывания Bicep-файла:

$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 Bicep 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.

    Снимок экрана: параметр

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

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

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

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

    Снимок экрана: выходные данные тестового теста экземпляра контейнера для сценария развертывания, отображаемые в консоли.

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

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

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

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

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azure-cli:2.9.1'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileshare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/bash'
            '-c'
            'echo hello; sleep 1800'
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

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

Образ контейнера по умолчанию, указанный в файле Bicep, mcr.microsoft.com/azure-cli:2.9.1. См. список поддерживаемые версии Azure CLI. Скрипт развертывания использует доступные образы CLI из Реестра контейнеров Майкрософт (MCR). Сертификация образа CLI для скрипта развертывания занимает около одного месяца. Не используйте версии CLI, выпущенные менее 30 дней назад. Чтобы найти даты выпуска образов, ознакомьтесь с заметками о выпуске Azure CLI. Если вы используете неподдерживаемую версию, в сообщении об ошибке выводится список поддерживаемых версий.

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

Чтобы развернуть Bicep-файл, выполните следующие действия.

$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 Bicep 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.

    Снимок экрана: параметр

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

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

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

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

    Снимок экрана: выходные данные теста экземпляра контейнера скрипта развертывания, отображаемые в консоли.

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

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

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

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
    

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

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

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

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

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

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

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

    docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
    

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

    Пример для CLI.

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

    Снимок экрана: скрипт развертывания шаблона Resource Manager с помощью команды Docker.

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

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

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