Implementar recursos com modelos ARM e Azure PowerShellDeploy resources with ARM templates and Azure PowerShell

Este artigo explica como usar a Azure PowerShell com modelos de Gestor de Recursos Azure (modelos ARM) para implantar os seus recursos no Azure.This article explains how to use Azure PowerShell with Azure Resource Manager templates (ARM templates) to deploy your resources to Azure. Se não está familiarizado com os conceitos de implantação e gestão das suas soluções Azure, consulte a visão geral da implementação do modelo.If you aren't familiar with the concepts of deploying and managing your Azure solutions, see template deployment overview.

Âmbito de implantaçãoDeployment scope

Pode direcionar a sua implementação para um grupo de recursos, subscrição, grupo de gestão ou inquilino.You can target your deployment to a resource group, subscription, management group, or tenant. Na maioria dos casos, terás como alvo a implantação de um grupo de recursos.In most cases, you'll target deployment to a resource group. Para aplicar políticas e atribuições de papéis em um âmbito maior, use subscrição, grupo de gestão ou implantações de inquilinos.To apply policies and role assignments across a larger scope, use subscription, management group, or tenant deployments. Ao implementar uma subscrição, pode criar um grupo de recursos e implementar recursos para o mesmo.When deploying to a subscription, you can create a resource group and deploy resources to it.

Dependendo do alcance da implantação, utiliza-se diferentes comandos.Depending on the scope of the deployment, you use different commands.

Os exemplos deste artigo utilizam implementações de grupos de recursos.The examples in this article use resource group deployments.

Pré-requisitosPrerequisites

Precisa de um modelo para implementar.You need a template to deploy. Se ainda não tiver um, faça o download e guarde um modelo de exemplo do repo dos modelos Azure Quickstart.If you don't already have one, download and save an example template from the Azure Quickstart templates repo. O nome do ficheiro local utilizado neste artigo é c:\MyTemplates\azuredeploy.jsem.The local file name used in this article is c:\MyTemplates\azuredeploy.json.

A menos que utilize a Azure Cloud Shell para implementar modelos, precisa instalar a Azure PowerShell e ligar-se ao Azure:Unless you use the Azure Cloud Shell to deploy templates, you need to install Azure PowerShell and connect to Azure:

Implementar modelo localDeploy local template

O exemplo a seguir cria um grupo de recursos e implementa um modelo a partir da sua máquina local.The following example creates a resource group, and deploys a template from your local machine. O nome do grupo de recursos só pode incluir caracteres alfanuméricos, períodos, sublinhados, hífens e parênteses.The name of the resource group can only include alphanumeric characters, periods, underscores, hyphens, and parenthesis. Pode chegar a 90 caracteres.It can be up to 90 characters. Não pode acabar num período.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 -Name ExampleDeployment `
  -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json

A implementação pode demorar alguns minutos a concluir.The deployment can take a few minutes to complete.

Nome de implantaçãoDeployment name

No exemplo anterior, nomeou o ExampleDeployment destacamento.In the preceding example, you named the deployment ExampleDeployment. Se não fornecer um nome para a implementação, o nome do ficheiro de modelo é usado.If you don't provide a name for the deployment, the name of the template file is used. Por exemplo, se implementar um modelo nomeado azuredeploy.json e não especificar um nome de implantação, a implementação é nomeada azuredeploy .For example, if you deploy a template named azuredeploy.json and don't specify a deployment name, the deployment is named azuredeploy.

Sempre que executa uma implantação, uma entrada é adicionada ao histórico de implantação do grupo de recursos com o nome de implantação.Every time you run a deployment, an entry is added to the resource group's deployment history with the deployment name. Se executar outra implantação e lhe der o mesmo nome, a entrada anterior é substituída pela implementação atual.If you run another deployment and give it the same name, the earlier entry is replaced with the current deployment. Se pretender manter entradas únicas no histórico de implantação, dê a cada implementação um nome único.If you want to maintain unique entries in the deployment history, give each deployment a unique name.

Para criar um nome único, pode atribuir um número aleatório.To create a unique name, you can assign a random number.

$suffix = Get-Random -Maximum 1000
$deploymentName = "ExampleDeployment" + $suffix

Ou adicionar um valor de data.Or, add a date value.

$today=Get-Date -Format "MM-dd-yyyy"
$deploymentName="ExampleDeployment"+"$today"

Se executar implementações simultâneas para o mesmo grupo de recursos com o mesmo nome de implantação, apenas a última implementação é concluída.If you run concurrent deployments to the same resource group with the same deployment name, only the last deployment is completed. Quaisquer implementações com o mesmo nome que não tenham terminado são substituídas pela última implantação.Any deployments with the same name that haven't finished are replaced by the last deployment. Por exemplo, se executar uma implantação com o nome newStorage de uma conta de armazenamento chamada , e ao mesmo tempo executar outra storage1 implantação com o nome de uma newStorage conta de armazenamento chamada , implementa storage2 apenas uma conta de armazenamento.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. A conta de armazenamento resultante é storage2 nomeada.The resulting storage account is named storage2.

No entanto, se executar uma implantação com o nome newStorage de uma conta de armazenamento chamada , e imediatamente após a sua storage1 conclusão, executar outra implantação com o nome newStorage de uma conta de armazenamento chamada , storage2 então tem duas contas de armazenamento.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. Um tem o nome storage1 , e o outro chama-se storage2 .One is named storage1, and the other is named storage2. Mas só tens uma entrada na história da implantação.But, you only have one entry in the deployment history.

Quando especificar um nome único para cada implantação, pode executá-los simultaneamente sem conflitos.When you specify a unique name for each deployment, you can run them concurrently without conflict. Se executar uma implantação com o nome newStorage1 de uma conta de armazenamento chamada , e ao mesmo tempo executar outra storage1 implantação com o nome de uma newStorage2 conta de armazenamento , storage2 então tem duas contas de armazenamento e duas entradas no histórico de implantação.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.

Para evitar conflitos com implementações simultâneas e para garantir entradas únicas no histórico de implantação, dê a cada implementação um nome único.To avoid conflicts with concurrent deployments and to ensure unique entries in the deployment history, give each deployment a unique name.

Implementar o modelo remotoDeploy remote template

Em vez de armazenar modelos ARM na sua máquina local, pode preferir guardá-los num local externo.Instead of storing ARM templates on your local machine, you may prefer to store them in an external location. Pode armazenar modelos num repositório de controlo de origem (como o GitHub).You can store templates in a source control repository (such as GitHub). Ou pode armazená-los numa conta de armazenamento Azure para acesso partilhado na sua organização.Or, you can store them in an Azure storage account for shared access in your organization.

Para implementar um modelo externo, utilize o parâmetro TemplateUri.To deploy an external template, use the TemplateUri parameter. Utilize o URI no exemplo para implementar o modelo de amostra do 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

O exemplo anterior requer um URI acessível ao público para o modelo, que funciona para a maioria dos cenários porque o seu modelo não deve incluir dados sensíveis.The preceding example requires a publicly accessible URI for the template, which works for most scenarios because your template shouldn't include sensitive data. Se precisar de especificar dados sensíveis (como uma palavra-passe de administração), passe esse valor como parâmetro seguro.If you need to specify sensitive data (like an admin password), pass that value as a secure parameter. No entanto, se não quiser que o seu modelo seja acessível ao público, pode protegê-lo armazenando-o num recipiente de armazenamento privado.However, if you don't want your template to be publicly accessible, you can protect it by storing it in a private storage container. Para obter informações sobre a implementação de um modelo que requer um token de assinatura de acesso partilhado (SAS), consulte implementar o modelo privado com o token SAS.For information about deploying a template that requires a shared access signature (SAS) token, see Deploy private template with SAS token. Para passar por um tutorial, consulte Tutorial: Integre o Cofre da Chave Azul na implementação do modelo ARM.To go through a tutorial, see Tutorial: Integrate Azure Key Vault in ARM template deployment.

Implementar especificação de modeloDeploy template spec

Em vez de implementar um modelo local ou remoto, pode criar uma especificação de modelo. A especificação do modelo é um recurso na sua subscrição Azure que contém um modelo 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. Torna-se fácil partilhar o modelo de forma segura com os utilizadores da sua organização.It makes it easy to securely share the template with users in your organization. Você usa o controlo de acesso baseado em funções Azure (Azure RBAC) para conceder acesso à especificação do modelo. Esta funcionalidade encontra-se atualmente em pré-visualização.You use Azure role-based access control (Azure RBAC) to grant access to the template spec. This feature is currently in preview.

Os exemplos a seguir mostram como criar e implementar uma especificação de modelo. Estes comandos só estão disponíveis se se ter inscrito para a pré-visualização.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.

Em primeiro lugar, cria-se a especificação do modelo fornecendo o modelo ARM.First, you create the template spec by providing the ARM template.

New-AzTemplateSpec -Name storageSpec -Version 1.0 -ResourceGroupName templateSpecsRg -Location westus2 -TemplateJsonFile ./mainTemplate.json

Em seguida, obtém-se o ID para especificação de modelo e implemente-o.Then, you get the ID for template spec and deploy it.

$id = (Get-AzTemplateSpec -Name storageSpec -ResourceGroupName templateSpecsRg -Version 1.0).Version.Id

New-AzResourceGroupDeployment `
  -ResourceGroupName demoRG `
  -TemplateSpecId $id

Para obter mais informações, consulte as especificações do modelo do Gestor de Recursos Azure (Preview).For more information, see Azure Resource Manager template specs (Preview).

Pré-visualizar alteraçõesPreview changes

Antes de implementar o seu modelo, pode visualizar as alterações que o modelo irá fazer para o seu ambiente.Before deploying your template, you can preview the changes the template will make to your environment. Utilize a operação "e se" para verificar se o modelo faz as alterações que espera.Use the what-if operation to verify that the template makes the changes that you expect. E se também valida o modelo para erros.What-if also validates the template for errors.

Implantação a partir de Azure Cloud ShellDeploy from Azure Cloud Shell

Pode utilizar a Azure Cloud Shell para implementar o seu modelo.You can use the Azure Cloud Shell to deploy your template. Para implementar um modelo externo, forneça o URI do modelo.To deploy an external template, provide the URI of the template. Para implementar um modelo local, você deve primeiro carregar o seu modelo na conta de armazenamento para a sua Cloud Shell.To deploy a local template, you must first load your template into the storage account for your Cloud Shell. Para enviar ficheiros para a concha, selecione o ícone do menu de ficheiros upload/download a partir da janela do invólucro.To upload files to the shell, select the Upload/Download files menu icon from the shell window.

Para abrir a Cloud Shell, navegue https://shell.azure.com para, ou selecione Try-It a partir da seguinte secção de código: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

Para colar o código na casca, clique com o botão direito dentro da concha e, em seguida, selecione Pasta.To paste the code into the shell, right-click inside the shell and then select Paste.

Valores de parâmetros de passagemPass parameter values

Para passar valores de parâmetros, pode utilizar parâmetros inline ou um ficheiro de parâmetros.To pass parameter values, you can use either inline parameters or a parameter file.

Parâmetros inlineInline parameters

Para passar parâmetros inline, forneça os nomes do parâmetro com o New-AzResourceGroupDeployment comando.To pass inline parameters, provide the names of the parameter with the New-AzResourceGroupDeployment command. Por exemplo, para passar uma corda e matriz para um modelo, use: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

Também pode obter o conteúdo do ficheiro e fornecer esse conteúdo como um parâmetro inline.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

Obter um valor de parâmetro de um ficheiro é útil quando é necessário fornecer valores de configuração.Getting a parameter value from a file is helpful when you need to provide configuration values. Por exemplo, pode fornecer valores de ineção de nuvem para uma máquina virtual Linux.For example, you can provide cloud-init values for a Linux virtual machine.

Se precisar de passar numa série de objetos, crie hash tables no PowerShell e adicione-os a uma matriz.If you need to pass in an array of objects, create hash tables in PowerShell and add them to an array. Passe a matriz como parâmetro durante a implantação.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

Ficheiros de parâmetrosParameter files

Em vez de passar parâmetros como valores inline no seu script, pode ser mais fácil usar um ficheiro JSON que contenha os valores dos parâmetros.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. O ficheiro de parâmetros pode ser um ficheiro local ou um ficheiro externo com um URI acessível.The parameter file can be a local file or an external file with an accessible URI.

Para obter mais informações sobre o ficheiro parâmetro, consulte o ficheiro de parâmetros Do Gestor de Recursos.For more information about the parameter file, see Create Resource Manager parameter file.

Para passar um ficheiro de parâmetro local, utilize o parâmetro ModeloParameterFile: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

Para passar um ficheiro de parâmetro externo, utilize o parâmetro ModeloParameterUri: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

Passos seguintesNext steps