Использование сценариев развертывания в шаблонах ARM

Узнайте, как использовать сценарии развертывания в шаблонах Azure Resource Manager (ARM). deploymentScripts С помощью ресурса пользователи могут выполнять скрипты в развертываниях ARM и просматривать результаты выполнения.

Совет

Мы рекомендуем использовать Bicep, так как он предоставляет те же возможности, что и шаблоны ARM, и имеет более простой синтаксис. Дополнительные сведения см. в разделе Скрипт развертывания.

Эти сценарии можно использовать для выполнения настраиваемых действий, в том числе с их помощью можно:

  • Добавить пользователей в каталог.
  • Выполнить операции плоскости данных, например копирование больших двоичных объектов или базы данных начальных значений.
  • Найти и проверить ключ лицензии.
  • Создать самозаверяющий сертификат.
  • Создайте объект в идентификаторе Microsoft Entra.
  • Найти блоки IP-адресов из пользовательской системы.

Преимущества сценария развертывания:

  • Простое программирование, использование и отладка. Сценарии развертывания можно разрабатывать в средах разработки на свой выбор. Эти сценарии можно внедрять в шаблоны или во внешние файлы сценариев.
  • Можно указать язык и платформу сценария. В настоящее время поддерживаются сценарии развертывания Azure PowerShell и Azure CLI в среде Linux.
  • В сценарий можно передавать аргументы командной строки.
  • Можно указать выходные данные сценария и передать их в развертывание.

Ресурс сценария развертывания доступен только в регионах, где доступен экземпляр контейнера Azure. Ознакомьтесь с разделом Доступность ресурсов службы "Экземпляры контейнеров Azure" в регионах Azure. В настоящее время сценарий развертывания использует только общедоступные сети.

Внимание

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

Примечание.

Логика повторных попыток входа на платформу Azure теперь встроена в скрипт оболочки. Если предоставить разрешение в том же шаблоне, что и скрипты развертывания, служба скриптов развертывания повторяет попытку входа в течение 10 минут с 10-секундным интервалом, пока назначение ролей управляемых удостоверений не будет реплицировано.

Обучающие материалы

Если вы хотите узнать о сценариях развертывания с помощью пошагового руководства, ознакомьтесь с инструкциями по расширению шаблонов ARM с помощью скриптов развертывания.

Настройка минимальных разрешений

Для API скрипта развертывания версии 2020-10-01 или более поздней версии доступны два субъекта, участвующих в выполнении скрипта развертывания.

  • Субъект развертывания (субъект, используемый для развертывания шаблона): этот субъект используется при создании базовых ресурсов, необходимых для выполнения скрипта развертывания, — учетной записи хранения и экземпляра контейнера Azure. Чтобы настроить разрешения с минимальными привилегиями, назначьте субъекту развертывания настраиваемую роль со следующими свойствами:

    {
      "roleName": "deployment-script-minimum-privilege-for-deployment-principal",
      "description": "Configure least privilege for the deployment principal in deployment script",
      "type": "customRole",
      "IsCustom": true,
      "permissions": [
        {
          "actions": [
            "Microsoft.Storage/storageAccounts/*",
            "Microsoft.ContainerInstance/containerGroups/*",
            "Microsoft.Resources/deployments/*",
            "Microsoft.Resources/deploymentScripts/*"
          ],
        }
      ],
      "assignableScopes": [
        "[subscription().id]"
      ]
    }
    

    Если служба хранилища Azure и поставщики ресурсов экземпляров контейнеров Azure не зарегистрированы, необходимо также добавить Microsoft.Storage/register/action и Microsoft.ContainerInstance/register/action.

  • Субъект скрипта развертывания: этот субъект необходим, только если скрипту развертывания требуется проходить проверку подлинности в Azure и вызывать Azure CLI или PowerShell. Существует два способа указать субъект скрипта развертывания.

    • Укажите управляемое удостоверение, назначаемое пользователем, в свойстве identity (см. примеры шаблонов). Если оно указано, служба скриптов вызывает Connect-AzAccount -Identity, прежде чем вызывать скрипт развертывания. Управляемое удостоверение должно иметь доступ для завершения операции в скрипте. Сейчас для свойства identity поддерживаются только управляемые удостоверения, назначаемые пользователем. Чтобы войти с помощью другого удостоверения, используйте второй способ из списка.
    • Передайте учетные данные субъекта-службы в качестве переменных безопасной среды, а затем вызовите Connect-AzAccount или az login в скрипте развертывания.

    В случае использования управляемого удостоверения участнику развертывания требуется роль Оператор управляемого удостоверения (встроенная роль), назначенная ресурсу управляемого удостоверения.

Шаблоны с примерами

Ниже приведен пример файла JSON. Дополнительные сведения см. в последней схеме шаблона.

{
  "type": "Microsoft.Resources/deploymentScripts",
  "apiVersion": "2020-10-01",
  "name": "runPowerShellInline",
  "location": "[resourceGroup().location]",
  "tags": {
    "tagName1": "tagValue1",
    "tagName2": "tagValue2"
  },
  "kind": "AzurePowerShell", // or "AzureCLI"
  "identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
      "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID": {}
    }
  },
  "properties": {
    "forceUpdateTag": "1",
    "containerSettings": {
      "containerGroupName": "mycustomaci"
    },
    "storageAccountSettings": {
      "storageAccountName": "myStorageAccount",
      "storageAccountKey": "myKey"
    },
    "azPowerShellVersion": "9.7",  // or "azCliVersion": "2.47.0",
    "arguments": "-name \\\"John Dole\\\"",
    "environmentVariables": [
      {
        "name": "UserName",
        "value": "jdole"
      },
      {
        "name": "Password",
        "secureValue": "jDolePassword"
      }
    ],
    "scriptContent": "
      param([string] $name)
      $output = 'Hello {0}. The username is {1}, the password is {2}.' -f $name,${Env:UserName},${Env:Password}
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    ", // or "primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",
    "supportingScriptUris":[],
    "timeout": "PT30M",
    "cleanupPreference": "OnSuccess",
    "retentionInterval": "P1D"
  }
}

Примечание.

Этот пример предназначен только для демонстрации. Свойства scriptContent и primaryScriptUri не могут существовать в одном шаблоне.

Примечание.

scriptContent — это скрипт с несколькими строками. Портал Azure и конвейер Azure DevOps не могут анализировать скрипт развертывания с несколькими строками. Вы можете либо объединить команды PowerShell (используя точки с запятой, \r\n или \n) в одну строку, либо использовать свойство primaryScriptUri с внешним файлом сценария. Для строк JSON доступно множество бесплатных инструментов escape/unescape. Например, https://www.freeformatter.com/json-escape.html.

Сведения о значениях свойств.

  • identity: для программного интерфейса скрипта развертывания версии 01.10.2020 г. или более поздней назначенное пользователем управляемое удостоверение является необязательным, если в скрипте не требуется выполнение действий на платформе Azure. Для программного интерфейса версии 01.10.2019 г. (предварительная версия) требуется управляемое удостоверение, так как служба скрипта развертывания использует его для выполнения скриптов. Если задано свойство идентификаторов, служба скрипта вызывает Connect-AzAccount -Identity перед вызовом пользовательского скрипта. Сейчас поддерживаются только управляемые удостоверения, назначаемые пользователем. Для входа с другим удостоверением в скрипте можно вызвать Connect-AzAccount.

  • tags: теги скрипта развертывания. Если служба скриптов развертывания создает учетную запись хранения и экземпляр контейнера, теги передаются обоим ресурсам, которые можно использовать для их идентификации. Другим способом идентификации этих ресурсов является суффиксы, содержащие azscripts. Дополнительные сведения см. в статье "Мониторинг и устранение неполадок сценариев развертывания".

  • kind. Укажите тип скрипта. В настоящее время поддерживаются скрипты Azure PowerShell и Azure CLI. Допустимые значения: AzurePowerShell и AzureCLI.

  • forceUpdateTag: изменение этого значения между развертываниями шаблона приводит к повторному выполнению сценария развертывания. Функции newGuid() и utcNow() можно использовать только со значением параметра по умолчанию. Дополнительные сведения о выполнении скрипта несколько раз см. здесь.

  • containerSettings: укажите параметры для настройки экземпляра контейнера Azure. Для скрипта развертывания требуется новый экземпляр контейнера Azure. Нельзя указать уже существующий экземпляр контейнера Azure. Имя группы контейнеров можно настроить с помощью containerGroupName. Если этот параметр не указан, имя группы создается автоматически.

  • storageAccountSettings: укажите параметры для использования имеющейся учетной записи хранения. Если storageAccountName не указано, учетная запись хранения создается автоматически. Ознакомьтесь с использованием имеющейся учетной записи хранения.

  • azPowerShellVersion/azCliVersion: укажите используемую версию модуля. См. список поддерживаемые версии Azure PowerShell. Версия определяет, какой образ контейнера следует использовать:

    • Az versioner больше или равно 9 использует Ubuntu 22.04.
    • Az versioner больше или равно 6, но менее 9 использует Ubuntu 20.04.
    • Az version меньше 6 использует Ubuntu 18.04.

    Внимание

    Рекомендуется обновить до последней версии Ubuntu, так как Ubuntu 18.04 приближается к концу его существования и больше не будет получать обновления для системы безопасности после 31 мая 2023 года.

    См. список поддерживаемые версии Azure CLI.

    Внимание

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

  • arguments: укажите значения параметров. Значения разделяются пробелами.

    Скрипты развертывания разбивают аргументы на массив строк путем системного вызова CommandLineToArgvW. Этот шаг необходим, так как аргументы передаются в экземпляр контейнера Azure в качестве свойства команды, а свойство команды — в виде массива строк.

    Если аргументы содержат escape-символы, используйте инструмент JsonEscaper для двойного преобразования символов. Вставьте в инструмент исходную escape-строку и выберите Escape. Инструмент выводит строку с двойным преобразованием символов. Например, в предыдущем примере шаблона аргумент имеет значение -name \"John Dole\". Escape-строка имеет значение -name \\\"John Dole\\\".

    Чтобы передать параметр шаблона ARM типового объекта в качестве аргумента, преобразуйте объект в строку с помощью функции string(), а затем используйте функцию replace(), чтобы заменить любые \" на \\\". Например:

    replace(string(parameters('tables')), '\"', '\\\"')
    

    Дополнительные сведения см. в примере шаблона.

  • environmentVariables: укажите переменные среды, передаваемые в скрипт. Дополнительные сведения см. в статье Разработка сценариев развертывания.

  • scriptContent: укажите содержимое сценария. Чтобы запустить внешний сценарий, используйте primaryScriptUri. Примеры см. в разделах Использование встроенных сценариев и Использование внешних сценариев.

  • primaryScriptUri: укажите общедоступный URL-адрес основного скрипта развертывания с поддерживаемыми расширениями файлов. Дополнительные сведения см. в разделе Использование внешних скриптов.

  • supportingScriptUris: укажите массив общедоступных URL-адресов для вспомогательных файлов, которые вызываются посредством scriptContent либо primaryScriptUri. Дополнительные сведения см. в разделе Использование внешних скриптов.

  • timeout. Укажите максимально допустимое время выполнения скрипта в формате ISO 8601. Значение по умолчанию — P1D.

  • cleanupPreference. Укажите предпочтение очистки двух вспомогательных ресурсов развертывания, учетной записи хранения и экземпляра контейнера при получении выполнения скрипта в состоянии терминала. Параметр по умолчанию — Always, который означает удаление вспомогательных ресурсов, несмотря на состояние терминала (успешно, сбой, отмена). Дополнительные сведения в разделе об очистке ресурсов скриптов развертывания.

  • retentionInterval: укажите интервал, для которого служба сохраняет ресурс скрипта развертывания после выполнения скрипта развертывания достигает состояния терминала. Ресурс скрипта развертывания удаляется при истечении этого срока действия. Длительность основывается на методике ISO 8601. Интервал хранения данных составляет от 1 до 26 часов (PT26H). Это свойство используется, если для параметра cleanupPreference установлено значение OnExpiration. Дополнительные сведения в разделе об очистке ресурсов скриптов развертывания.

Другие примеры

  • Пример 1: создайте хранилище ключей и используйте скрипт развертывания для назначения сертификата хранилища ключей.
  • Пример 2: создайте группу ресурсов на уровне подписки, создайте хранилище ключей в группе ресурсов, а затем используйте скрипт развертывания для назначения сертификата хранилища ключей.
  • Пример 3: создайте назначаемое пользователем управляемое удостоверение, назначьте роль участника для удостоверения на уровне группы ресурсов, создайте хранилище ключей, а затем используйте скрипт развертывания для назначения сертификата хранилища ключей.
  • Пример 4. Это тот же сценарий, что и в примере 1 в этом списке. Для запуска сценария развертывания создается новая группа ресурсов. Этот шаблон является шаблоном на уровне подписки.
  • Пример 5. Это тот же сценарий, что и в примере 4. Этот шаблон является шаблоном на уровне группы ресурсов.
  • Пример 6. Вручную создайте управляемое удостоверение, назначаемое пользователем, и назначьте ему разрешение на использование API Microsoft Graph для создания приложений Microsoft Entra; в шаблоне ARM используйте скрипт развертывания для создания приложения Microsoft Entra и субъекта-службы, а также вывода идентификаторов объектов и идентификатора клиента.

Использование встроенных сценариев

В приведенном ниже шаблоне определен один ресурс с типом Microsoft.Resources/deploymentScripts. Выделенная часть — встроенный сценарий.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "\\\"John Dole\\\""
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runPowerShellInlineWithOutput",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "scriptContent": "
          param([string] $name)
          $output = \"Hello {0}\" -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "arguments": "[concat('-name', ' ', parameters('name'))]",
        "timeout": "PT1H",
        "cleanupPreference": "OnSuccess",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('runPowerShellInlineWithOutput').outputs.text]",
      "type": "string"
    }
  }
}

Примечание.

Так как встроенные скрипты развертывания заключены в двойные кавычки, строки внутри этих скриптов необходимо преобразовать с помощью обратной косой черты (\) или заключить в кавычки. Можно также использовать подстановку строк, как показано в предыдущем примере JSON.

Сценарий принимает один параметр и выводит значение параметра. DeploymentScriptOutputs используется для хранения выходных данных. В разделе выходных данных строка value показывает, как получить доступ к сохраненным значениям. Write-Output используется для отладки. Сведения о получении доступа к выходному файлу см. в разделе Мониторинг и устранение ошибок скриптов развертывания. Описания свойств см. в разделе Примеры шаблонов.

Чтобы выполнить сценарий, выберите Попробовать. Откроется Cloud Shell. Вставьте приведенный ниже сценарий PowerShell в окно оболочки.

$resourceGroupName = Read-Host -Prompt "Enter the name of the resource group to be created"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.json"

Write-Host "Press [ENTER] to continue ..."

Выходные данные выглядят следующим образом.

Снимок экрана: выходные данные скрипта развертывания шаблона Resource Manager hello world.

Использование внешних сценариев

Помимо встроенных сценариев можно также использовать внешние файлы сценария. Поддерживаются только основные сценарии PowerShell с расширением файла PS1. Для CLI основные сценарии могут иметь любое расширение (или не иметь его), если это допустимые сценарии Bash. Чтобы использовать внешние файлы сценария, замените scriptContent на primaryScriptUri. Например:

"primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",

Дополнительные сведения см. в примере шаблона.

Внешние файлы сценария должны быть доступны. Для защиты файлов скриптов, хранящихся в учетных записях хранения Azure, создайте маркер SAS и включите его в универсальный код ресурса (URI) для шаблона. Задайте срок действия, достаточный для выполнения развертывания. Дополнительные сведения см. в разделе Развертывание частного шаблона ARM с помощью маркера SAS.

Необходимо обеспечить целостность скриптов, на которые ссылается скрипт развертывания, посредством primaryScriptUri или supportingScriptUris. Указывайте только те надежные сценарии.

Использование вспомогательных сценариев

Можно разделить сложную логику и поместить ее в один или несколько вспомогательных файлов сценария. Свойство supportingScriptUris позволяет при необходимости указать массив универсальных кодов ресурса (URI) для вспомогательных файлов сценария.

"scriptContent": "
    ...
    ./Create-Cert.ps1
    ...
"

"supportingScriptUris": [
  "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/create-cert.ps1"
],

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

Во время выполнения вспомогательные файлы копируются в папку azscripts/azscriptinput. Используйте относительный путь, чтобы указать вспомогательные файлы в файлах встроенных сценариев и основных сценариев.

Работа с выходными данными из скриптов PowerShell

В следующем шаблоне показана передача значений между двумя ресурсами deploymentScripts:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "John Dole"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate1",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-name', ' ', concat('\\\"', parameters('name'), '\\\"'))]",
        "scriptContent": "
          param([string] $name)
          $output = 'Hello {0}' -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    },
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate2",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "dependsOn": [
        "scriptInTemplate1"
      ],
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-textToEcho', ' ', concat('\\\"', reference('scriptInTemplate1').outputs.text, '\\\"'))]",
        "scriptContent": "
          param([string] $textToEcho)
          Write-Output $textToEcho
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $textToEcho
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('scriptInTemplate2').outputs.text]",
      "type": "string"
    }
  }
}

В первом ресурсе необходимо определить переменную $DeploymentScriptOutputs и использовать ее для хранения выходных значений. Чтобы получить доступ к выходному значению из другого ресурса в шаблоне, используйте следующий код.

reference('<ResourceName>').outputs.text

Работа с выходными данными из скриптов CLI

В отличие от сценариев развертывания Azure PowerShell, CLI/bash не предоставляет общую переменную для хранения выходных данных скрипта. Вместо этого она использует переменную среды с именем AZ_SCRIPTS_OUTPUT_PATH , чтобы указать расположение файла выходных данных скрипта. При выполнении скрипта развертывания в шаблоне ARM оболочка Bash автоматически настраивает эту переменную среды. Его предопределенное значение задается как /mnt/azscripts/azscriptoutput/scriptoutputs.json. Выходные данные необходимы для соответствия допустимой структуре объекта строки JSON. Содержимое файла должно быть отформатировано как пара "ключ-значение". Например, массив строк следует сохранить как {MyResult": [ foo, bar"] }. Хранение только результатов массива, таких как [foo", "bar" ], считается недопустимым.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "identity": {
      "type": "string"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runBashWithOutputs",
      "location": "[resourceGroup().location]",
      "kind": "AzureCLI",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[parameters('identity')]": {
          }
        }
      },
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "AzCliVersion": "2.40.0",
        "timeout": "PT30M",
        "arguments": "'foo' 'bar'",
        "environmentVariables": [
          {
            "name": "UserName",
            "value": "jdole"
          },
          {
            "name": "Password",
            "secureValue": "jDolePassword"
          }
        ],
        "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo \"arg2 is: $2\"; echo \"Username is: $UserName\"; echo \"password is: $Password\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
        "cleanupPreference": "OnExpiration",
        "retentionInterval": "P1D"

В предыдущем примере используется компонент jq. Он поставляется с образами контейнеров. Ознакомьтесь с настройкой среды разработки.

Используйте существующую учетную запись хранения

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

  • Поддерживаемые типы учетных записей хранения:

    номер SKU Поддерживаемый тип
    Premium_LRS FileStorage
    Premium_ZRS FileStorage
    Standard_GRS Хранилище, Хранилище версии 2
    Standard_GZRS StorageV2
    Standard_LRS Хранилище, Хранилище версии 2
    Standard_RAGRS Хранилище, Хранилище версии 2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

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

  • Правила брандмауэра учетной записи хранения еще не поддерживаются. Дополнительные сведения см. в статье Настройка брандмауэров службы хранилища Azure и виртуальных сетей.

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

Чтобы указать существующую учетную запись хранения, добавьте следующий код JSON в элемент Property Microsoft.Resources/deploymentScripts:

"storageAccountSettings": {
  "storageAccountName": "myStorageAccount",
  "storageAccountKey": "myKey"
},
  • storageAccountName: задайте имя учетной записи хранения.

  • storageAccountKey: задайте один из ключей учетной записи хранения. Получить ключ можно с помощью функции listKeys(). Например:

    "storageAccountSettings": {
        "storageAccountName": "[variables('storageAccountName')]",
        "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]"
    }
    

Полный пример определения Microsoft.Resources/deploymentScripts приведен в разделе Примеры шаблонов.

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

Разработка сценариев развертывания

Обработка нетерминации ошибок

Вы можете управлять тем, как PowerShell реагирует на нетерминирующие ошибки с помощью переменной $ErrorActionPreference в скрипте развертывания. Если эта переменная не задана в скрипте развертывания, служба скриптов использует значение по умолчанию Continue.

Служба скриптов присваивает состоянию подготовки ресурсов значение Failed, когда скрипт встречает ошибку, несмотря на настройку $ErrorActionPreference.

Использование переменных среды

Скрипт развертывания использует переменные среды:

Переменная среды Default value Зарезервировано системой
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud N
AZ_SCRIPTS_CLEANUP_PREFERENCE OnExpiration N
AZ_SCRIPTS_OUTPUT_PATH <AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY>/<AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME> Y
AZ_SCRIPTS_PATH_INPUT_DIRECTORY /mnt/azscripts/azscriptinput Y
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY /mnt/azscripts/azscriptoutput Y
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME Azure PowerShell: userscript.ps1; Azure CLI: userscript.sh Y
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config Y
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json Y
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME executionresult.json Y
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY /subscriptions/ N

Дополнительные сведения об использовании AZ_SCRIPTS_OUTPUT_PATH см. в разделе Работа с выходными данными скрипта CLI.

Передача защищенных строк в сценарий развертывания

Используя переменные среды (EnvironmentVariable) в экземплярах контейнеров, вы можете динамически изменять конфигурацию приложения или сценария, запущенного в контейнере. Скрипт развертывания обрабатывает незащищенные и защищенные переменные среды так же, как и экземпляр контейнера Azure. Узнайте больше об определении переменных среды для экземпляров контейнеров. Пример см. в разделе Примеры шаблонов.

Максимально допустимый размер переменных среды — 64 КБ.

Мониторинг и устранение ошибок скриптов развертывания

Для выполнения сценария служба сценариев создает учетную запись хранения (если не указана существующая учетная запись хранения) и экземпляр контейнера. Если служба сценариев автоматически создает эти ресурсы, то они оба содержат суффикс azscripts в имени.

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

Пользовательский сценарий, результаты выполнения и файл stdout хранятся в общих папках учетной записи хранения. Существует папка с именем azscripts. В ней есть еще две папки для входных и выходных файлов: azscriptinput и azscriptoutput.

Выходная папка содержит файл executionresult.json и выходной файл скрипта. Сообщение об ошибке выполнения сценария можно просмотреть в файле executionresult.json. Выходной файл создается только при успешном выполнении сценария. Входная папка содержит системный файл скрипта PowerShell и пользовательские файлы скрипта развертывания. Вы можете заменить файл пользовательского сценария развертывания измененным файлом и повторно запустить сценарий развертывания из экземпляра контейнера Azure.

Использование портала Azure

После развертывания ресурса скрипта развертывания он будет отображаться в группе ресурсов на портале Azure. Снимок экрана: страница Обзор ресурса скрипта развертывания:

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

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

Слева в меню можно просмотреть содержимое скрипта развертывания, аргументы, передаваемые в скрипт, а также выходные данные. Кроме того, можно экспортировать шаблон для скрипта развертывания, включая скрипт развертывания.

С помощью PowerShell

С помощью Azure PowerShell можно управлять скриптами развертывания в рамках действия подписки или группы ресурсов:

  • Get-AzDeploymentScript: получение или вывод списка скриптов развертывания.
  • Get-AzDeploymentScriptLog: получение журнала выполнения скриптов развертывания.
  • Remove-AzDeploymentScript: удаление скрипта развертывания и связанных с ним ресурсов.
  • Save-AzDeploymentScriptLog: сохранение журнала выполнения скрипта развертывания на диске.

Выходные данные Get-AzDeploymentScript должны иметь следующий вид:

Name                : runPowerShellInlineWithOutput
Id                  : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName   : myds0618rg
Location            : centralus
SubscriptionId      : 01234567-89AB-CDEF-0123-456789ABCDEF
ProvisioningState   : Succeeded
Identity            : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/mydentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami
ScriptKind          : AzurePowerShell
AzPowerShellVersion : 9.7
StartTime           : 5/11/2023 7:46:45 PM
EndTime             : 5/11/2023 7:49:45 PM
ExpirationDate      : 5/12/2023 7:49:45 PM
CleanupPreference   : OnSuccess
StorageAccountId    : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.ContainerInstance/containerGroups/ftnlvo6rlrvo2azscripts
Outputs             :
                      Key                 Value
                      ==================  ==================
                      text                Hello John Dole

RetentionInterval   : P1D
Timeout             : PT1H

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

С помощью Azure CLI можно управлять скриптами развертывания в рамках действия подписки или группы ресурсов:

Выходные данные команды list похожи на:

[
  {
    "arguments": "'foo' 'bar'",
    "azCliVersion": "2.40.0",
    "cleanupPreference": "OnExpiration",
    "containerSettings": {
      "containerGroupName": null
    },
    "environmentVariables": null,
    "forceUpdateTag": "20231101T163748Z",
    "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
    "identity": {
      "tenantId": "01234567-89AB-CDEF-0123-456789ABCDEF",
      "type": "userAssigned",
      "userAssignedIdentities": {
        "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
          "clientId": "01234567-89AB-CDEF-0123-456789ABCDEF",
          "principalId": "01234567-89AB-CDEF-0123-456789ABCDEF"
        }
      }
    },
    "kind": "AzureCLI",
    "location": "centralus",
    "name": "runBashWithOutputs",
    "outputs": {
      "Result": [
        {
          "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/mytest/providers/Microsoft.KeyVault/vaults/mykv1027",
          "resourceGroup": "mytest"
        }
      ]
    },
    "primaryScriptUri": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "mytest",
    "retentionInterval": "1 day, 0:00:00",
    "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
    "status": {
      "containerInstanceId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/mytest/providers/Microsoft.ContainerInstance/containerGroups/eg6n7wvuyxn7iazscripts",
      "endTime": "2023-11-01T16:39:12.080950+00:00",
      "error": null,
      "expirationTime": "2023-11-02T16:39:12.080950+00:00",
      "startTime": "2023-11-01T16:37:53.139700+00:00",
      "storageAccountId": null
    },
    "storageAccountSettings": {
      "storageAccountKey": null,
      "storageAccountName": "dsfruro267qwb4i"
    },
    "supportingScriptUris": null,
    "systemData": {
      "createdAt": "2023-10-31T19:06:57.060909+00:00",
      "createdBy": "someone@contoso.com",
      "createdByType": "User",
      "lastModifiedAt": "2023-11-01T16:37:51.859570+00:00",
      "lastModifiedBy": "someone@contoso.com",
      "lastModifiedByType": "User"
    },
    "tags": null,
    "timeout": "0:30:00",
    "type": "Microsoft.Resources/deploymentScripts"
  }
]

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

Сведения о развертывании ресурсов сценария развертывания можно получить на уровне группы ресурсов и на уровне подписки с помощью REST API.

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>?api-version=2020-10-01
/subscriptions/<SubscriptionID>/providers/microsoft.resources/deploymentScripts?api-version=2020-10-01

В следующем примере используется ARMClient.

armclient login
armclient get /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01

Выходные данные должны иметь следующий вид:

{
  "kind": "AzurePowerShell",
  "identity": {
    "type": "userAssigned",
    "tenantId": "01234567-89AB-CDEF-0123-456789ABCDEF",
    "userAssignedIdentities": {
      "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
        "principalId": "01234567-89AB-CDEF-0123-456789ABCDEF",
        "clientId": "01234567-89AB-CDEF-0123-456789ABCDEF"
      }
    }
  },
  "location": "centralus",
  "systemData": {
    "createdBy": "someone@contoso.com",
    "createdByType": "User",
    "createdAt": "2023-05-11T02:59:04.7501955Z",
    "lastModifiedBy": "someone@contoso.com",
    "lastModifiedByType": "User",
    "lastModifiedAt": "2023-05-11T02:59:04.7501955Z"
  },
  "properties": {
    "provisioningState": "Succeeded",
    "forceUpdateTag": "20220625T025902Z",
    "azPowerShellVersion": "9.7",
    "scriptContent": "\r\n          param([string] $name)\r\n          $output = \"Hello {0}\" -f $name\r\n          Write-Output $output\r\n          $DeploymentScriptOutputs = @{}\r\n          $DeploymentScriptOutputs['text'] = $output\r\n        ",
    "arguments": "-name \\\"John Dole\\\"",
    "retentionInterval": "P1D",
    "timeout": "PT1H",
    "containerSettings": {},
    "status": {
      "containerInstanceId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
      "storageAccountId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Storage/storageAccounts/64lxews2qfa5uazscripts",
      "startTime": "2023-05-11T02:59:07.5951401Z",
      "endTime": "2023-05-11T03:00:16.7969234Z",
      "expirationTime": "2023-05-12T03:00:16.7969234Z"
    },
    "outputs": {
      "text": "Hello John Dole"
    },
    "cleanupPreference": "OnSuccess"
  },
  "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput",
  "type": "Microsoft.Resources/deploymentScripts",
  "name": "runPowerShellInlineWithOutput"
}

Приведенный ниже REST API возвращает журнал.

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>/logs?api-version=2020-10-01

Он работает только до удаления ресурсов сценария развертывания.

Выберите Показать скрытые типы, чтобы просмотреть список ресурсов deploymentScripts на портале.

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

Очистка ресурсов сценария развертывания

Два автоматически созданных вспомогательных ресурса никогда не могут выходить deploymentScript из строя, если они не будут удалены. Жизненный цикл вспомогательных ресурсов управляется свойством, жизненный цикл deploymentScript ресурса управляется cleanupPreference свойствомretentionInterval:

  • cleanupPreference: укажите предпочтение очистки двух вспомогательных ресурсов при получении выполнения скрипта в состоянии терминала. Поддерживаются такие значения:

    • Всегда: удалите два вспомогательных ресурса после выполнения скрипта в состоянии терминала. Если используется существующая учетная запись хранения, служба скриптов удаляет общую папку, созданную службой. deploymentScripts Так как ресурс по-прежнему может присутствовать после очистки вспомогательных ресурсов, служба скриптов сохраняет результаты выполнения скрипта, например stdout, выходные данные и возвращаемое значение перед удалением ресурсов.

    • OnSuccess: удалите два вспомогательных ресурса, только если выполнение скрипта выполнено успешно. Если используется существующая учетная запись хранения, то служба сценариев удаляет файловый ресурс только после успешного выполнения сценария.

      Если выполнение скрипта не выполнено, служба скриптов ожидает истечения срока действия, прежде чем retentionInterval очистить вспомогательные ресурсы, а затем ресурс скрипта развертывания.

    • OnExpiration: удалите два вспомогательных ресурса только при retentionInterval истечении срока действия параметра. Если используется существующая учетная запись хранения, то служба скриптов удаляет общую папку, но оставляет учетную запись хранения.

    Экземпляр контейнера и учетная запись хранения удаляются в соответствии с cleanupPreference. Однако если скрипт завершается ошибкой и cleanupPreference не задано значение Always, процесс развертывания автоматически сохраняет контейнер в течение одного часа или до очистки контейнера. Вы можете использовать время для устранения неполадок скрипта. Чтобы контейнер запускался после успешного развертывания, добавьте в скрипт шаг "спящий режим". Например, добавьте Start-Sleep в конце скрипта. Если не добавить шаг спящего режима, контейнер будет находиться терминальном состоянии, и к нему нельзя будет получить доступ, даже если он еще не удален.

  • retentionInterval: укажите интервал времени хранения deploymentScript ресурса, после которого истек срок действия и удаление.

Примечание.

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

Автоматически созданные учетную запись хранения и экземпляр контейнера нельзя удалить, если сценарий развертывания развернут в группе ресурсов с блокировкой CanNotDelete. Чтобы решить эту проблему, можно развернуть сценарий в другой группе ресурсов, не имеющей блокировок. См. примеры 4 и 5 в Примерах шаблонов.

Многократное выполнение сценария

Выполнение сценария развертывания является идемпотентной операцией. Если ни одно из свойств ресурса deploymentScripts (включая встроенный сценарий) не изменилось, скрипт не будет выполняться при повторном развертывании шаблона. Служба сценариев развертывания сравнивает имена ресурсов в шаблоне с существующими ресурсами в той же группе ресурсов. Существуют два варианта многократного выполнения одного сценария.

  • Измените имя ресурсаdeploymentScripts. Например, используйте функцию шаблона utcNow в качестве имени ресурса или части его имени. При изменении имени ресурса создается новый ресурс deploymentScripts. Целесообразно сохранить журнал выполнения сценария.

    Примечание.

    Функция utcNow может использоваться только в значении параметра по умолчанию.

  • Укажите другое значение в свойстве шаблона forceUpdateTag. Например, используйте значение utcNow.

Примечание.

Напишите идемпотентные сценарии развертывания. Это гарантирует, что если они случайно будут выполнены повторно, это не приведет к изменениям системы. Например, если сценарий развертывания используется для создания ресурса Azure, убедитесь, что этот ресурс не существует, прежде чем создавать его, чтобы выполнение сценария могло завершиться успешно и вы не создали ресурс повторно.

Настройка среды разработки

В качестве среды разработки скрипта развертывания можно использовать предварительно настроенный образ контейнера. Дополнительные сведения см. в разделе Настройка среды разработки для скриптов развертывания в шаблонах.

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

Коды ошибок скрипта развертывания

Код ошибки Description
DeploymentScriptInvalidOperation Определение ресурса скрипта развертывания в шаблоне содержит недопустимые имена свойств.
DeploymentScriptResourceConflict Не удается удалить ресурс скрипта развертывания, который находится в нетерминальном состоянии, и выполнение не превысило 1 час. Или не удается повторно запустить тот же скрипт развертывания с тем же идентификатором ресурса (та же подписка, имя группы ресурсов и имя ресурса), но с другим содержимым скрипта.
DeploymentScriptOperationFailed Внутренняя ошибка при выполнении операции скрипта развертывания. Обращение в службу поддержки Майкрософт.
DeploymentScriptStorageAccountAccessKeyNotSpecified Для существующей учетной записи хранения не был указан ключ доступа.
DeploymentScriptContainerGroupContainsInvalidContainers Группа контейнеров, созданная службой скриптов развертывания, была изменена извне, и добавлены недопустимые контейнеры.
DeploymentScriptContainerGroupInNonterminalState Два или несколько ресурсов скриптов развертывания используют одинаковое имя экземпляра контейнера Azure в одной группе ресурсов, и один из них еще не завершил выполнение.
DeploymentScriptStorageAccountInvalidKind Существующая учетная запись хранения типа BlobBlobStorage или BlobStorage не поддерживает общие папки и не может быть использована.
DeploymentScriptStorageAccountInvalidKindAndSku Существующая учетная запись хранения не поддерживает общие папки. Список поддерживаемых типов учетных записей хранения см. в разделе Использование существующей учетной записи хранения.
DeploymentScriptStorageAccountNotFound Учетная запись хранения не существует или удалена внешним процессом или инструментом.
DeploymentScriptStorageAccountWithServiceEndpointEnabled Указанная учетная запись хранения имеет конечную точку службы. Учетная запись хранения с конечной точкой службы не поддерживается.
DeploymentScriptStorageAccountInvalidAccessKey Для существующей учетной записи хранения указан недопустимый ключ доступа.
DeploymentScriptStorageAccountInvalidAccessKeyFormat Недопустимый формат ключа доступа учетной записи хранения. См. статью Управление ключами доступа к учетной записи хранения.
DeploymentScriptExceededMaxAllowedTime Время выполнения скрипта развертывания превысило время ожидания, указанное в определении ресурса скрипта развертывания.
DeploymentScriptInvalidOutputs Выходные данные скрипта развертывания являются недопустимым объектом JSON.
DeploymentScriptContainerInstancesServiceLoginFailure Назначенному пользователем управляемому удостоверению не удалось войти после 10 попыток с интервалом 1 минута.
DeploymentScriptContainerGroupNotFound Группа контейнеров, созданная службой скриптов развертывания, удалена внешним инструментом или процессом.
DeploymentScriptDownloadFailure Не удалось загрузить вспомогательный скрипт. См. раздел Использование вспомогательного скрипта.
DeploymentScriptError Пользовательский скрипт вызвал ошибку.
DeploymentScriptBootstrapScriptExecutionFailed Скрипт начальной загрузки вызвал ошибку. Скрипт начальной загрузки — это системный скрипт, который координирует выполнение скрипта развертывания.
DeploymentScriptExecutionFailed Неизвестная ошибка во время выполнения скрипта развертывания.
DeploymentScriptContainerInstancesServiceUnavailable При создании экземпляра контейнера Azure (ACI) произошла ошибка "Служба недоступна".
DeploymentScriptContainerGroupInNonterminalState При создании экземпляра контейнера Azure (ACI) другой скрипт развертывания использует то же имя ACI в той же области (та же подписка, имя группы ресурсов и имя ресурса).
DeploymentScriptContainerGroupNameInvalid Указанное имя экземпляра контейнера Azure (ACI) не соответствует требованиям ACI. См. раздел Устранение распространенных неполадок в экземплярах контейнеров Azure.

Использование Microsoft Graph в сценарии развертывания

Скрипт развертывания может использовать Microsoft Graph для создания и работы с объектами в идентификаторе Microsoft Entra.

Команды

При использовании сценариев развертывания Azure CLI можно использовать команды в az ad группе команд для работы с приложениями, субъектами-службами, группами и пользователями. Вы также можете напрямую вызывать API Microsoft Graph с помощью az rest команды.

При использовании скриптов развертывания Azure PowerShell можно использовать Invoke-RestMethod командлет для непосредственного вызова API Microsoft Graph.

Разрешения

Удостоверение, которое использует скрипт развертывания, должно быть авторизовано для работы с API Microsoft Graph с соответствующими разрешениями для выполняемых операций. Необходимо авторизовать удостоверение за пределами развертывания шаблона, например путем предварительного создания управляемого удостоверения, назначаемого пользователем, и назначения ей роли приложения для Microsoft Graph. Дополнительные сведения см. в этом кратком руководстве.

Доступ к частной виртуальной сети

С помощью Microsoft.Resources/deploymentScripts версии 2023-08-01 можно запускать сценарии развертывания в частных сетях с некоторыми дополнительными конфигурациями.

  • Создайте управляемое удостоверение, назначаемое пользователем, и укажите его в свойстве identity . Чтобы назначить удостоверение, см. раздел "Удостоверение".

  • Создайте учетную запись хранения с allowSharedKeyAccess заданным значением true и укажите сценарий развертывания для использования существующей учетной записи хранения. Сведения об указании существующей учетной записи хранения см. в разделе "Использование существующей учетной записи хранения". Для учетной записи хранения требуется дополнительная конфигурация.

    1. Откройте учетную запись хранения в портал Azure.

    2. В меню слева выберите контроль доступа (IAM) и перейдите на вкладку "Назначения ролей".

    3. Добавьте роль в Storage File Data Privileged Contributor управляемое удостоверение назначения пользователя.

    4. В меню слева в разделе "Безопасность и сеть" выберите "Сеть" и выберите "Брандмауэры" и "Виртуальные сети".

    5. Выберите "Включено" из выбранных виртуальных сетей и IP-адресов.

      Снимок экрана: настройка учетной записи хранения для доступа к частной сети.

    6. В разделе "Виртуальные сети" добавьте подсеть. На снимке экрана подсеть называется dspvnVnet.

    7. В разделе "Исключения" выберите "Разрешить службам Azure" в списке доверенных служб доступ к этой учетной записи хранения.

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string",
      "maxLength": 10
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "userAssignedIdentityName": {
      "type": "string",
      "defaultValue": "[format('{0}Identity', parameters('prefix'))]"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('{0}stg{1}', parameters('prefix'), uniqueString(resourceGroup().id))]"
    },
    "vnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Vnet', parameters('prefix'))]"
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Subnet', parameters('prefix'))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-09-01",
      "name": "[parameters('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "10.0.0.0/16"
          ]
        },
        "enableDdosProtection": false,
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "10.0.0.0/24",
              "serviceEndpoints": [
                {
                  "service": "Microsoft.Storage"
                }
              ],
              "delegations": [
                {
                  "name": "Microsoft.ContainerInstance.containerGroups",
                  "properties": {
                    "serviceName": "Microsoft.ContainerInstance/containerGroups"
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "networkAcls": {
          "bypass": "AzureServices",
          "virtualNetworkRules": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]",
              "action": "Allow",
              "state": "Succeeded"
            }
          ],
          "defaultAction": "Deny"
        },
        "allowSharedKeyAccess": true
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-07-31-preview",
      "name": "[parameters('userAssignedIdentityName')]",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Storage/storageAccounts/{0}', parameters('storageAccountName'))]",
      "name": "[guid(tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), '2023-07-31-preview').principalId]",
        "roleDefinitionId": "[tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
      ]
    }
  ]
}

Для тестирования развертывания можно использовать следующий шаблон ARM:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    },
    "storageAccountName": {
      "type": "string"
    },
    "vnetName": {
      "type": "string"
    },
    "subnetName": {
      "type": "string"
    },
    "userAssignedIdentityName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2023-08-01",
      "name": "[format('{0}DS', parameters('prefix'))]",
      "location": "[parameters('location')]",
      "identity": {
        "type": "userAssigned",
        "userAssignedIdentities": {
          "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')))]": {}
        }
      },
      "kind": "AzureCLI",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azCliVersion": "2.47.0",
        "storageAccountSettings": {
          "storageAccountName": "[parameters('storageAccountName')]"
        },
        "containerSettings": {
          "subnetIds": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]"
            }
          ]
        },
        "scriptContent": "echo \"Hello world!\"",
        "retentionInterval": "P1D",
        "cleanupPreference": "OnExpiration"
      }
    }
  ]
}

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

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