Развертывание ресурсов с помощью шаблонов ARM и Azure CLIDeploy resources with ARM templates and Azure CLI

В этой статье объясняется, как использовать Azure CLI с шаблонами Azure Resource Manager (шаблоны ARM) для развертывания ресурсов в Azure.This article explains how to use Azure CLI with Azure Resource Manager templates (ARM templates) to deploy your resources to Azure. Если вы не знакомы с концепциями развертывания и управления решениями Azure, см. раздел Общие сведения о развертывании шаблонов.If you aren't familiar with the concepts of deploying and managing your Azure solutions, see template deployment overview.

Команды развертывания изменились в Azure CLI версии 2.2.0.The deployment commands changed in Azure CLI version 2.2.0. Для использования примеров в этой статье требуется Azure CLI версии 2.2.0 или более поздней.The examples in this article require Azure CLI version 2.2.0 or later.

Чтобы выполнить этот пример, установите последнюю версию Azure CLI.To run this sample, install the latest version of the Azure CLI. Перед началом выполните команду az login, чтобы создать подключение к Azure.To start, run az login to create a connection with Azure.

Примеры для Azure CLI написаны для оболочки bash.Samples for the Azure CLI are written for the bash shell. Чтобы запустить этот пример в Windows PowerShell или командной строке, может потребоваться изменить элементы скрипта.To run this sample in Windows PowerShell or Command Prompt, you may need to change elements of the script.

Если у вас не установлен интерфейс командной строки Azure, можете использовать Cloud Shell.If you don't have Azure CLI installed, you can use the Cloud Shell.

Область развертыванияDeployment scope

Вы можете выбрать для развертывания группу ресурсов, подписку, группу управления или клиент.You can target your deployment to a resource group, subscription, management group, or tenant. В большинстве случаев вы планируете развертывание в группе ресурсов.In most cases, you'll target deployment to a resource group. Чтобы применить политики и назначения ролей в более масштабной области, используйте развертывание по подписке, группе управления или развертыванию клиента.To apply policies and role assignments across a larger scope, use subscription, management group, or tenant deployments. При развертывании в подписке можно создать группу ресурсов и развернуть в ней ресурсы.When deploying to a subscription, you can create a resource group and deploy resources to it.

В зависимости от области развертывания используются разные команды.Depending on the scope of the deployment, you use different commands.

В примерах, приведенных в этой статье, мы используем развертывание в группе ресурсов.The examples in this article use resource group deployments.

Развертывание локального шаблонаDeploy local template

При развертывании ресурсов в Azure выполните следующие действия:When deploying resources to Azure, you:

  1. Вход в учетную запись AzureSign in to your Azure account
  2. Создайте группу ресурсов, которая послужит в качестве контейнера для развертываемых ресурсов.Create a resource group that serves as the container for the deployed resources. Имя группы ресурсов может содержать только буквы, цифры, точки, знаки подчеркивания, дефисы и скобки.The name of the resource group can only include alphanumeric characters, periods, underscores, hyphens, and parenthesis. Оно может содержать до 90 знаков иIt can be up to 90 characters. не должно заканчиваться точкой.It can't end in a period.
  3. Разверните в группе ресурсов шаблон, который определяет создаваемые ресурсы.Deploy to the resource group the template that defines the resources to create.

Шаблон может включать параметры, которые позволяют настроить развертывание.A template can include parameters that enable you to customize the deployment. Например, вы можете предоставить значения, предназначенные для конкретной среды (такой как среда разработки, тестирования и рабочая среда).For example, you can provide values that are tailored for a particular environment (such as dev, test, and production). Пример шаблона определяет параметр для номера SKU учетной записи хранения.The sample template defines a parameter for the storage account SKU.

В следующем примере создается группа ресурсов и развертывается шаблон с локального компьютера:The following example creates a resource group, and deploys a template from your local machine:

az group create --name ExampleGroup --location "Central US"
az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file storage.json \
  --parameters storageAccountType=Standard_GRS

Развертывание может занять несколько минут.The deployment can take a few minutes to complete. По завершении появится сообщение, содержащее результат:When it finishes, you see a message that includes the result:

"provisioningState": "Succeeded",

Deployment name (Имя развертывания)Deployment name

В предыдущем примере вы назвали развертывание ExampleDeployment .In the preceding example, you named the deployment ExampleDeployment. Если имя для развертывания не указано, используется имя файла шаблона.If you don't provide a name for the deployment, the name of the template file is used. Например, если развернуть шаблон с именем azuredeploy.json и не указывать имя развертывания, то развертывание будет называться azuredeploy .For example, if you deploy a template named azuredeploy.json and don't specify a deployment name, the deployment is named azuredeploy.

Каждый раз при выполнении развертывания в журнал развертывания группы ресурсов добавляется запись с именем развертывания.Every time you run a deployment, an entry is added to the resource group's deployment history with the deployment name. Если запустить другое развертывание и присвоить ему такое же имя, то Предыдущая запись будет заменена текущим развертыванием.If you run another deployment and give it the same name, the earlier entry is replaced with the current deployment. Если требуется хранить уникальные записи в журнале развертывания, присвойте каждому развертыванию уникальное имя.If you want to maintain unique entries in the deployment history, give each deployment a unique name.

Чтобы создать уникальное имя, можно назначить случайное число.To create a unique name, you can assign a random number.

deploymentName='ExampleDeployment'$RANDOM

Или добавьте значение даты.Or, add a date value.

deploymentName='ExampleDeployment'$(date +"%d-%b-%Y")

При выполнении параллельных развертываний в одной группе ресурсов с тем же именем развертывания завершается только Последнее развертывание.If you run concurrent deployments to the same resource group with the same deployment name, only the last deployment is completed. Все развертывания с тем же именем, которые не были завершены, заменяются последним развертыванием.Any deployments with the same name that haven't finished are replaced by the last deployment. Например, если вы запускаете развертывание с именем, newStorage которое развертывает учетную запись хранения с именем storage1 и в то же время запускает другое развертывание с именем, newStorage которое развертывает учетную запись хранения с именем storage2 , развертывается только одна учетная запись хранения.For example, if you run a deployment named newStorage that deploys a storage account named storage1, and at the same time run another deployment named newStorage that deploys a storage account named storage2, you deploy only one storage account. Результирующая учетная запись хранения называется storage2 .The resulting storage account is named storage2.

Однако при запуске развертывания с именем, newStorage которое развертывает учетную запись хранения с именем storage1 , и сразу после завершения работы вы запускаете другое развертывание с именем, newStorage которое развертывает учетную запись хранения с именем storage2 , а затем у вас есть две учетные записи хранения.However, if you run a deployment named newStorage that deploys a storage account named storage1, and immediately after it completes you run another deployment named newStorage that deploys a storage account named storage2, then you have two storage accounts. Одна из них называется storage1 , а другая называется storage2 .One is named storage1, and the other is named storage2. Но в журнале развертывания имеется только одна запись.But, you only have one entry in the deployment history.

При указании уникального имени для каждого развертывания их можно запускать параллельно без конфликтов.When you specify a unique name for each deployment, you can run them concurrently without conflict. Если вы запускаете развертывание с именем, newStorage1 которое развертывает учетную запись хранения с именем storage1 и в то же время запускает другое развертывание с именем, newStorage2 которое развертывает учетную запись хранения с именем storage2 , то в журнале развертывания есть две учетные записи хранения и две записи.If you run a deployment named newStorage1 that deploys a storage account named storage1, and at the same time run another deployment named newStorage2 that deploys a storage account named storage2, then you have two storage accounts and two entries in the deployment history.

Чтобы избежать конфликтов с параллельными развертываниями и обеспечить уникальность записей в журнале развертывания, присвойте каждому развертыванию уникальное имя.To avoid conflicts with concurrent deployments and to ensure unique entries in the deployment history, give each deployment a unique name.

Развертывание удаленного шаблонаDeploy remote template

Вместо того чтобы хранить шаблоны ARM на локальном компьютере, вы можете хранить их во внешнем расположении.Instead of storing ARM templates on your local machine, you may prefer to store them in an external location. Вы можете хранить шаблоны в репозитории системы управления версиями (например, GitHub).You can store templates in a source control repository (such as GitHub). А также их можно хранить в учетной записи хранения Azure для общего доступа в организации.Or, you can store them in an Azure storage account for shared access in your organization.

Для развертывания внешнего шаблона используйте параметр template-uri.To deploy an external template, use the template-uri parameter. Используйте универсальный код ресурса (URI) в примере для развертывания примера шаблона из GitHub.Use the URI in the example to deploy the sample template from GitHub.

az group create --name ExampleGroup --location "Central US"
az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json" \
  --parameters storageAccountType=Standard_GRS

В предыдущем примере для шаблона требуется общедоступный код URI, который подходит для большинства сценариев, так как шаблон не должен содержать конфиденциальные данные.The preceding example requires a publicly accessible URI for the template, which works for most scenarios because your template shouldn't include sensitive data. Если необходимо указать конфиденциальные данные (например, пароль администратора), то передайте это значение с помощью безопасного параметра.If you need to specify sensitive data (like an admin password), pass that value as a secure parameter. Но если вы не хотите, чтобы шаблон был общедоступным, можно защитить его, сохранив в закрытом контейнере хранилища.However, if you don't want your template to be publicly accessible, you can protect it by storing it in a private storage container. Сведения о развертывании шаблона, требующего маркер подписанного URL-адреса (SAS), см. в статье Развертывание частного шаблона Resource Manager с использованием токена SAS и Azure PowerShell.For information about deploying a template that requires a shared access signature (SAS) token, see Deploy private template with SAS token.

Развертывание спецификации шаблонаDeploy template spec

Вместо развертывания локального или удаленного шаблона можно создать спецификацию шаблона. Спецификация шаблона — это ресурс в подписке Azure, который содержит шаблон ARM.Instead of deploying a local or remote template, you can create a template spec. The template spec is a resource in your Azure subscription that contains an ARM template. Это позволяет легко обеспечить безопасный общий доступ к шаблону для пользователей в вашей организации.It makes it easy to securely share the template with users in your organization. Используйте управление доступом на основе ролей Azure (Azure RBAC), чтобы предоставить доступ к спецификации шаблона. Сейчас эта функция доступна в предварительной версии.You use Azure role-based access control (Azure RBAC) to grant access to the template spec. This feature is currently in preview.

В следующих примерах показано, как создать и развернуть спецификацию шаблона. Эти команды доступны только в том случае, если вы подписались на предварительную версию.The following examples show how to create and deploy a template spec. These commands are only available if you've signed up for the preview.

Сначала вы создадите спецификацию шаблона, предоставив шаблон ARM.First, you create the template spec by providing the ARM template.

az ts create \
  --name storageSpec \
  --version "1.0" \
  --resource-group templateSpecRG \
  --location "westus2" \
  --template-file "./mainTemplate.json"

Затем вы получите идентификатор для спецификации шаблона и развернете его.Then, you get the ID for template spec and deploy it.

id = $(az ts show --name storageSpec --resource-group templateSpecRG --version "1.0" --query "id")

az deployment group create \
  --resource-group demoRG \
  --template-spec $id

Дополнительные сведения см. в разделе спецификации шаблонов Azure Resource Manager (Предварительная версия).For more information, see Azure Resource Manager template specs (Preview).

Предварительный просмотр измененийPreview changes

Перед развертыванием шаблона можно просмотреть изменения, которые шаблон будет вносить в вашу среду.Before deploying your template, you can preview the changes the template will make to your environment. Используйте операцию "что если ", чтобы убедиться, что шаблон вносит необходимые изменения.Use the what-if operation to verify that the template makes the changes that you expect. Что если также проверяет шаблон на наличие ошибок.What-if also validates the template for errors.

Развертывание шаблона из Cloud ShellDeploy template from Cloud Shell

Для развертывания шаблона можно использовать Cloud Shell.You can use Cloud Shell to deploy your template. Чтобы развернуть внешний шаблон, укажите URI шаблона точно так же, как и для любого внешнего развертывания.To deploy an external template, provide the URI of the template exactly as you would for any external deployment. Чтобы развернуть локальный шаблон, сначала необходимо загрузить шаблон для Cloud Shell в учетную запись хранения.To deploy a local template, you must first load your template into the storage account for your Cloud Shell. В этом разделе описывается, как загрузить шаблон в свою учетную запись облачной оболочки и развернуть его как локальный файл.This section describes how to load the template to your cloud shell account, and deploy it as a local file. Если вы еще не использовали Cloud Shell, ознакомьтесь со статьей Обзор Azure Cloud Shell, чтобы узнать о настройке службы.If you haven't used Cloud Shell, see Overview of Azure Cloud Shell for information about setting it up.

  1. Войдите на портал Azure.Sign in to the Azure portal.

  2. Выберите свою группу ресурсов Cloud Shell.Select your Cloud Shell resource group. Шаблон имени — cloud-shell-storage-<region>.The name pattern is cloud-shell-storage-<region>.

    Выбор группы ресурсов

  3. Выберите учетную запись хранения для Cloud Shell.Select the storage account for your Cloud Shell.

    Выбор учетной записи хранения

  4. Выберите Большие двоичные объекты.Select Blobs.

    Выберите "Большие двоичные объекты"

  5. Выберите + Container (+ Контейнер).Select + Container.

    Добавление контейнера

  6. Задайте контейнеру название и уровень доступа.Give your container a name and an access level. Образец шаблона в данной статье не содержит конфиденциальных сведений и поэтому разрешает анонимный доступ для чтения.The sample template in this article contains no sensitive information, so allow anonymous read access. Нажмите кнопку ОК.Select OK.

    Указание значений для контейнера

  7. Выберите созданный контейнер.Select the container you created.

    Выберите новый контейнер

  8. Выберите команду Отправить.Select Upload.

    Отправка большого двоичного объекта

  9. Найдите и отправьте свой шаблон.Find and upload your template.

    Отправка файла

  10. После отправки выберите шаблон.After it has uploaded, select the template.

    Выберите новый шаблон

  11. Скопируйте URL-адрес.Copy the URL.

    Копирование URL-адреса

  12. Откройте командную строку.Open the prompt.

    Открытие Cloud Shell

В Cloud Shell введите следующие команды:In the Cloud Shell, use the following commands:

az group create --name examplegroup --location "South Central US"
az deployment group create --resource-group examplegroup \
  --template-uri <copied URL> \
  --parameters storageAccountType=Standard_GRS

ПараметрыParameters

Чтобы передать значения параметров, можно использовать встроенные параметры или файл параметров.To pass parameter values, you can use either inline parameters or a parameter file.

Встроенные параметрыInline parameters

Чтобы передать встроенные параметры, укажите значения в parameters.To pass inline parameters, provide the values in parameters. Например, строки и массив передаются в шаблон из оболочки Bash следующим образом:For example, to pass a string and array to a template is a Bash shell, use:

az deployment group create \
  --resource-group testgroup \
  --template-file demotemplate.json \
  --parameters exampleString='inline string' exampleArray='("value1", "value2")'

Если вы используете Azure CLI в командной строке Windows (CMD) или PowerShell, передайте массив в формате: exampleArray="['value1','value2']" .If you're using Azure CLI with Windows Command Prompt (CMD) or PowerShell, pass the array in the format: exampleArray="['value1','value2']".

Можно также получить содержимое файла и предоставлять его в виде встроенного параметра.You can also get the contents of file and provide that content as an inline parameter.

az deployment group create \
  --resource-group testgroup \
  --template-file demotemplate.json \
  --parameters exampleString=@stringContent.txt exampleArray=@arrayContent.json

Получение значения параметра из файла полезно в тех случаях, когда есть необходимость предоставить значения конфигурации.Getting a parameter value from a file is helpful when you need to provide configuration values. Например, вы можете предоставить значения cloud-init для виртуальной машины Linux.For example, you can provide cloud-init values for a Linux virtual machine.

Файл ArrayContent.json имеет следующий формат:The arrayContent.json format is:

[
    "value1",
    "value2"
]

Чтобы передать объект, например для установки тегов, используйте JSON.To pass in an object, for example, to set tags, use JSON. Например, шаблон может содержать параметр, подобный приведенному ниже:For example, your template might include a parameter like this one:

    "resourceTags": {
      "type": "object",
      "defaultValue": {
        "Cost Center": "IT Department"
      }
    }

В этом случае можно передать строку JSON, чтобы задать параметр, как показано в следующем скрипте Bash:In this case, you can pass in a JSON string to set the parameter as shown in the following Bash script:

tags='{"Owner":"Contoso","Cost Center":"2345-324"}'
az deployment group create --name addstorage  --resource-group myResourceGroup \
--template-file $templateFile \
--parameters resourceName=abcdef4556 resourceTags="$tags"

Используйте двойные кавычки вокруг JSON, который необходимо передать в объект.Use double quotes around the JSON that you want to pass into the object.

Файлы параметровParameter files

Вместо передачи параметров в виде встроенных значений в сценарии вам может быть проще использовать JSON-файл, содержащий значения параметров.Rather than passing parameters as inline values in your script, you may find it easier to use a JSON file that contains the parameter values. Файл параметров должен находиться в локальной среде.The parameter file must be a local file. Внешние файлы параметров не поддерживаются в Azure CLI.External parameter files aren't supported with Azure CLI.

Дополнительные сведения о файле параметров см. в статье Создание файла параметров Resource Manager.For more information about the parameter file, see Create Resource Manager parameter file.

Для передачи локального файла параметров используйте @, чтобы указать локальный файл с именем storage.parameters.json.To pass a local parameter file, use @ to specify a local file named storage.parameters.json.

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file storage.json \
  --parameters @storage.parameters.json

Обработку расширенного формата JSONHandle extended JSON format

Чтобы развернуть шаблон с многострочными строками или комментариями с помощью Azure CLI с версией 2.3.0 или более ранней, необходимо использовать --handle-extended-json-format параметр.To deploy a template with multi-line strings or comments using Azure CLI with version 2.3.0 or older, you must use the --handle-extended-json-format switch. Пример:For example:

{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2018-10-01",
  "name": "[variables('vmName')]", // to customize name, change it in variables
  "location": "[
    parameters('location')
    ]", //defaults to resource group location
  /*
    storage account and network interface
    must be deployed first
  */
  "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
  ],

Дальнейшие действияNext steps