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
eMicrosoft.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 chamaConnect-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 aidentity
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.
- Especifique uma identidade gerenciada atribuída pelo usuário na
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/aaaabbbb-0000-cccc-1111-dddd2222eeee/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 chamaConnect-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 usandocontainerGroupName
. Se não for especificado, o nome do grupo será gerado automaticamente.storageAccountSettings
: Especifique as configurações para usar uma conta de armazenamento existente. SestorageAccountName
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, useprimaryScriptUri
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 ouscriptContent
primaryScriptUri
. 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 quandocleanupPreference
é 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:
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 primaryScriptUri
supportingScriptUris
. 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.
A
allowSharedKeyAccess
propriedade da conta de armazenamento deve ser definida comotrue
. A única maneira de montar uma conta de armazenamento na Instância de Contêiner do Azure (ACI) é por meio de uma chave de acesso.
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_PATH
o , 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.
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:
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:
- Get-AzDeploymentScript: Obtém ou lista scripts de implantação.
- Get-AzDeploymentScriptLog: Obtém o log de uma execução de script de implantação.
- Remove-AzDeploymentScript: Remove um script de implantação e seus recursos associados.
- Save-AzDeploymentScriptLog: salva o log de execução de um script de implantação no disco.
A Get-AzDeploymentScript
saída é semelhante a:
Name : runPowerShellInlineWithOutput
Id : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName : myds0618rg
Location : centralus
SubscriptionId : aaaabbbb-0000-cccc-1111-dddd2222eeee
ProvisioningState : Succeeded
Identity : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/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/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/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:
- az deployment-scripts delete: exclua um script de implantação.
- az deployment-scripts list: Liste todos os scripts de implantação.
- az deployment-scripts show: Recuperar um script de implantação.
- az deployment-scripts show-log: Mostrar logs de script de implantação.
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/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
"identity": {
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "userAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
}
},
"kind": "AzureCLI",
"location": "centralus",
"name": "runBashWithOutputs",
"outputs": {
"Result": [
{
"id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/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/aaaabbbb-0000-cccc-1111-dddd2222eeee/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/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01
O resultado é semelhante a:
{
"kind": "AzurePowerShell",
"identity": {
"type": "userAssigned",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"userAssignedIdentities": {
"/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
"principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444"
}
}
},
"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/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
"storageAccountId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/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/aaaabbbb-0000-cccc-1111-dddd2222eeee/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:
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 ecleanupPreference
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 umdeploymentScript
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 novodeploymentScripts
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, useutcNow
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 comotrue
, 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.Abra a conta de armazenamento no portal do Azure.
No menu à esquerda, selecione Controle de acesso (IAM) e, em seguida, selecione a guia Atribuições de função.
Adicione a
Storage File Data Privileged Contributor
função à identidade gerenciada de atribuição de usuário.No menu à esquerda, em Segurança + rede, selecione Rede e, em seguida, selecione Firewalls e redes virtuais.
Selecione Ativado a partir de redes virtuais e endereços IP selecionados.
Em Redes virtuais, adicione uma sub-rede. Na captura de tela, a sub-rede é chamada dspvnVnet.
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: