Implementar recursos com modelos ARM e Azure CLIDeploy resources with ARM templates and Azure CLI

Este artigo explica como usar o Azure CLI com modelos de Gestor de Recursos Azure (modelos ARM) para implantar os seus recursos no Azure.This article explains how to use Azure CLI 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.

Os comandos de implantação foram alterados na versão 2.2.0 do Azure CLI.The deployment commands changed in Azure CLI version 2.2.0. Os exemplos deste artigo requerem a versão 2.2.0 ou posterior do Azure CLI.The examples in this article require Azure CLI version 2.2.0 or later.

Para executar esta amostra, instale a versão mais recente do Azure CLI.To run this sample, install the latest version of the Azure CLI. Para começar, execute az login para criar uma ligação ao Azure.To start, run az login to create a connection with Azure.

As amostras para o CLI Azure são escritas para a bash concha.Samples for the Azure CLI are written for the bash shell. Para executar esta amostra no Windows PowerShell ou no Comando, poderá ter de alterar elementos do script.To run this sample in Windows PowerShell or Command Prompt, you may need to change elements of the script.

Se não tiver o Azure CLI instalado, pode utilizar o Cloud Shell.If you don't have Azure CLI installed, you can use the Cloud Shell.

Â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.

Implementar modelo localDeploy local template

Ao mobilizar recursos para Azure, você:When deploying resources to Azure, you:

  1. Inicie sessão na sua conta do AzureSign in to your Azure account
  2. Criar um grupo de recursos que sirva de recipiente para os recursos implantados.Create a resource group that serves as the container for the deployed resources. 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.
  3. Implemente para o grupo de recursos o modelo que define os recursos para criar.Deploy to the resource group the template that defines the resources to create.

Um modelo pode incluir parâmetros que lhe permitem personalizar a implementação.A template can include parameters that enable you to customize the deployment. Por exemplo, pode fornecer valores adaptados para um ambiente específico (como dev, teste e produção).For example, you can provide values that are tailored for a particular environment (such as dev, test, and production). O modelo de amostra define um parâmetro para a conta de armazenamento SKU.The sample template defines a parameter for the storage account SKU.

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:

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

A implementação pode demorar alguns minutos a concluir.The deployment can take a few minutes to complete. Quando terminar, vê-se uma mensagem que inclui o resultado:When it finishes, you see a message that includes the result:

"provisioningState": "Succeeded",

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.

deploymentName='ExampleDeployment'$RANDOM

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

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

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 modelo-uri.To deploy an external template, use the template-uri 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.

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

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.

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.

az ts create \
  --name storageSpec \
  --version "1.0" \
  --resource-group templateSpecRG \
  --location "westus2" \
  --template-file "./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 = $(az ts show --name storageSpec --resource-group templateSpecRG --version "1.0" --query "id")

az deployment group create \
  --resource-group demoRG \
  --template-spec $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.

Implementar o modelo a partir do Cloud ShellDeploy template from Cloud Shell

Pode utilizar o Cloud Shell para implementar o modelo.You can use Cloud Shell to deploy your template. Para implementar um modelo externo, forneça o URI do modelo exatamente como faria para qualquer implementação externa.To deploy an external template, provide the URI of the template exactly as you would for any external deployment. 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. Esta secção descreve como carregar o modelo na sua conta de concha de nuvem e implantá-lo como um ficheiro local.This section describes how to load the template to your cloud shell account, and deploy it as a local file. Se não usou a Cloud Shell, consulte a visão geral da Azure Cloud Shell para obter informações sobre a sua configuração.If you haven't used Cloud Shell, see Overview of Azure Cloud Shell for information about setting it up.

  1. Inicie sessão no portal do Azure.Sign in to the Azure portal.

  2. Selecione o grupo de recursos do Cloud Shell.Select your Cloud Shell resource group. O padrão de nome é cloud-shell-storage-<region>.The name pattern is cloud-shell-storage-<region>.

    Selecionar o grupo de recursos

  3. Selecione a conta de armazenamento para o Cloud Shell.Select the storage account for your Cloud Shell.

    Selecionar a conta de armazenamento

  4. Selecione Blobs.Select Blobs.

    Selecionar blobs

  5. Selecionar + Contentor.Select + Container.

    Adicionar contentor

  6. Dê ao seu recipiente um nome e um nível de acesso.Give your container a name and an access level. O modelo de amostra deste artigo não contém nenhuma informação sensível, por isso permita o acesso de leitura anónima.The sample template in this article contains no sensitive information, so allow anonymous read access. Selecione OK.Select OK.

    Fornecer valores de contentores

  7. Selecione o contentor que criou.Select the container you created.

    Selecione novo recipiente

  8. Selecione Carregar.Select Upload.

    Bolha de upload

  9. Localize e carregue o modelo.Find and upload your template.

    Carregar o ficheiro

  10. Depois de ter sido carregado, selecione o modelo.After it has uploaded, select the template.

    Selecione novo modelo

  11. Copie o URL.Copy the URL.

    Copiar URL

  12. Abra o prompt.Open the prompt.

    Abrir o Cloud Shell

Na Cloud Shell, utilize os seguintes comandos: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

ParâmetrosParameters

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 valores em parameters .To pass inline parameters, provide the values in parameters. Por exemplo, para passar uma corda e matriz para um modelo é uma concha bash, use: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")'

Se estiver a utilizar o Azure CLI com o Windows Command Prompt (CMD) ou o PowerShell, passe a matriz no formato: 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']".

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.

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

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.

A arrayContent.jsno formato é:The arrayContent.json format is:

[
    "value1",
    "value2"
]

Para passar num objeto, por exemplo, para definir tags, use JSON.To pass in an object, for example, to set tags, use JSON. Por exemplo, o seu modelo pode incluir um parâmetro como este:For example, your template might include a parameter like this one:

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

Neste caso, pode passar numa cadeia JSON para definir o parâmetro como mostrado no seguinte script 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"

Use citações duplas em torno do JSON que pretende passar para o objeto.Use double quotes around the JSON that you want to pass into the object.

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 do parâmetro deve ser um ficheiro local.The parameter file must be a local file. Os ficheiros de parâmetros externos não são suportados com O Azure CLI.External parameter files aren't supported with Azure CLI.

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, use @ para especificar um ficheiro local chamado storage.parameters.jsligado.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

Lidar com o formato JSON estendidoHandle extended JSON format

Para implementar um modelo com cordas ou comentários multi-linhas utilizando o Azure CLI com a versão 2.3.0 ou mais antiga, tem de utilizar o --handle-extended-json-format interruptor.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. Por exemplo: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'))]"
  ],

Passos seguintesNext steps