Развертывание ресурсов с использованием шаблонов Resource Manager и Azure PowerShellDeploy resources with Resource Manager templates and Azure PowerShell

Узнайте, как использовать Azure PowerShell с шаблонами Resource Manager для развертывания ресурсов в Azure.Learn how to use Azure PowerShell with Resource Manager templates to deploy your resources to Azure. См. дополнительные сведения о развертывании решений Azure и управлении ими в обзоре Azure Resource Manager.For more information about the concepts of deploying and managing your Azure solutions, see Azure Resource Manager overview.

Примечание

Эта статья была изменена и теперь содержит сведения о новом модуле Az для Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Вы по-прежнему можете использовать модуль AzureRM, исправления ошибок для которого будут продолжать выпускаться как минимум до декабря 2020 г.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Дополнительные сведения о совместимости модуля Az с AzureRM см. в статье Introducing the new Azure PowerShell Az module (Знакомство с новым модулем Az для Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Инструкции по установке модуля Az см. в статье об установке Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

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

Можно создавать решения развертывания для подписки Azure или группу ресурсов в подписке.You can target your deployment to either an Azure subscription or a resource group within a subscription. В большинстве случаев его ориентации на развертывание в группе ресурсов.In most cases, you'll target deployment to a resource group. Используйте развертывания подписки для применения политик и назначения ролей для подписки.Use subscription deployments to apply policies and role assignments across the subscription. Развертывания подписки также использовать для создания группы ресурсов и развернуть в ней ресурсы.You also use subscription deployments to create a resource group and deploy resources to it. В зависимости от области развертывания использовать другие команды.Depending on the scope of the deployment, you use different commands.

Для развертывания на группы ресурсов, использовать New AzResourceGroupDeployment:To deploy to a resource group, use New-AzResourceGroupDeployment:

New-AzResourceGroupDeployment -ResourceGroupName <resource-group-name> -TemplateFile <path-to-template>

Для развертывания на подписки, использовать New AzDeployment:To deploy to a subscription, use New-AzDeployment:

New-AzDeployment -Location <location> -TemplateFile <path-to-template>

В настоящее время развертывания группы управления, поддерживаются только через REST API.Currently, management group deployments are only supported through the REST API. См. в разделе развертывание ресурсов с использованием шаблонов Resource Manager и REST API Resource Manager.See Deploy resources with Resource Manager templates and Resource Manager REST API.

В примерах в этой статье используется развертываний групп ресурсов.The examples in this article use resource group deployments. Дополнительные сведения о развертываниях подписки см. в разделе создания группы ресурсов и ресурсов на уровне подписки.For more information about subscription deployments, see Create resource groups and resources at the subscription level.

Технические условияPrerequisites

Требуется шаблон для развертывания.You need a template to deploy. Если вы еще не, скачайте и сохраните пример шаблона из репозитория шаблонов быстрого запуска Azure.If you don't already have one, download and save an example template from the Azure Quickstart templates repo. В этой статье используется локальный файл с именем c:\MyTemplates\azuredeploy.json.The local file name used in this article is c:\MyTemplates\azuredeploy.json.

Если вы не используете Azure Cloud shell можно развертывать шаблоны, вам потребуется установить Azure PowerShell и подключитесь к Azure.Unless you use the Azure Cloud shell to deploy templates, you need to install Azure PowerShell and connect to Azure:

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

Следующий пример создает группу ресурсов и развертывает шаблон с локального компьютера.The following example creates a resource group, and deploys a template from your local machine. Имя группы ресурсов может содержать только буквы, цифры, точки, знаки подчеркивания, дефисы и скобки.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.

$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json

Развертывание может занять несколько минут.The deployment can take a few minutes to complete.

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

Шаблоны Resource Manager можно хранить не на локальном компьютере, а на внешнем источнике.Instead of storing Resource Manager 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.

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

$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$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-quickstart-templates/master/101-storage-account-create/azuredeploy.json

В предыдущем примере для шаблона требуется общедоступный код 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. Изучите статью Руководство. Интеграция с Azure Key Vault при развертывании шаблона Resource Manager.To go through a tutorial, see Tutorial: Integrate Azure Key Vault in Resource Manager Template deployment.

Развертывание из Azure Cloud shellDeploy from Azure Cloud shell

Для развертывания шаблона можно использовать Azure Cloud Shell.You can use the Azure Cloud Shell to deploy your template. Чтобы развернуть внешний шаблон, укажите URI шаблона.To deploy an external template, provide the URI of the template. Чтобы развернуть локальный шаблон, сначала необходимо загрузить шаблон для Cloud Shell в учетную запись хранения.To deploy a local template, you must first load your template into the storage account for your Cloud Shell. Чтобы отправить файлы в Cloud Shell, щелкните значок Upload/Download files (Отправить/скачать файлы) в окне Cloud Shell.To upload files to the shell, select the Upload/Download files menu icon from the shell window.

Чтобы открыть Cloud Shell, перейдите по ссылке https://shell.azure.com или выберите Try It (Пробная версия) в следующем окне с кодом:To open the Cloud shell, browse to https://shell.azure.com, or select Try-It from the following code section:

$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$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-quickstart-templates/master/101-storage-account-create/azuredeploy.json

Чтобы вставить код в Cloud Shell, щелкните правой кнопкой мыши внутри окна, а затем выберите Paste (Вставить).To paste the code into the shell, right-click inside the shell and then select Paste.

Повторное развертывание при сбое развертыванияRedeploy when deployment fails

Эта функция также называется отката в случае ошибки.This feature is also known as Rollback on error. Если развертывание завершается ошибкой, вы можете автоматически повторно развернуть ресурс, успешно развернутый ранее, из журнала развертывания.When a deployment fails, you can automatically redeploy an earlier, successful deployment from your deployment history. Чтобы запустить повторное развертывание, используйте параметр -RollbackToLastDeployment или -RollBackDeploymentName в команде развертывания.To specify redeployment, use either the -RollbackToLastDeployment or -RollBackDeploymentName parameter in the deployment command. Эта функция удобна, если у нас есть известного рабочего состояния для развертывания инфраструктуры и хотите вернуться к этому состоянию.This functionality is useful if you've got a known good state for your infrastructure deployment and want to revert to this state. Существует несколько предостережений, а также ограничения:There are a number of caveats and restrictions:

  • Повторное развертывание выполняется так же, как она была запущена ранее, с теми же параметрами.The redeployment is run exactly as it was run previously with the same parameters. Невозможно изменить параметры.You can't change the parameters.
  • Предыдущее развертывание выполняется с использованием полный режим.The previous deployment is run using the complete mode. Будут удалены все ресурсы, не включены в предыдущем развертывании, а все конфигурации ресурсов задаются к предыдущим значениям.Any resources not included in the previous deployment are deleted, and any resource configurations are set to their previous state. Убедитесь, что вы полностью понимаете режимов развертывания.Make sure you fully understand the deployment modes.
  • Повторное развертывание влияет только на ресурсы, не затрагиваются все изменения данных.The redeployment only affects the resources, any data changes aren't affected.
  • Эта функция поддерживается только на развертывания группы ресурсов, подписки уровня развертывания.This feature is only supported on Resource Group deployments, not subscription level deployments. Дополнительные сведения о развертывании уровня подписки, см. в разделе создания группы ресурсов и ресурсов на уровне подписки.For more information about subscription level deployment, see Create resource groups and resources at the subscription level.

Для этого развертывания должны иметь уникальные имена, чтобы их можно было идентифицировать в журнале.To use this option, your deployments must have unique names so they can be identified in the history. Если у вас нет уникальных имен, текущее неудачное развертывание может перезаписать более раннее успешное развертывание, зафиксированное в журнале.If you don't have unique names, the current failed deployment might overwrite the previously successful deployment in the history. Этот параметр можно использовать только с развертываниями корневого уровня.You can only use this option with root level deployments. Повторное развертывание из вложенных шаблонов не поддерживается.Deployments from a nested template aren't available for redeployment.

Чтобы выполнить повторно последнее успешное развертывание, добавьте параметр -RollbackToLastDeployment в качестве флага.To redeploy the last successful deployment, add the -RollbackToLastDeployment parameter as a flag.

New-AzResourceGroupDeployment -Name ExampleDeployment02 `
  -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json `
  -RollbackToLastDeployment

Чтобы выполнить повторно конкретное развертывание, используйте параметр -RollBackDeploymentName и укажите имя развертывания.To redeploy a specific deployment, use the -RollBackDeploymentName parameter and provide the name of the deployment.

New-AzResourceGroupDeployment -Name ExampleDeployment02 `
  -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json `
  -RollBackDeploymentName ExampleDeployment01

Указанное развертывание должно быть успешным.The specified deployment must have succeeded.

Передача значений параметровPass parameter values

Чтобы передать значения параметров, можно использовать встроенные параметры или файл параметров.To pass parameter values, you can use either inline parameters or a parameter file. В предыдущих примерах в этой статье используются встроенные параметры.The preceding examples in this article show inline parameters.

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

Чтобы передать встроенные параметры, укажите название параметра с помощью команды New-AzResourceGroupDeployment.To pass inline parameters, provide the names of the parameter with the New-AzResourceGroupDeployment command. Например, строки и массив передаются в шаблон следующим образом.For example, to pass a string and array to a template, use:

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\demotemplate.json `
  -exampleString "inline string" `
  -exampleArray $arrayParam

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

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\demotemplate.json `
  -exampleString $(Get-Content -Path c:\MyTemplates\stringcontent.txt -Raw) `
  -exampleArray $arrayParam

Получение значения параметра из файла полезно в тех случаях, когда есть необходимость предоставить значения конфигурации.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.

Если необходимо передать в массив объектов, создайте хэш-таблицы в PowerShell и добавить их в массив.If you need to pass in an array of objects, create hash tables in PowerShell and add them to an array. Передайте этот массив в качестве параметра во время развертывания.Pass that array as a parameter during deployment.

$hash1 = @{ Name = "firstSubnet"; AddressPrefix = "10.0.0.0/24"}
$hash2 = @{ Name = "secondSubnet"; AddressPrefix = "10.0.1.0/24"}
$subnetArray = $hash1, $hash2
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\demotemplate.json `
  -exampleArray $subnetArray

Файлы параметров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. Файл параметров может быть локальным или храниться во внешнем расположении с доступным адресом URI.The parameter file can be a local file or an external file with an accessible URI.

Файл параметров должен быть в указанном ниже формате.The parameter file must be in the following format:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
     "storageAccountType": {
         "value": "Standard_GRS"
     }
  }
}

Обратите внимание, что раздел parameters содержит имя параметра, которое совпадает с параметром, определенным в шаблоне (storageAccountType).Notice that the parameters section includes a parameter name that matches the parameter defined in your template (storageAccountType). Файл параметров содержит значение для параметра.The parameter file contains a value for the parameter. Во время развертывания это значение автоматически передается в шаблон.This value is automatically passed to the template during deployment. Вы можете создать несколько файлов параметров и передавать нужный файл параметров в зависимости от конкретной ситуации.You can create more than one parameter file, and then pass in the appropriate parameter file for the scenario.

Скопируйте предыдущий пример и сохраните его как файл с именем storage.parameters.json.Copy the preceding example and save it as a file named storage.parameters.json.

Чтобы передать локальный файл параметров, используйте параметр TemplateParameterFile:To pass a local parameter file, use the TemplateParameterFile parameter:

New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\azuredeploy.json `
  -TemplateParameterFile c:\MyTemplates\storage.parameters.json

Чтобы передать внешний файл параметров, используйте параметр TemplateParameterUri:To pass an external parameter file, use the TemplateParameterUri parameter:

New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json `
  -TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.parameters.json

Приоритет параметровParameter precedence

Вы можете использовать в ходе одной операции развертывания как встроенные параметры, так и локальный файл параметров.You can use inline parameters and a local parameter file in the same deployment operation. Например, часть значений можно указать в локальном файле параметров, а другую часть — в команде развертывания.For example, you can specify some values in the local parameter file and add other values inline during deployment. Если значения для одного параметра указаны одновременно и в локальном файле параметров, и в командной строке, более высокий приоритет имеет значение из командной строки.If you provide values for a parameter in both the local parameter file and inline, the inline value takes precedence.

Тем не менее при использовании внешнего файла параметров нельзя передавать другие значения в командной строке или локальном файле.However, when you use an external parameter file, you can't pass other values either inline or from a local file. Если в параметре TemplateParameterUri указан файл параметров, все параметры командной строки игнорируются.When you specify a parameter file in the TemplateParameterUri parameter, all inline parameters are ignored. Все значения параметров следует указать во внешнем файле.Provide all parameter values in the external file. Если в шаблоне используется конфиденциальное значение, которое нельзя включать в файл параметров, то его можно передать в хранилище ключей. Кроме того, можно динамически указать значения всех параметров в командной строке.If your template includes a sensitive value that you can't include in the parameter file, either add that value to a key vault, or dynamically provide all parameter values inline.

Конфликты параметровParameter name conflicts

Если шаблон содержит параметр, имя которого совпадает с именем одного из параметров в команде PowerShell, параметр из шаблон отображается с постфиксом FromTemplate.If your template includes a parameter with the same name as one of the parameters in the PowerShell command, PowerShell presents the parameter from your template with the postfix FromTemplate. Предположим, что параметр ResourceGroupName в шаблоне конфликтует с параметром ResourceGroupName в командлете New-AzResourceGroupDeployment.For example, a parameter named ResourceGroupName in your template conflicts with the ResourceGroupName parameter in the New-AzResourceGroupDeployment cmdlet. Будет предложено указать значение для параметра ResourceGroupNameFromTemplate.You're prompted to provide a value for ResourceGroupNameFromTemplate. В общем случае следует избегать этой путаницы, не присваивая параметрам имена параметров, используемых для операций развертывания.In general, you should avoid this confusion by not naming parameters with the same name as parameters used for deployment operations.

Проверка развертывания шаблоновTest template deployments

Чтобы проверить шаблон и значения параметров без фактического развертывания ресурсов, используйте Test-AzureRmResourceGroupDeployment.To test your template and parameter values without actually deploying any resources, use Test-AzureRmResourceGroupDeployment.

Test-AzResourceGroupDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\azuredeploy.json -storageAccountType Standard_GRS

Если ошибок не обнаружено, то команда завершается без ответа.If no errors are detected, the command finishes without a response. Если обнаруживается ошибка, то команда возвращает сообщение об ошибке.If an error is detected, the command returns an error message. Например, попытка передать недопустимое значение для номера SKU учетной записи возвращает следующую ошибку:For example, passing an incorrect value for the storage account SKU, returns the following error:

Test-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\azuredeploy.json -storageAccountType badSku

Code    : InvalidTemplate
Message : Deployment template validation failed: 'The provided value 'badSku' for the template parameter 'storageAccountType'
          at line '15' and column '24' is not valid. The parameter value is not part of the allowed value(s):
          'Standard_LRS,Standard_ZRS,Standard_GRS,Standard_RAGRS,Premium_LRS'.'.
Details :

Если шаблон содержит синтаксическую ошибку, команда возвращает сообщение об ошибке, указывающее, что ей не удалось проанализировать шаблон.If your template has a syntax error, the command returns an error indicating it couldn't parse the template. В сообщении указывается номер строки и позиция ошибки синтаксического анализа.The message indicates the line number and position of the parsing error.

Test-AzResourceGroupDeployment : After parsing a value an unexpected character was encountered: 
  ". Path 'variables', line 31, position 3.

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