Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Informazioni su come creare un ambiente di sviluppo per sviluppare e testare gli script di distribuzione dei modelli di ARM con un'immagine dello script di distribuzione. È possibile creare un'istanza di contenitore di Azure o usare Docker. Entrambe le opzioni sono illustrate in questo articolo.
Importante
I log degli script di distribuzione possono includere contenuti scritti su Write-Host, echo, stdout, e stderr. Potresti recuperare queste informazioni tramite l'endpoint /deploymentScripts/logs o API correlate. Non scrivere informazioni sensibili nell'output dello script, inclusi access token, bearer token, token SAS, stringhe di connessione, credenziali o altri segreti. Gli autori degli script sono responsabili di garantire che i log degli script di distribuzione non espongano informazioni sensibili.
Prerequisiti
Contenitore di Azure PowerShell
Se non si dispone di uno script di distribuzione di Azure PowerShell, è possibile creare un file hello.ps1 usando il contenuto seguente:
param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
Contenitore di interfaccia della riga di comando di Azure
Per un'immagine del contenitore dell'interfaccia della riga di comando di Azure, è possibile creare un file file hello.sh usando il contenuto seguente:
FIRSTNAME=$1
LASTNAME=$2
OUTPUT="{\"name\":{\"displayName\":\"$FIRSTNAME $LASTNAME\",\"firstName\":\"$FIRSTNAME\",\"lastName\":\"$LASTNAME\"}}"
echo -n "Hello "
echo $OUTPUT | jq -r '.name.displayName'
Nota
Quando si esegue uno script di distribuzione dell'interfaccia della riga di comando di Azure, una variabile di ambiente denominata AZ_SCRIPTS_OUTPUT_PATH archivia la posizione del file di output dello script. La variabile di ambiente non è disponibile nel contenitore dell'ambiente di sviluppo. Per altre informazioni sull'uso degli output dell'interfaccia della riga di comando di Azure, vedere Operare con gli output dallo script dell'interfaccia della riga di comando.
Usare l'istanza di contenitore di Azure PowerShell
Per creare gli script nel computer, è necessario creare un account di archiviazione e montare l'account di archiviazione nell'istanza di contenitore. In modo da poter caricare lo script nell'account di archiviazione ed eseguire lo script nell'istanza di contenitore.
Nota
L'account di archiviazione creato per testare lo script non è lo stesso account di archiviazione usato dal servizio script di distribuzione per eseguire lo script. Il servizio script di distribuzione crea un nome univoco come condivisione file in ogni esecuzione.
Creare un'istanza di contenitore di Azure PowerShell
Il seguente modello di Azure Resource Manager (modello di ARM) crea un'istanza di contenitore e una condivisione file e quindi monta la condivisione file nell'immagine del contenitore.
{
"$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": "2025-06-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {
"accessTier": "Hot"
}
},
{
"type": "Microsoft.Storage/storageAccounts/fileServices/shares",
"apiVersion": "2025-06-01",
"name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2025-09-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'))]"
]
}
]
}
Il valore predefinito per il percorso di montaggio è /mnt/azscripts/azscriptinput. Questo è il percorso nell'istanza di contenitore in cui è montato nella condivisione file.
L'immagine del contenitore predefinita specificata nel modello è mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Vedere un elenco di tutte le versioni di Azure PowerShell supportate.
Il modello sospende l'istanza di contenitore dopo 1.800 secondi. Sono disponibili 30 minuti prima che l'istanza di container entri in uno stato terminato e che la sessione termini.
Per distribuire il modello:
$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
Caricare lo script di distribuzione
Caricare lo script di distribuzione nell'account di archiviazione. Ecco un esempio di script di 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
È possibile anche caricare il file usando il portale di Azure o l'interfaccia della riga di comando di Azure.
Testare lo script di distribuzione
Nel portale di Azure, aprire il gruppo di risorse in cui è stata distribuita l'istanza di contenitore e l'account di archiviazione.
Aprire il gruppo di contenitori. Il nome del gruppo di contenitori predefinito è il nome del progetto aggiunto con cg. L'istanza di contenitore si trova in stato In esecuzione .
Nel menu della risorsa selezionare Contenitori. Il nome dell'istanza di contenitore è il nome del progetto aggiunto con il contenitore.
Selezionare Connettie poi Connetti. Se non è possibile connettersi all'istanza di contenitore, riavviare il gruppo di contenitori e riprovare.
Nel riquadro della console eseguire i comandi seguenti:
cd /mnt/azscripts/azscriptinput ls pwsh ./hello.ps1 "John Dole"L'output è Hello John Dole.
Utilizzare un'istanza di contenitore di interfaccia della riga di comando di Azure
Per creare gli script nel computer, creare un account di archiviazione e montare l'account di archiviazione nell'istanza di contenitore. È quindi possibile caricare lo script nell'account di archiviazione ed eseguire lo script nell'istanza di contenitore.
Nota
L'account di archiviazione creato per testare lo script non è lo stesso account di archiviazione usato dal servizio script di distribuzione per eseguire lo script. Il servizio script di distribuzione crea un nome univoco come condivisione file in ogni esecuzione.
Creare un'istanza di contenitore di interfaccia della riga di comando di Azure
Il seguente modello di ARM crea un'istanza di contenitore e una condivisione file e quindi monta la condivisione file nell'immagine del contenitore.
{
"$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": "2025-06-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {
"accessTier": "Hot"
}
},
{
"type": "Microsoft.Storage/storageAccounts/fileServices/shares",
"apiVersion": "2025-06-01",
"name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2025-09-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": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
}
]
}
Il valore predefinito per il percorso di montaggio è /mnt/azscripts/azscriptinput. Questo è il percorso nell'istanza di contenitore in cui è montato nella condivisione file.
L'immagine del contenitore predefinita specificata nel modello è mcr.microsoft.com/azure-cli:2.9.1. Vedere un elenco delle versioni supportate dell'interfaccia della riga di comando di Azure.
Importante
Lo script di distribuzione utilizza le immagini CLI disponibili nel Microsoft Container Registry (MCR). La certificazione di un'immagine dell'interfaccia della riga di comando per uno script di distribuzione richiede circa un mese. Non usare le versioni dell'interfaccia della riga di comando rilasciate negli ultimi 30 giorni. Per trovare le date di rilascio delle immagini, consulta le note sulla versione di interfaccia della riga di comando di Azure. Se si usa una versione non supportata, nel messaggio di errore vengono elencate le versioni supportate.
Il modello sospende l'istanza di contenitore dopo 1.800 secondi. Ci vogliono 30 minuti perché l'istanza di contenitore passi in stato terminale e termini la sessione.
Per distribuire il modello:
$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
Caricare lo script di distribuzione
Caricare lo script di distribuzione nell'account di archiviazione. Di seguito è riportato un esempio di 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
È possibile anche caricare il file usando il portale di Azure o l'interfaccia della riga di comando di Azure.
Testare lo script di distribuzione
Nel portale di Azure, aprire il gruppo di risorse in cui è stata distribuita l'istanza di contenitore e l'account di archiviazione.
Aprire il gruppo di contenitori. Il nome del gruppo di contenitori predefinito è il nome del progetto aggiunto con cg. L'istanza di contenitore viene visualizzata nello stato Esecuzione .
Nel menu della risorsa selezionare Contenitori. Il nome dell'istanza di contenitore è il nome del progetto aggiunto con il contenitore.
Selezionare Connettie poi Connetti. Se non è possibile connettersi all'istanza di contenitore, riavviare il gruppo di contenitori e riprovare.
Nel riquadro della console eseguire i comandi seguenti:
cd /mnt/azscripts/azscriptinput ls ./hello.sh John DoleL'output è Hello John Dole.
Usa Docker
È possibile usare un'immagine del contenitore Docker preconfigurata come ambiente di sviluppo dello script di distribuzione. Per installare Docker, vedere Ottenere Docker. È anche necessario configurare la condivisione file per montare la directory che contiene gli script di distribuzione nel contenitore Docker.
Scaricare l'immagine del contenitore dello script di distribuzione sul computer locale:
docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3Nell'esempio viene usata la versione di PowerShell 4.3.0.
Per scaricare un'immagine CLI da MCR:
docker pull mcr.microsoft.com/azure-cli:2.0.80Questo esempio utilizza la versione CLI 2.0.80. Lo script di distribuzione usa le immagini predefinite dei contenitori CLI trovate qui.
Esegui l'immagine Docker localmente.
docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3Sostituire <lettera unità host> e <nome directory host> con una cartella esistente nell'unità condivisa. Mappa la cartella alla cartella /data nel contenitore. Per esempio, per eseguire il mapping di D:\docker:
docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3-it indica di mantenere attiva l'immagine del contenitore.
Un esempio di CLI:
docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80Lo screenshot seguente mostra come eseguire uno script di PowerShell, dato che è presente un file helloworld.ps1 nell’unità condivisa.
Dopo aver testato correttamente lo script, puoi usarlo come script di distribuzione nei tuoi modelli.
Passaggi successivi
In questo articolo si è appreso come usare gli script di distribuzione. Per seguire un tutorial sullo script di distribuzione: