Usar scripts de implantação em modelos ARM

Saiba como usar scripts de implantação em modelos do Azure Resource Manager (ARM). Com o recurso, os usuários podem executar scripts em implantações ARM e revisar os resultados da deploymentScripts execução.

Gorjeta

Recomendamos o Bicep porque ele oferece os mesmos recursos que os modelos ARM e a sintaxe é mais fácil de usar. Para saber mais, consulte Script de implantação.

Esses scripts podem ser usados para executar etapas personalizadas, como:

  • Adicione usuários a um diretório.
  • Execute operações de plano de dados, por exemplo, copiar blobs ou banco de dados de propagação.
  • Procure e valide uma chave de licença.
  • Crie um certificado autoassinado.
  • Crie um objeto no Microsoft Entra ID.
  • Procure blocos de endereços IP do sistema personalizado.

Os benefícios do script de implantação:

  • Fácil de codificar, usar e depurar. Você pode desenvolver scripts de implantação em seus ambientes de desenvolvimento favoritos. Os scripts podem ser incorporados em modelos ou em arquivos de script externos.
  • Você pode especificar a linguagem de script e a plataforma. Atualmente, há suporte para scripts de implantação do Azure PowerShell e da CLI do Azure no ambiente Linux.
  • Permitir a passagem de argumentos de linha de comando para o script.
  • Pode especificar saídas de script e passá-las de volta para a implantação.

O recurso de script de implantação só está disponível nas regiões onde a Instância de Contêiner do Azure está disponível. Consulte Disponibilidade de recursos para instâncias de contêiner do Azure em regiões do Azure. Atualmente, o script de implantação usa apenas redes públicas.

Importante

O serviço de script de implantação requer dois recursos de suporte para execução de scripts e solução de problemas: uma conta de armazenamento e uma instância de contêiner. Você pode especificar uma conta de armazenamento existente, caso contrário, o serviço de script criará uma para você. Os dois recursos de suporte criados automaticamente geralmente são excluídos pelo serviço de script quando a execução do script de implantação fica em um estado terminal. Você será cobrado pelos recursos de suporte até que eles sejam excluídos. Para obter informações sobre preços, consulte Preços de instâncias de contêiner e Preços do Armazenamento do Azure. Para saber mais, consulte Recursos de script de implantação de limpeza.

Nota

A lógica de repetição para o início de sessão do Azure está agora incorporada no script de wrapper. Se você conceder permissões no mesmo modelo que seus scripts de implantação, o serviço de script de implantação tentará entrar novamente por 10 minutos com intervalo de 10 segundos até que a atribuição de função de identidade gerenciada seja replicada.

Recursos de formação

Se preferir saber mais sobre scripts de implantação por meio de orientações passo a passo, consulte Estender modelos ARM usando scripts de implantação.

Configurar as permissões mínimas

Para a API de script de implantação versão 2020-10-01 ou posterior, há duas entidades envolvidas na execução do script de implantação:

  • Entidade de implantação (a entidade usada para implantar o modelo): essa entidade é usada para criar recursos subjacentes necessários para a execução do recurso de script de implantação — uma conta de armazenamento e uma instância de contêiner do Azure. Para configurar as permissões de privilégios mínimos, atribua uma função personalizada com as seguintes propriedades à entidade de implantação:

    {
      "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]"
      ]
    }
    

    Se o Armazenamento do Azure e os provedores de recursos da Instância de Contêiner do Azure não tiverem sido registrados, você também precisará adicionar Microsoft.Storage/register/action e Microsoft.ContainerInstance/register/action.

  • Principal do script de implantação: essa entidade só é necessária se o script de implantação precisar se autenticar no Azure e chamar a CLI/PowerShell do Azure. Há duas maneiras de especificar a entidade de script de implantação:

    • Especifique uma identidade gerenciada atribuída pelo usuário na identity propriedade (consulte Modelos de exemplo). Quando especificado, o serviço de script chama Connect-AzAccount -Identity antes de invocar o script de implantação. A identidade gerenciada deve ter o acesso necessário para concluir a operação no script. Atualmente, apenas a identidade gerenciada atribuída pelo usuário é suportada para a identity propriedade. Para iniciar sessão com uma identidade diferente, utilize o segundo método nesta lista.
    • Passe as credenciais da entidade de serviço como variáveis de ambiente seguro e, em seguida, pode chamar Connect-AzAccount ou az login no script de implantação.

    Se uma identidade gerenciada for usada, a entidade de implantação precisará da função Operador de Identidade Gerenciada (uma função interna) atribuída ao recurso de identidade gerenciada.

Modelos de exemplo

O JSON a seguir é um exemplo. Para obter mais informações, consulte o esquema de modelo mais recente.

{
  "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"
  }
}

Nota

O exemplo é para fins de demonstração. As propriedades scriptContent e primaryScriptUri não podem coexistir em um modelo.

Nota

O scriptContent mostra um script com várias linhas. O portal do Azure e o pipeline do Azure DevOps não podem analisar um script de implantação com várias linhas. Você pode encadear os comandos do PowerShell (usando ponto-e-vírgula ou \r\n ou \n) em uma linha ou usar a primaryScriptUri propriedade com um arquivo de script externo. Há muitas ferramentas gratuitas de escape/unescape de cadeia JSON disponíveis. Por exemplo, https://www.freeformatter.com/json-escape.html.

Detalhes do valor da propriedade:

  • identity: Para a API do script de implantação versão 2020-10-01 ou posterior, uma identidade gerenciada atribuída pelo usuário é opcional, a menos que você precise executar quaisquer ações específicas do Azure no script. Para a versão da API 2019-10-01-preview, uma identidade gerenciada é necessária, pois o serviço de script de implantação a usa para executar os scripts. Quando a propriedade identity é especificada, o serviço de script chama Connect-AzAccount -Identity antes de invocar o script do usuário. Atualmente, apenas a identidade gerenciada atribuída pelo usuário é suportada. Para fazer login com uma identidade diferente, você pode chamar Connect-AzAccount no script.

  • tags: Tags de script de implantação. Se o serviço de script de implantação gerar uma conta de armazenamento e uma instância de contêiner, as tags serão passadas para ambos os recursos, que podem ser usados para identificá-los. Outra maneira de identificar esses recursos é através de seus sufixos, que contêm "azscripts". Para obter mais informações, consulte Monitorar e solucionar problemas de scripts de implantação.

  • kind: Especifique o tipo de script. Atualmente, há suporte para scripts do Azure PowerShell e da CLI do Azure. Os valores são AzurePowerShell e AzureCLI.

  • forceUpdateTag: Alterar esse valor entre implantações de modelo força o script de implantação a ser executado novamente. Se você usar as funções ou , newGuid()utcNow() ambas as funções só poderão ser usadas no valor padrão de um parâmetro. Para saber mais, consulte Executar script mais de uma vez.

  • containerSettings: especifique as configurações para personalizar a Instância de Contêiner do Azure. O script de implantação requer uma nova Instância de Contêiner do Azure. Não é possível especificar uma Instância de Contêiner do Azure existente. No entanto, você pode personalizar o nome do grupo de contêineres usando containerGroupName. Se não for especificado, o nome do grupo será gerado automaticamente.

  • storageAccountSettings: Especifique as configurações para usar uma conta de armazenamento existente. Se storageAccountName não for especificado, uma conta de armazenamento será criada automaticamente. Consulte Usar uma conta de armazenamento existente.

  • azPowerShellVersion/azCliVersion: Especifique a versão do módulo a ser usada. Consulte uma lista de versões suportadas do Azure PowerShell. A versão determina qual imagem de contêiner usar:

    • Az versão maior ou igual a 9 usa Ubuntu 22.04.
    • Az versão maior ou igual a 6, mas menos de 9 usa o Ubuntu 20.04.
    • Az versão menos de 6 usa Ubuntu 18.04.

    Importante

    É aconselhável atualizar para a versão mais recente do Ubuntu, pois o Ubuntu 18.04 está chegando ao fim de sua vida útil e não receberá mais atualizações de segurança após 31 de maio de 2023.

    Consulte uma lista de versões suportadas da CLI do Azure.

    Importante

    O script de implantação usa as imagens de CLI disponíveis do Microsoft Container Registry (MCR). Normalmente, leva aproximadamente um mês para certificar uma imagem da CLI para o script de implantação. Não use as versões da CLI que foram lançadas dentro de 30 dias. Para encontrar as datas de lançamento das imagens, consulte Notas de versão da CLI do Azure. Se for utilizada uma versão não suportada, a mensagem de erro lista as versões suportadas.

  • arguments: Especifique os valores dos parâmetros. Os valores são separados por espaços.

    Deployment Scripts divide os argumentos em uma matriz de cadeias de caracteres invocando a chamada do sistema CommandLineToArgvW . Esta etapa é necessária porque os argumentos são passados como uma propriedade de comando para a Instância de Contêiner do Azure e a propriedade de comando é uma matriz de cadeia de caracteres.

    Se os argumentos contiverem caracteres com escape, use JsonEscaper para escapar duas vezes dos caracteres. Cole a cadeia de caracteres com escape original na ferramenta e selecione Escape. A ferramenta gera uma seqüência de caracteres com escape duplo. Por exemplo, no modelo de exemplo anterior, O argumento é -name \"John Dole\". A cadeia de caracteres com escape é -name \\\"John Dole\\\".

    Para passar um parâmetro de modelo ARM do tipo objeto como um argumento, converta o objeto em uma cadeia de caracteres usando a função string() e, em seguida, use a função replace() para substituir qualquer \" em \\\". Por exemplo:

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

    Para obter mais informações, consulte o modelo de exemplo.

  • environmentVariables: Especifique as variáveis de ambiente a serem passadas para o script. Para obter mais informações, consulte Desenvolver scripts de implantação.

  • scriptContent: Especifique o conteúdo do script. Para executar um script externo, use primaryScriptUri em vez disso. Para obter exemplos, consulte Usar script embutido e Usar script externo.

  • primaryScriptUri: Especifique uma URL acessível publicamente para o script de implantação principal com extensões de arquivo suportadas. Para obter mais informações, consulte Usar scripts externos.

  • supportingScriptUris: Especifique uma matriz de URLs acessíveis publicamente para arquivos de suporte que são chamados em ou scriptContentprimaryScriptUri. Para obter mais informações, consulte Usar scripts externos.

  • timeout: Especifique o tempo máximo permitido de execução do script especificado no formato ISO 8601. O valor padrão é P1D.

  • cleanupPreference. Especifique a preferência de limpeza dos dois recursos de implantação de suporte, a conta de armazenamento e a instância do contêiner, quando a execução do script entrar em um estado terminal. A configuração padrão é Sempre, o que significa excluir os recursos de suporte apesar do estado do terminal (Sucedido, Falhado, Cancelado). Para saber mais, consulte Limpar recursos de script de implantação.

  • retentionInterval: Especifique o intervalo para o qual o serviço retém o recurso de script de implantação depois que a execução do script de implantação atingir um estado terminal. O recurso de script de implantação é excluído quando essa duração expira. A duração é baseada no padrão ISO 8601. O intervalo de retenção é entre 1 e 26 horas (PT26H). Esta propriedade é usada quando cleanupPreference é definida como OnExpiration. Para saber mais, consulte Limpar recursos de script de implantação.

Mais exemplos

  • Exemplo 1: crie um cofre de chaves e use o script de implantação para atribuir um certificado ao cofre de chaves.
  • Exemplo 2: crie um grupo de recursos no nível da assinatura, crie um cofre de chaves no grupo de recursos e use o script de implantação para atribuir um certificado ao cofre de chaves.
  • Exemplo 3: crie uma identidade gerenciada atribuída pelo usuário, atribua a função de colaborador à identidade no nível do grupo de recursos, crie um cofre de chaves e use o script de implantação para atribuir um certificado ao cofre de chaves.
  • Amostra 4: é o mesmo cenário da Amostra 1 nesta lista. Um novo grupo de recursos é criado para executar o script de implantação. Este modelo é um modelo de nível de assinatura.
  • Amostra 5: é o mesmo cenário da Amostra 4. Este modelo é um modelo de nível de grupo de recursos.
  • Exemplo 6: crie manualmente uma identidade gerenciada atribuída pelo usuário e atribua-lhe permissão para usar a API do Microsoft Graph para criar aplicativos Microsoft Entra; no modelo ARM, use um script de implantação para criar um aplicativo e uma entidade de serviço do Microsoft Entra e produza as IDs de objeto e a ID do cliente.

Usar scripts embutidos

O modelo a seguir tem um recurso definido com o Microsoft.Resources/deploymentScripts tipo. A parte destacada é o script embutido.

{
  "$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"
    }
  }
}

Nota

Como os scripts de implantação embutidos são colocados entre aspas duplas, as cadeias de caracteres dentro dos scripts de implantação precisam ser escapadas usando uma barra invertida (\) ou entre aspas simples. Você também pode considerar o uso da substituição de cadeia de caracteres, como é mostrado no exemplo JSON anterior.

O script usa um parâmetro e produz o valor do parâmetro. DeploymentScriptOutputs é usado para armazenar saídas. Na seção saídas, a value linha mostra como acessar os valores armazenados. Write-Output é usado para fins de depuração. Para saber como acessar o arquivo de saída, consulte Monitorar e solucionar problemas de scripts de implantação. Para obter as descrições das propriedades, consulte Modelos de exemplo.

Para executar o script, selecione Experimentar para abrir o Cloud Shell e cole o código a seguir no painel do shell.

$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 ..."

O resultado tem o seguinte aspeto:

Captura de tela do script de implantação de modelo do Gerenciador de Recursos Olá saída mundial.

Usar scripts externos

Além de scripts embutidos, você também pode usar arquivos de script externos. Somente scripts principais do PowerShell com a extensão de arquivo ps1 são suportados. Para scripts CLI, os scripts primários podem ter quaisquer extensões (ou sem uma extensão), desde que os scripts sejam scripts bash válidos. Para usar arquivos de script externos, substitua scriptContent por primaryScriptUri. Por exemplo:

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

Para obter mais informações, consulte o modelo de exemplo.

Os arquivos de script externos devem estar acessíveis. Para proteger seus arquivos de script armazenados em contas de armazenamento do Azure, gere um token SAS e inclua-o no URI do modelo. Defina o tempo de expiração para permitir tempo suficiente para concluir a implantação. Para obter mais informações, consulte Implantar modelo ARM privado com token SAS.

Você é responsável por garantir a integridade dos scripts referenciados pelo script de implantação, ou primaryScriptUrisupportingScriptUris. Faça referência apenas a scripts em que confia.

Usar scripts de suporte

Você pode separar lógicas complicadas em um ou mais arquivos de script de suporte. A supportingScriptUris propriedade permite que você forneça uma matriz de URIs para os arquivos de script de suporte, se necessário:

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

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

Os arquivos de script de suporte podem ser chamados a partir de scripts embutidos e arquivos de script primários. Os arquivos de script de suporte não têm restrições sobre a extensão do arquivo.

Os arquivos de suporte são copiados para azscripts/azscriptinput no tempo de execução. Use o caminho relativo para fazer referência aos arquivos de suporte de scripts embutidos e arquivos de script primários.

Trabalhar com saídas de scripts do PowerShell

O modelo a seguir mostra como passar valores entre dois deploymentScripts recursos:

{
  "$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"
    }
  }
}

No primeiro recurso, você define uma variável chamada $DeploymentScriptOutputs, e usa-a para armazenar os valores de saída. Para acessar o valor de saída de outro recurso dentro do modelo, use:

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

Trabalhar com saídas de scripts CLI

Ao contrário dos scripts de implantação do Azure PowerShell, a CLI/bash não expõe uma variável comum para armazenar saídas de script. Em vez disso, ele utiliza uma variável de ambiente nomeada AZ_SCRIPTS_OUTPUT_PATH para indicar o local do arquivo de saídas de script. Ao executar um script de implantação em um modelo ARM, o shell Bash configura automaticamente essa variável de ambiente para você. Seu valor predefinido é definido como /mnt/azscripts/azscriptoutput/scriptoutputs.json. As saídas são necessárias para estar em conformidade com uma estrutura de objeto de cadeia de caracteres JSON válida. O conteúdo do arquivo deve ser formatado como um par chave-valor. Por exemplo, uma matriz de strings deve ser salva como { "MyResult": [ "foo", "bar"] }. Armazenar apenas os resultados da matriz, como [ "foo", "bar" ], é considerado inválido.

{
  "$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 é usado na amostra anterior. Ele vem com as imagens do contêiner. Consulte Configurar ambiente de desenvolvimento.

Usar conta de armazenamento existente

Uma conta de armazenamento e uma instância de contêiner são necessárias para a execução de scripts e solução de problemas. Você tem as opções para especificar uma conta de armazenamento existente, caso contrário, a conta de armazenamento junto com a instância de contêiner são criadas automaticamente pelo serviço de script. Os requisitos para usar uma conta de armazenamento existente:

  • Os tipos de conta de armazenamento suportados são:

    SKU Tipo suportado
    Premium_LRS FileStorage
    Premium_ZRS FileStorage
    Standard_GRS Armazenamento, StorageV2
    Standard_GZRS StorageV2
    Standard_LRS Armazenamento, StorageV2
    Standard_RAGRS Armazenamento, StorageV2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

    Essas combinações suportam compartilhamentos de arquivos. Para obter mais informações, consulte Criar um compartilhamento de arquivos do Azure e Tipos de contas de armazenamento.

  • As regras de firewall da conta de armazenamento ainda não são suportadas. Para obter mais informações, veja Configurar firewalls e redes virtuais do Armazenamento do Microsoft Azure.

  • A entidade de implantação deve ter permissões para gerenciar a conta de armazenamento, o que inclui leitura, criação e exclusão de compartilhamentos de arquivos.

Para especificar uma conta de armazenamento existente, adicione o seguinte JSON ao elemento de propriedade de Microsoft.Resources/deploymentScripts:

"storageAccountSettings": {
  "storageAccountName": "myStorageAccount",
  "storageAccountKey": "myKey"
},
  • storageAccountName: especifique o nome da conta de armazenamento.

  • storageAccountKey: especifique uma das chaves da conta de armazenamento. Você pode usar a função listKeys() para recuperar a chave. Por exemplo:

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

Consulte Modelos de exemplo para obter um exemplo de definição completa Microsoft.Resources/deploymentScripts .

Quando uma conta de armazenamento existente é usada, o serviço de script cria um compartilhamento de arquivos com um nome exclusivo. Consulte Limpar recursos de script de implantação para saber como o serviço de script limpa o compartilhamento de arquivos.

Desenvolver scripts de implantação

Lidar com erros não terminativos

Você pode controlar como o PowerShell responde a erros não terminativos usando a $ErrorActionPreference variável em seu script de implantação. Se a variável não estiver definida no script de implantação, o serviço de script usará o valor padrão Continue.

O serviço de script define o estado de provisionamento de recursos como Falha quando o script encontra um erro apesar da configuração de $ErrorActionPreference.

Utilizar variáveis de ambiente

O script de implantação usa estas variáveis de ambiente:

Variável de ambiente Default value Sistema reservado
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; CLI do Azure: userscript.sh Y
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME suportandoscripturi.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 /subscrições/ N

Para obter mais informações sobre como usar AZ_SCRIPTS_OUTPUT_PATHo , consulte Trabalhar com saídas do script CLI.

Passar cadeias de caracteres seguras para o script de implantação

Definir variáveis de ambiente (EnvironmentVariable) em suas instâncias de contêiner permite que você forneça configuração dinâmica do aplicativo ou script executado pelo contêiner. O script de implantação lida com variáveis de ambiente não seguras e protegidas da mesma forma que a Instância de Contêiner do Azure. Para obter mais informações, consulte Definir variáveis de ambiente em instâncias de contêiner. Para obter um exemplo, consulte Modelos de exemplo.

O tamanho máximo permitido para variáveis de ambiente é de 64 KB.

Monitorar e solucionar problemas de scripts de implantação

O serviço de script cria uma conta de armazenamento (a menos que você especifique uma conta de armazenamento existente) e uma instância de contêiner para execução de script. Se esses recursos forem criados automaticamente pelo serviço de script, ambos os recursos terão o sufixo azscripts nos nomes dos recursos.

Captura de ecrã dos nomes de recursos do script de implementação de modelos do Resource Manager.

O script de usuário, os resultados da execução e o arquivo stdout são armazenados nos compartilhamentos de arquivos da conta de armazenamento. Há uma pasta chamada azscripts. Na pasta, há mais duas pastas para os arquivos de entrada e saída: azscriptinput e azscriptoutput.

A pasta de saída contém um executionresult.json e o arquivo de saída de script. Você pode ver a mensagem de erro de execução de script no executionresult.json. O arquivo de saída é criado somente quando o script é executado com êxito. A pasta de entrada contém um arquivo de script do PowerShell do sistema e os arquivos de script de implantação do usuário. Você pode substituir o arquivo de script de implantação do usuário por um revisado e executar novamente o script de implantação a partir da instância de contêiner do Azure.

Utilizar o portal do Azure

Depois de implantar um recurso de script de implantação, o recurso é listado no grupo de recursos no portal do Azure. A captura de tela a seguir mostra a página Visão geral de um recurso de script de implantação:

Captura de tela da visão geral do portal de script de implantação de modelo do Gerenciador de Recursos.

A página de visão geral exibe algumas informações importantes do recurso, como Estado de provisionamento, Conta de armazenamento, Instância de contêiner e Logs.

No menu à esquerda, você pode exibir o conteúdo do script de implantação, os argumentos passados para o script e a saída. Você também pode exportar um modelo para o script de implantação, incluindo o script de implantação.

Utilizar o PowerShell

Usando o Azure PowerShell, você pode gerenciar scripts de implantação no escopo da assinatura ou do grupo de recursos:

A Get-AzDeploymentScript saída é semelhante a:

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

Utilizar a CLI do Azure

Usando a CLI do Azure, você pode gerenciar scripts de implantação no escopo da assinatura ou do grupo de recursos:

A saída do comando list é semelhante a:

[
  {
    "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"
  }
]

Utilizar a API REST

Você pode obter as informações de implantação de recursos do script de implantação no nível do grupo de recursos e no nível da assinatura usando a API REST:

/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

O exemplo a seguir usa ARMClient:

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

O resultado é semelhante a:

{
  "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"
}

A seguinte API REST retorna o log:

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

Ele só funciona antes que os recursos de script de implantação sejam excluídos.

Para ver o recurso deploymentScripts no portal, selecione Mostrar tipos ocultos:

Captura de tela do script de implantação de modelo do Gerenciador de Recursos com a opção mostrar tipos ocultos no portal.

Limpar recursos de script de implantação

Os dois recursos de suporte criados automaticamente nunca podem sobreviver ao recurso, a deploymentScript menos que haja falhas ao excluí-los. O ciclo de vida dos recursos de suporte é controlado pela cleanupPreference propriedade, o ciclo de vida do deploymentScript recurso é controlado pela retentionInterval propriedade:

  • cleanupPreference: Especifique a preferência de limpeza dos dois recursos de suporte quando a execução do script entrar em um estado terminal. Os valores suportados são:

    • Sempre: exclua os dois recursos de suporte assim que a execução do script entrar em um estado terminal. Se uma conta de armazenamento existente for usada, o serviço de script excluirá o compartilhamento de arquivos criado pelo serviço. Como o deploymentScripts recurso ainda pode estar presente depois que os recursos de suporte são limpos, o serviço de script persiste os resultados da execução do script, por exemplo, stdout, saídas e valor de retorno antes que os recursos sejam excluídos.

    • OnSuccess: exclua os dois recursos de suporte somente quando a execução do script for bem-sucedida. Se uma conta de armazenamento existente for usada, o serviço de script removerá o compartilhamento de arquivos somente quando a execução do script for bem-sucedida.

      Se a execução do script não for bem-sucedida, o serviço de script aguardará até expirar retentionInterval antes de limpar os recursos de suporte e, em seguida, o recurso de script de implantação.

    • OnExpiration: exclua os dois recursos de suporte somente quando a retentionInterval configuração expirar. Se uma conta de armazenamento existente for usada, o serviço de script removerá o compartilhamento de arquivos, mas reterá a conta de armazenamento.

    A instância do contêiner e a conta de armazenamento são excluídas de acordo com o cleanupPreference. No entanto, se o script falhar e cleanupPreference não estiver definido como Sempre, o processo de implantação manterá automaticamente o contêiner em execução por uma hora ou até que o contêiner seja limpo. Você pode usar o tempo para solucionar problemas do script. Se você quiser manter o contêiner em execução após implantações bem-sucedidas, adicione uma etapa de suspensão ao script. Por exemplo, adicione Start-Sleep ao final do script. Se você não adicionar a etapa de suspensão, o contêiner será definido para um estado terminal e não poderá ser acessado, mesmo que ainda não tenha sido excluído.

  • retentionInterval: Especifique o intervalo de tempo em que um deploymentScript recurso será retido e após o qual será expirado e excluído.

Nota

Não é recomendável usar a conta de armazenamento e a instância de contêiner geradas pelo serviço de script para outros fins. Os dois recursos podem ser removidos dependendo do ciclo de vida do script.

A conta de armazenamento criada automaticamente e a instância de contêiner não podem ser excluídas se o script de implantação for implantado em um grupo de recursos com um bloqueio CanNotDelete. Para resolver esse problema, você pode implantar o script de implantação em outro grupo de recursos sem bloqueios. Consulte Exemplo 4 e Amostra 5 em Modelos de exemplo.

Executar script mais de uma vez

A execução do script de implantação é uma operação idempotente. Se nenhuma das propriedades do deploymentScripts recurso (incluindo o script embutido) for alterada, o script não será executado quando você reimplantar o modelo. O serviço de script de implantação compara os nomes de recursos no modelo com os recursos existentes no mesmo grupo de recursos. Há duas opções se você quiser executar o mesmo script de implantação várias vezes:

  • Altere o nome do seu deploymentScripts recurso. Por exemplo, use a função de modelo utcNow como o nome do recurso ou como parte do nome do recurso. Alterar o nome do recurso cria um novo deploymentScripts recurso. É bom para manter um histórico de execução de scripts.

    Nota

    A utcNow função só pode ser usada no valor padrão para um parâmetro.

  • Especifique um valor diferente na propriedade template forceUpdateTag . Por exemplo, use utcNow como o valor.

Nota

Escreva os scripts de implantação que são idempotentes. Isso garante que, se eles forem executados novamente acidentalmente, isso não causará alterações no sistema. Por exemplo, se o script de implantação for usado para criar um recurso do Azure, verifique se o recurso não existe antes de criá-lo, para que o script seja bem-sucedido ou você não crie o recurso novamente.

Configurar o ambiente de desenvolvimento

Você pode usar uma imagem de contêiner pré-configurada como seu ambiente de desenvolvimento de script de implantação. Para obter mais informações, consulte Configurar ambiente de desenvolvimento para scripts de implantação em modelos.

Depois que o script for testado com êxito, você poderá usá-lo como um script de implantação em seus modelos.

Códigos de erro de script de implantação

Código de erro Description
DeploymentScriptInvalidOperation A definição de recurso do script de implantação no modelo contém nomes de propriedade inválidos.
DeploymentScriptResourceConflict Não é possível excluir um recurso de script de implantação que esteja em estado não terminal e a execução não tenha excedido 1 hora. Ou não é possível executar novamente o mesmo script de implantação com o mesmo identificador de recurso (mesma assinatura, nome do grupo de recursos e nome do recurso), mas conteúdo de corpo de script diferente ao mesmo tempo.
DeploymentScriptOperationFailed A operação de script de implantação falhou internamente. Entre em contato com o suporte da Microsoft.
DeploymentScriptStorageAccountAccessKeyNotSpecified A chave de acesso não foi especificada para a conta de armazenamento existente.
DeploymentScriptContainerGroupContainsInvalidContainers Um grupo de contêineres criado pelo serviço de script de implantação foi modificado externamente e contêineres inválidos foram adicionados.
DeploymentScriptContainerGroupInNonterminalState Dois ou mais recursos de script de implantação usam o mesmo nome de instância de contêiner do Azure no mesmo grupo de recursos, e um deles ainda não concluiu sua execução.
DeploymentScriptStorageAccountInvalidKind A conta de armazenamento existente do tipo BlobBlobStorage ou BlobStorage não suporta compartilhamentos de arquivos e não pode ser usada.
DeploymentScriptStorageAccountInvalidKindAndSku A conta de armazenamento existente não suporta partilhas de ficheiros. Para obter uma lista dos tipos de conta de armazenamento suportados, consulte Usar conta de armazenamento existente.
DeploymentScriptStorageAccountNotFound A conta de armazenamento não existe ou foi excluída por um processo ou ferramenta externa.
DeploymentScriptStorageAccountWithServiceEndpointEnabled A conta de armazenamento especificada tem um ponto de extremidade de serviço. Não há suporte para uma conta de armazenamento com um ponto de extremidade de serviço.
DeploymentScriptStorageAccountInvalidAccessKey Chave de acesso inválida especificada para a conta de armazenamento existente.
DeploymentScriptStorageAccountInvalidAccessKeyFormat Formato de chave de conta de armazenamento inválido. Consulte Gerenciar chaves de acesso da conta de armazenamento.
DeploymentScriptExceededMaxAllowedTime O tempo de execução do script de implantação excedeu o valor de tempo limite especificado na definição de recurso do script de implantação.
DeploymentScriptInvalidOutputs A saída do script de implantação não é um objeto JSON válido.
DeploymentScriptContainerInstancesServiceLoginFailure A identidade gerenciada atribuída pelo usuário não conseguiu entrar após 10 tentativas com intervalo de 1 minuto.
DeploymentScriptContainerGroupNotFound Um grupo de contêineres criado pelo serviço de script de implantação foi excluído por uma ferramenta ou processo externo.
DeploymentScriptDownloadFailure Falha ao baixar um script de suporte. Consulte Usar script de suporte.
DeploymentScriptError O script do usuário lançou um erro.
DeploymentScriptBootstrapScriptExecutionFailed O script de bootstrap lançou um erro. Script de bootstrap é o script do sistema que orquestra a execução do script de implantação.
DeploymentScriptExecutionFailed Erro desconhecido durante a execução do script de implantação.
DeploymentScriptContainerInstancesServiceUnavailable Ao criar a instância de contêiner do Azure (ACI), a ACI lançou um erro de serviço indisponível.
DeploymentScriptContainerGroupInNonterminalState Ao criar a instância de contêiner do Azure (ACI), outro script de implantação está usando o mesmo nome ACI no mesmo escopo (mesma assinatura, nome do grupo de recursos e nome do recurso).
DeploymentScriptContainerGroupNameInvalid O nome da instância de contêiner do Azure (ACI) especificado não atende aos requisitos da ACI. Consulte Solucionar problemas comuns em instâncias de contêiner do Azure.

Usar o Microsoft Graph em um script de implantação

Um script de implantação pode usar o Microsoft Graph para criar e trabalhar com objetos no Microsoft Entra ID.

Comandos

Ao usar scripts de implantação da CLI do Azure, você pode usar comandos dentro do az ad grupo de comandos para trabalhar com aplicativos, entidades de serviço, grupos e usuários. Você também pode invocar diretamente as APIs do Microsoft Graph usando o az rest comando.

Ao usar scripts de implantação do Azure PowerShell, você pode usar o Invoke-RestMethod cmdlet para invocar diretamente as APIs do Microsoft Graph.

Permissões

A identidade que seu script de implantação usa precisa ser autorizada para trabalhar com a API do Microsoft Graph, com as permissões apropriadas para as operações que ele executa. Você deve autorizar a identidade fora da implantação do modelo, por exemplo, pré-criando uma identidade gerenciada atribuída pelo usuário e atribuindo-lhe uma função de aplicativo para o Microsoft Graph. Para obter mais informações, consulte este exemplo de início rápido.

Aceda à rede virtual privada

Com Microsoft.Resources/deploymentScripts versão 2023-08-01, você pode executar scripts de implantação em redes privadas com algumas configurações adicionais.

  • Crie uma identidade gerenciada atribuída pelo usuário e especifique-a identity na propriedade. Para atribuir a identidade, consulte Identidade.

  • Crie uma conta de armazenamento com allowSharedKeyAccess set como true , e especifique o script de implantação para usar a conta de armazenamento existente. Para especificar uma conta de armazenamento existente, consulte Usar conta de armazenamento existente. Algumas configurações adicionais são necessárias para a conta de armazenamento.

    1. Abra a conta de armazenamento no portal do Azure.

    2. No menu à esquerda, selecione Controle de acesso (IAM) e, em seguida, selecione a guia Atribuições de função.

    3. Adicione a Storage File Data Privileged Contributor função à identidade gerenciada de atribuição de usuário.

    4. No menu à esquerda, em Segurança + rede, selecione Rede e, em seguida, selecione Firewalls e redes virtuais.

    5. Selecione Ativado a partir de redes virtuais e endereços IP selecionados.

      Captura de ecrã da configuração da conta de armazenamento para aceder à rede privada.

    6. Em Redes virtuais, adicione uma sub-rede. Na captura de tela, a sub-rede é chamada dspvnVnet.

    7. Em Exceções, selecione Permitir que os serviços do Azure na lista de serviços confiáveis acessem essa conta de armazenamento.

O modelo ARM a seguir mostra como configurar o ambiente para executar um script de implantação:

{
  "$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'))]"
      ]
    }
  ]
}

Você pode usar o seguinte modelo ARM para testar a implantação:

{
  "$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"
      }
    }
  ]
}

Próximos passos

Neste artigo, você aprendeu a usar scripts de implantação. Para percorrer um tutorial de script de implantação: