Exercício – adicionar um script de implantação a um modelo do ARM
Importante
É preciso ter uma assinatura do Azure para fazer esse exercício, e isso pode gerar encargos. Caso ainda não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.
Como parte do processo de implantação de aplicativos da sua equipe, você precisa criar uma conta de armazenamento e preparar um arquivo no armazenamento de blobs para o aplicativo ler. Até este ponto, você copiava manualmente o arquivo sempre que um novo ambiente era sido configurado. Você decide usar um script de implantação para automatizar essa etapa como parte do processo de criação de seu ambiente.
Neste exercício, você vai um modelo do ARM (Azure Resource Manager) e adicionar um script de implantação.
Durante o processo, você vai:
- Crie um modelo inicial.
- Adicione os pré-requisitos para scripts de implantação, incluindo uma identidade gerenciada atribuída pelo usuário e uma atribuição de função.
- Adicione um script de implantação.
- Implante o modelo e verifique o resultado.
Este exercício usará a extensão Ferramentas do Azure Resource Manager para Visual Studio Code. É necessário que você instale essa extensão no Visual Studio Code.
Este exercício usa a extensão Bicep para Visual Studio Code. É necessário que você instale essa extensão no Visual Studio Code.
Criar um modelo inicial
Comece com um modelo existente que a sua equipe está usando. O modelo cria a conta de armazenamento, configura os serviços de blob e exige HTTPS e cria o contêiner de blob para seus arquivos de configuração.
Abra o Visual Studio Code.
Crie um arquivo chamado azuredeploy.json.
Salve o arquivo vazio para que o Visual Studio Code carregue as ferramentas de modelo do ARM.
Você pode selecionar Arquivo>Salvar Como ou Ctrl+S no Windows (⌘+S no macOS). Lembre-se de onde você salvou o arquivo. Por exemplo, você pode criar uma pasta de scripts para salvá-lo.
Copie o modelo inicial a seguir para azuredeploy.json.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.1", "apiProfile": "", "parameters": {}, "variables": { "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]", "storageBlobContainerName": "config" }, "functions": [], "resources": [ { "name": "[variables('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2023-01-01", "tags": { "displayName": "[variables('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "properties": { "allowBlobPublicAccess": true, "encryption": { "services": { "blob": { "enabled": true } }, "keySource": "Microsoft.Storage" }, "supportsHttpsTrafficOnly": true } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ] }, { "type": "Microsoft.Storage/storageAccounts/blobServices/containers", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]", "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ], "properties": { "publicAccess": "Blob" } } ] }
Salve o modelo.
Abra o Visual Studio Code.
Crie um arquivo chamado main.bicep.
Salve o arquivo vazio para que Visual Studio Code carregue as ferramentas Bicep.
Você pode selecionar Arquivo>Salvar Como ou Ctrl+S no Windows (⌘+S no macOS). Lembre-se de onde você salvou o arquivo. Por exemplo, você pode criar uma pasta scripts para salvá-lo.
Copie o modelo inicial a seguir para main.bicep.
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}' var storageBlobContainerName = 'config' resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName tags: { displayName: storageAccountName } location: resourceGroup().location kind: 'StorageV2' sku: { name: 'Standard_LRS' tier: 'Standard' } properties: { allowBlobPublicAccess: true encryption: { services: { blob: { enabled: true } } keySource: 'Microsoft.Storage' } supportsHttpsTrafficOnly: true } resource blobService 'blobServices' existing = { name: 'default' } } resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = { parent: storageAccount::blobService name: storageBlobContainerName properties: { publicAccess: 'Blob' } }
Salve o modelo.
Adicionar uma identidade gerenciada atribuída pelo usuário
Em seguida, você precisa criar uma identidade gerenciada atribuída pelo usuário. Dada a abordagem de infraestrutura como código, você pode criar a identidade no modelo.
Edite a seção
variables
de azuredeploy.json para incluir:"userAssignedIdentityName": "configDeployer",
Edite a seção
resources
de azuredeploy.json para incluir:{ "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "apiVersion": "2018-11-30", "name": "[variables('userAssignedIdentityName')]", "location": "[resourceGroup().location]" }
Salve o modelo.
Nas definições de variável em main.bicep, adicione:
var userAssignedIdentityName = 'configDeployer'
Nas definições de recurso, adicione:
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { name: userAssignedIdentityName location: resourceGroup().location }
Salve o modelo.
Definir a função de contribuidor para a identidade gerenciada
Agora que você tem uma identidade gerenciada definida, pode atribuir a ela uma função com direitos para o grupo de recursos. Você atribuirá a ela a função contribuidor. Você identifica uma função por sua ID de definição de função, que é um GUID. A função Contribuidor é integrada ao Azure, de modo que a ID de definição de função é documentada.
A atribuição de função também precisa de um nome de GUID. Você pode usar a função guid
para criar um GUID exclusivo para o grupo de recursos e o nome da função.
Edite a seção
variables
de azuredeploy.json para incluir:"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
Edite a seção
resources
de azuredeploy.json para incluir:{ "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "2020-04-01-preview", "name": "[variables('roleAssignmentName')]", "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ], "properties": { "roleDefinitionId": "[variables('contributorRoleDefinitionId')]", "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]", "scope": "[resourceGroup().id]", "principalType": "ServicePrincipal" } }
Salve o modelo.
Nas definições de variável em main.bicep, adicione:
var roleAssignmentName = guid(resourceGroup().id, 'contributor') var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
Nas definições de recurso, adicione:
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = { name: roleAssignmentName properties: { roleDefinitionId: contributorRoleDefinitionId principalId: userAssignedIdentity.properties.principalId principalType: 'ServicePrincipal' } }
Salve o modelo.
Criar o script de implantação
Agora, você tem todos os pré-requisitos para o script de implantação. Você começará com os valores comuns de que o script de implantação precisa. Há duas dependências, a atribuição de função e o contêiner de armazenamento de blobs. Para ser executado, seu script precisa que ambos existam.
Edite a seção
variables
de azuredeploy.json para incluir:"deploymentScriptName": "CopyConfigScript"
Edite a seção
resources
de azuredeploy.json para incluir:{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "[variables('deploymentScriptName')]", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "dependsOn": [ "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]", "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {} } } }
Adicione uma seção
properties
ao recurso para definir o script e os outros valores necessários."properties": { "azPowerShellVersion": "3.0", "scriptContent": " Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ", "retentionInterval": "P1D" }
Salve o modelo.
Nas definições de variável em main.bicep, adicione:
var deploymentScriptName = 'CopyConfigScript'
Nas definições de recurso, adicione:
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: deploymentScriptName location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '${userAssignedIdentity.id}': {} } } dependsOn: [ roleAssignment blobContainer ] }
Adicione uma seção
properties
ao recurso para definir o script e os outros valores necessários.properties: { azPowerShellVersion: '3.0' scriptContent: ''' Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ''' retentionInterval: 'P1D' }
Salve o modelo.
Adicionar uma saída de modelo
Agora que você tem um script de implantação carregando um arquivo no Armazenamento de Blobs do Azure, talvez seja necessário fazer referência a esse local de arquivo em automação posterior. (Talvez você execute um teste para validar se o arquivo está onde você acha que deveria estar.)
Após a seção resources
do modelo do ARM, adicione uma saída que referencia o URI para o arquivo conforme relatado pelo script de implantação.
"outputs": {
"fileUri": {
"type": "string",
"value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
}
}
Na parte inferior do arquivo, após as definições de recurso, adicione uma saída que referencie o URI do arquivo conforme relatado pelo script de implantação.
output fileUri string = deploymentScript.properties.outputs.Uri
Verificar o modelo
Seu modelo deve ter a seguinte aparência:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"apiProfile": "",
"parameters": {},
"variables": {
"storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
"storageBlobContainerName": "config",
"userAssignedIdentityName": "configDeployer",
"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
"contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"deploymentScriptName": "CopyConfigScript"
},
"functions": [],
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"tags": {
"displayName": "[variables('storageAccountName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"allowBlobPublicAccess": true,
"encryption": {
"services": {
"blob": {
"enabled": true
}
},
"keySource": "Microsoft.Storage"
},
"supportsHttpsTrafficOnly": true
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"publicAccess": "Blob"
}
},
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"apiVersion": "2018-11-30",
"name": "[variables('userAssignedIdentityName')]",
"location": "[resourceGroup().location]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2020-04-01-preview",
"name": "[variables('roleAssignmentName')]",
"dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
"scope": "[resourceGroup().id]",
"principalType": "ServicePrincipal"
}
},
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "[variables('deploymentScriptName')]",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"dependsOn": [
"[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
"[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
],
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
}
},
"properties": {
"azPowerShellVersion": "3.0",
"scriptContent": "
Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
$storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
$blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"fileUri": {
"type": "string",
"value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
}
}
}
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
tags: {
displayName: storageAccountName
}
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
allowBlobPublicAccess: true
encryption: {
services: {
blob: {
enabled: true
}
}
keySource: 'Microsoft.Storage'
}
supportsHttpsTrafficOnly: true
}
resource blobService 'blobServices' existing = {
name: 'default'
}
}
resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
parent: storageAccount::blobService
name: storageBlobContainerName
properties: {
publicAccess: 'Blob'
}
}
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: userAssignedIdentityName
location: resourceGroup().location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
name: roleAssignmentName
properties: {
roleDefinitionId: contributorRoleDefinitionId
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
name: deploymentScriptName
location: resourceGroup().location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${userAssignedIdentity.id}': {}
}
}
properties: {
azPowerShellVersion: '3.0'
scriptContent: '''
Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
$storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
$blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
'''
retentionInterval: 'P1D'
}
dependsOn: [
roleAssignment
blobContainer
]
}
output fileUri string = deploymentScript.properties.outputs.Uri
Caso contrário, copie o exemplo ou ajuste o modelo para que ele corresponda ao exemplo.
Implantar o modelo
Para implantar esse modelo no Azure, será necessário entrar em sua conta do Azure do terminal do Visual Studio Code. Verifique se você instalou as ferramentas da CLI do Azure.
No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.
Se o shell mostrado no lado direito da janela do terminal for o bash, o shell correto será aberto e você poderá passar para a próxima seção.
Se um shell diferente de bash for exibido, selecione a seta suspensa do shell e selecione Azure Cloud Shell (Bash).
Na lista de shells de terminal, selecione bash.
No terminal, vá até o diretório no qual você salvou o modelo. Por exemplo, se você salvou o modelo na pasta modelos, use este comando:
cd templates
Entrar no Azure usando a CLI do Azure
No terminal do Visual Studio Code, entre no Azure executando o seguinte comando:
az login
No navegador que é aberto, entre em sua conta do Azure.
O terminal do Visual Studio Code exibe uma lista das assinaturas associadas a essa conta.
Na lista, encontre a assinatura que deseja usar para este exercício.
Caso você tenha perdido a lista da inscrição, use o snippet a seguir para listar suas assinaturas novamente.
az account list --output table
Defina a assinatura padrão para todos os comandos da CLI do Azure que você executar nesta sessão.
az account set --subscription "Your Subscription Name or ID"
Para implantar esse modelo no Azure, será necessário entrar em sua conta do Azure do terminal do Visual Studio Code. Verifique se você instalou as ferramentas da CLI do Azure.
No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.
Se o shell mostrado no lado direito da janela do terminal for o bash, o shell correto será aberto e você poderá passar para a próxima seção.
Se um shell diferente de bash for exibido, selecione a seta suspensa do shell e selecione Azure Cloud Shell (Bash).
Na lista de shells de terminal, selecione bash.
No terminal, vá até o diretório no qual você salvou o modelo. Por exemplo, se você salvou o modelo na pasta modelos, use este comando:
cd templates
Instalar o Bicep
Veja se você tem a versão mais recente do Bicep executando o seguinte comando:
az bicep install && az bicep upgrade
Entrar no Azure usando a CLI do Azure
No terminal do Visual Studio Code, entre no Azure executando o seguinte comando:
az login
No navegador que é aberto, entre em sua conta do Azure.
O terminal do Visual Studio Code exibe uma lista das assinaturas associadas a essa conta.
Na lista, encontre a assinatura que deseja usar para este exercício.
Caso você tenha perdido a lista da inscrição, use o snippet a seguir para listar suas assinaturas novamente.
az account list --output table
Defina a assinatura padrão para todos os comandos da CLI do Azure que você executar nesta sessão.
az account set --subscription "Your Subscription Name or ID"
Para implantar esse modelo no Azure, entre na sua conta do Azure por meio do terminal do Visual Studio Code. Verifique se você instalou o Azure PowerShell e entre na mesma conta que ativou a área restrita.
No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.
Se o shell mostrado no lado direito da janela do terminal for o powershell ou o pwsh, o shell correto será aberto e você poderá passar para a próxima seção.
Se aparecer um shell diferente do powershell ou pwsh, selecione a seta da lista de seleção do shell e escolha PowerShell.
Na lista de shells de terminal, selecione powershell ou pwsh.
No terminal, vá até o diretório no qual você salvou o modelo. Por exemplo, se você salvou o modelo na pasta modelos, use este comando:
Set-Location -Path templates
Entrar no Azure usando o Azure PowerShell
No terminal do Visual Studio Code, entre no Azure executando o seguinte comando:
Connect-AzAccount
No navegador que é aberto, entre em sua conta do Azure.
Obtenha a ID da assinatura que deseja usar para este exercício executando o seguinte comando:
Get-AzSubscription
A ID da assinatura será a segunda coluna. Copie a segunda coluna. É semelhante a aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e.
Defina a assinatura padrão para todos os comandos do Azure PowerShell que você executar nesta sessão.
Set-AzContext -SubscriptionId {Your subscription ID}
Para implantar esse modelo no Azure, entre na sua conta do Azure por meio do terminal do Visual Studio Code. Verifique se você instalou o Azure PowerShell.
No menu Terminal, selecione Novo Terminal. A janela do terminal geralmente é aberta na metade inferior da tela.
Se o shell mostrado no lado direito da janela do terminal for o powershell ou o pwsh, o shell correto será aberto e você poderá passar para a próxima seção.
Se aparecer um shell diferente do powershell ou pwsh, selecione a seta da lista de seleção do shell e escolha PowerShell.
Na lista de shells de terminal, selecione powershell ou pwsh.
No terminal, vá até o diretório no qual você salvou o modelo. Por exemplo, se você salvou o modelo na pasta modelos, use este comando:
Set-Location -Path templates
Instalar a CLI do Bicep
Para usar o Bicep no Azure PowerShell, instale a CLI do Bicep.
Entrar no Azure usando o Azure PowerShell
No terminal do Visual Studio Code, entre no Azure executando o seguinte comando:
Connect-AzAccount
No navegador que é aberto, entre em sua conta do Azure.
Obtenha a ID da assinatura que deseja usar para este exercício executando o seguinte comando:
Get-AzSubscription
A ID da assinatura será a segunda coluna. Copie a segunda coluna. É semelhante a aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e.
Defina a assinatura padrão para todos os comandos do Azure PowerShell que você executar nesta sessão.
Set-AzContext -SubscriptionId {Your subscription ID}
Em seguida, você precisa criar um grupo de recursos para conter os recursos que você vai criar como parte deste exercício. Usando um novo grupo de recursos, você facilitará muito a limpeza após o exercício.
No terminal no Visual Studio Code, execute este comando para criar o grupo de recursos para este exercício:
Criar um grupo de recursos para o exercício
resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
Observação
Se você usar um nome diferente para o grupo de recursos, precisará atualizar o script. Mais adiante neste módulo, você verá como evitar codificar nomes de grupo de recursos em seus scripts.
Implantar o modelo no Azure
O código a seguir implantará o modelo do ARM no Azure. Você verá uma implantação bem-sucedida.
Implante o modelo usando os comandos da CLI do Azure no terminal do Visual Studio Code.
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile
O código a seguir implantará o modelo do ARM no Azure. Você verá uma implantação bem-sucedida.
Implante o modelo usando os comandos da CLI do Azure no terminal do Visual Studio Code.
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile
O código a seguir implanta o modelo no Azure. Você verá uma implantação bem-sucedida.
Implante o modelo usando os comandos do Azure PowerShell no terminal.
$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile
O código a seguir implanta o modelo no Azure. Você verá uma implantação bem-sucedida.
Implante o modelo usando os comandos do Azure PowerShell no terminal.
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile
Examinar o resultado do modelo
Depois que a implantação for concluída, você verá uma URL que aponta para o arquivo que o script de implantação copiou para o armazenamento de blobs.
Recupere esse arquivo usando a saída da URL da implantação de modelo para verificar se o script de implantação funcionou corretamente.
uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv) curl $uri
O comando retorna o código a seguir.
{ "environment": "production", "hostname": "tailwindtraders.com", "Logging": { "LogLevel": { "Default": "Debug" } }, "ApplicationInsights": { "InstrumentationKey": "" }, "AllowedHosts": "*", "CosmosDb": { "Host": "", "Key": "", "Database": "Products" } }
Você também pode examinar os logs (e outros detalhes sobre a implantação) no portal do Azure ou usando o comando a seguir.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
Recupere esse arquivo usando a saída da URL da implantação de modelo para verificar se o script de implantação funcionou corretamente.
$fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value Invoke-RestMethod $fileUri
O comando retorna o código a seguir.
environment : production hostname : tailwindtraders.com Logging : @{LogLevel=} ApplicationInsights : @{InstrumentationKey=} AllowedHosts : * CosmosDb : @{Host=; Key=; Database=Products}
Você também pode examinar os logs (e outros detalhes sobre a implantação) no portal do Azure ou usando a linha de comando a seguir.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Limpar o grupo de recursos
Agora que você implantou com êxito um modelo do ARM com um script de implantação, pode remover o grupo de recursos que contém todos os recursos e atribuições de função que você criou.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName