Configurar o ambiente de desenvolvimento para scripts de implantação em modelos ARM
Saiba como criar um ambiente de desenvolvimento para desenvolver e testar scripts de implantação de modelo ARM com uma imagem de script de implantação. Você pode criar uma instância de contêiner do Azure ou usar o Docker. Ambas as opções são abordadas neste artigo.
Pré-requisitos
Contêiner do Azure PowerShell
Se você não tiver um script de implantação do Azure PowerShell, poderá criar um arquivo hello.ps1 usando o seguinte conteúdo:
param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
Contêiner da CLI do Azure
Para uma imagem de contêiner da CLI do Azure, você pode criar um arquivo de hello.sh usando o seguinte conteúdo:
FIRSTNAME=$1
LASTNAME=$2
OUTPUT="{\"name\":{\"displayName\":\"$FIRSTNAME $LASTNAME\",\"firstName\":\"$FIRSTNAME\",\"lastName\":\"$LASTNAME\"}}"
echo -n "Hello "
echo $OUTPUT | jq -r '.name.displayName'
Nota
Quando você executa um script de implantação da CLI do Azure, uma variável de ambiente chamada AZ_SCRIPTS_OUTPUT_PATH
armazena o local do arquivo de saída do script. A variável de ambiente não está disponível no contêiner do ambiente de desenvolvimento. Para obter mais informações sobre como trabalhar com saídas da CLI do Azure, consulte Trabalhar com saídas do script da CLI.
Usar a instância de contêiner do Azure PowerShell
Para criar seus scripts no computador, você precisa criar uma conta de armazenamento e montar a conta de armazenamento na instância do contêiner. Para que você possa carregar seu script para a conta de armazenamento e executar o script na instância do contêiner.
Nota
A conta de armazenamento que você cria para testar o script não é a mesma conta de armazenamento que o serviço de script de implantação usa para executar o script. O serviço de script de implantação cria um nome exclusivo como um compartilhamento de arquivos em cada execução.
Criar uma instância de contêiner do Azure PowerShell
O seguinte modelo do Azure Resource Manager (modelo ARM) cria uma instância de contêiner e um compartilhamento de arquivos e, em seguida, monta o compartilhamento de arquivos na imagem do contêiner.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"projectName": {
"type": "string",
"metadata": {
"description": "Specify a project name that is used for generating resource names."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Specify the resource location."
}
},
"containerImage": {
"type": "string",
"defaultValue": "mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7",
"metadata": {
"description": "Specify the container image."
}
},
"mountPath": {
"type": "string",
"defaultValue": "/mnt/azscripts/azscriptinput",
"metadata": {
"description": "Specify the mount path."
}
}
},
"variables": {
"storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
"fileShareName": "[format('{0}share', parameters('projectName'))]",
"containerGroupName": "[format('{0}cg', parameters('projectName'))]",
"containerName": "[format('{0}container', parameters('projectName'))]"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {
"accessTier": "Hot"
}
},
{
"type": "Microsoft.Storage/storageAccounts/fileServices/shares",
"apiVersion": "2023-01-01",
"name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2023-05-01",
"name": "[variables('containerGroupName')]",
"location": "[parameters('location')]",
"properties": {
"containers": [
{
"name": "[variables('containerName')]",
"properties": {
"image": "[parameters('containerImage')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGB": "[json('1.5')]"
}
},
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"volumeMounts": [
{
"name": "filesharevolume",
"mountPath": "[parameters('mountPath')]"
}
],
"command": [
"/bin/sh",
"-c",
"pwsh -c 'Start-Sleep -Seconds 1800'"
]
}
}
],
"osType": "Linux",
"volumes": [
{
"name": "filesharevolume",
"azureFile": {
"readOnly": false,
"shareName": "[variables('fileShareName')]",
"storageAccountName": "[variables('storageAccountName')]",
"storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value]"
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
}
]
}
O valor padrão para o caminho de montagem é /mnt/azscripts/azscriptinput
. Este é o caminho na instância do contêiner onde ele é montado no compartilhamento de arquivos.
A imagem de contêiner padrão especificada no modelo é mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Veja uma lista de todas as versões suportadas do Azure PowerShell.
O modelo suspende a instância do contêiner após 1.800 segundos. Você tem 30 minutos antes que a instância do contêiner entre em um estado encerrado e a sessão termine.
Para implantar o modelo:
$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"
New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName
Carregue o script de implantação
Carregue seu script de implantação para a conta de armazenamento. Aqui está um exemplo de um script do PowerShell:
$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"
$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"
$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force
Você também pode carregar o arquivo usando o portal do Azure ou a CLI do Azure.
Testar o script de implantação
No portal do Azure, abra o grupo de recursos onde você implantou a instância de contêiner e a conta de armazenamento.
Abra o grupo de contêineres. O nome do grupo de contêineres padrão é o nome do projeto anexado com cg. A instância do contêiner está no estado em execução .
No menu de recursos, selecione Contêineres. O nome da instância do contêiner é o nome do projeto anexado ao contêiner.
Selecione Conectar e, em seguida, selecione Conectar. Se você não conseguir se conectar à instância do contêiner, reinicie o grupo de contêineres e tente novamente.
No painel do console, execute os seguintes comandos:
cd /mnt/azscripts/azscriptinput ls pwsh ./hello.ps1 "John Dole"
A saída é Olá John Dole.
Usar uma instância de contêiner da CLI do Azure
Para criar os scripts no computador, crie uma conta de armazenamento e monte a conta de armazenamento na instância do contêiner. Em seguida, você pode carregar seu script para a conta de armazenamento e executar o script na instância do contêiner.
Nota
A conta de armazenamento que você cria para testar o script não é a mesma conta de armazenamento que o serviço de script de implantação usa para executar o script. O serviço de script de implantação cria um nome exclusivo como um compartilhamento de arquivos em cada execução.
Criar uma instância de contêiner da CLI do Azure
O modelo ARM a seguir cria uma instância de contêiner e um compartilhamento de arquivos e, em seguida, monta o compartilhamento de arquivos na imagem do contêiner:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"projectName": {
"type": "string",
"metadata": {
"description": "Specify a project name that is used for generating resource names."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Specify the resource location."
}
},
"containerImage": {
"type": "string",
"defaultValue": "mcr.microsoft.com/azure-cli:2.9.1",
"metadata": {
"description": "Specify the container image."
}
},
"mountPath": {
"type": "string",
"defaultValue": "/mnt/azscripts/azscriptinput",
"metadata": {
"description": "Specify the mount path."
}
}
},
"variables": {
"storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
"fileShareName": "[format('{0}share', parameters('projectName'))]",
"containerGroupName": "[format('{0}cg', parameters('projectName'))]",
"containerName": "[format('{0}container', parameters('projectName'))]"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {
"accessTier": "Hot"
}
},
{
"type": "Microsoft.Storage/storageAccounts/fileServices/shares",
"apiVersion": "2022-09-01",
"name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2023-05-01",
"name": "[variables('containerGroupName')]",
"location": "[parameters('location')]",
"properties": {
"containers": [
{
"name": "[variables('containerName')]",
"properties": {
"image": "[parameters('containerImage')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGB": "[json('1.5')]"
}
},
"ports": [
{
"protocol": "TCP",
"port": 80
}
],
"volumeMounts": [
{
"name": "filesharevolume",
"mountPath": "[parameters('mountPath')]"
}
],
"command": [
"/bin/bash",
"-c",
"echo hello; sleep 1800"
]
}
}
],
"osType": "Linux",
"volumes": [
{
"name": "filesharevolume",
"azureFile": {
"readOnly": false,
"shareName": "[variables('fileShareName')]",
"storageAccountName": "[variables('storageAccountName')]",
"storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value]"
}
}
]
},
"dependsOn": [
"storageAccount"
]
}
]
}
O valor padrão para o caminho de montagem é /mnt/azscripts/azscriptinput
. Este é o caminho na instância do contêiner onde ele é montado no compartilhamento de arquivos.
A imagem de contêiner padrão especificada no modelo é mcr.microsoft.com/azure-cli:2.9.1. 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). Leva cerca de um mês para certificar uma imagem de CLI para um 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 utilizar uma versão não suportada, a mensagem de erro lista as versões suportadas.
O modelo suspende a instância do contêiner após 1.800 segundos. Você tem 30 minutos antes que a instância do contêiner entre em um estado terminal e a sessão termine.
Para implantar o modelo:
$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"
New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName
Carregue o script de implantação
Carregue seu script de implantação para a conta de armazenamento. Este é um exemplo do PowerShell:
$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"
$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"
$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force
Você também pode carregar o arquivo usando o portal do Azure ou a CLI do Azure.
Testar o script de implantação
No portal do Azure, abra o grupo de recursos onde você implantou a instância de contêiner e a conta de armazenamento.
Abra o grupo de contêineres. O nome do grupo de contêineres padrão é o nome do projeto anexado com cg. A instância do contêiner é mostrada no estado Running .
No menu de recursos, selecione Contêineres. O nome da instância do contêiner é o nome do projeto anexado ao contêiner.
Selecione Conectar e, em seguida, selecione Conectar. Se você não conseguir se conectar à instância do contêiner, reinicie o grupo de contêineres e tente novamente.
No painel do console, execute os seguintes comandos:
cd /mnt/azscripts/azscriptinput ls ./hello.sh John Dole
A saída é Olá John Dole.
Usar o Docker
Você pode usar uma imagem de contêiner do Docker pré-configurada como seu ambiente de desenvolvimento de script de implantação. Para instalar o Docker, consulte Obter o Docker. Você também precisa configurar o compartilhamento de arquivos para montar o diretório, que contém os scripts de implantação no contêiner do Docker.
Puxe a imagem do contêiner do script de implantação para o computador local:
docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
O exemplo usa a versão PowerShell 4.3.0.
Para extrair uma imagem CLI de um MCR:
docker pull mcr.microsoft.com/azure-cli:2.0.80
Este exemplo usa a versão CLI 2.0.80. O script de implantação usa as imagens de contêineres de CLI padrão encontradas aqui.
Execute a imagem do Docker localmente.
docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
Substitua a letra> do driver do host e< o nome> do diretório do host por uma pasta existente na unidade compartilhada.< Ele mapeia a pasta para a pasta /data no contêiner. Por exemplo, para mapear D:\docker:
docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
-significa manter viva a imagem do recipiente.
Um exemplo de CLI:
docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
A captura de tela a seguir mostra como executar um script do PowerShell, dado que você tem um arquivo helloworld.ps1 na unidade compartilhada.
Depois que o script for testado com êxito, você poderá usá-lo como um script de implantação em seus modelos.
Próximos passos
Neste artigo, você aprendeu a usar scripts de implantação. Para percorrer um tutorial de script de implantação: