Configurare l'ambiente di sviluppo per gli script di distribuzione nei modelli di ARM

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

  1. Nel portale di Azure, aprire il gruppo di risorse in cui è stata distribuita l'istanza di contenitore e l'account di archiviazione.

  2. 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 .

  3. Nel menu della risorsa selezionare Contenitori. Il nome dell'istanza di contenitore è il nome del progetto aggiunto con il contenitore.

    Schermata dell'opzione per connettere un'istanza di contenitore dello script di distribuzione nel portale di Azure.

  4. Selezionare Connettie poi Connetti. Se non è possibile connettersi all'istanza di contenitore, riavviare il gruppo di contenitori e riprovare.

  5. Nel riquadro della console eseguire i comandi seguenti:

    cd /mnt/azscripts/azscriptinput
    ls
    pwsh ./hello.ps1 "John Dole"
    

    L'output è Hello John Dole.

    Schermata dell'output del test dello script di distribuzione connessione dell'istanza di contenitore visualizzato nella console.

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

  1. Nel portale di Azure, aprire il gruppo di risorse in cui è stata distribuita l'istanza di contenitore e l'account di archiviazione.

  2. 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 .

  3. Nel menu della risorsa selezionare Contenitori. Il nome dell'istanza di contenitore è il nome del progetto aggiunto con il contenitore.

    Schermata dell'opzione per connettere l'istanza del contenitore nello script di distribuzione nel portale di Azure.

  4. Selezionare Connettie poi Connetti. Se non è possibile connettersi all'istanza di contenitore, riavviare il gruppo di contenitori e riprovare.

  5. Nel riquadro della console eseguire i comandi seguenti:

    cd /mnt/azscripts/azscriptinput
    ls
    ./hello.sh John Dole
    

    L'output è Hello John Dole.

    Schermata dell'output del test dello script di distribuzione istanza di contenitore visualizzato nella console.

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.

  1. Scaricare l'immagine del contenitore dello script di distribuzione sul computer locale:

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    Nell'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.80
    

    Questo esempio utilizza la versione CLI 2.0.80. Lo script di distribuzione usa le immagini predefinite dei contenitori CLI trovate qui.

  2. Esegui l'immagine Docker localmente.

    docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    Sostituire <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.80
    
  3. Lo screenshot seguente mostra come eseguire uno script di PowerShell, dato che è presente un file helloworld.ps1 nell’unità condivisa.

    Screenshot dello script di distribuzione del modello di Resource Manager con il comando Docker.

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: