Configurare l'ambiente di sviluppo per gli script di distribuzione nei file Bicep

Informazioni su come creare un ambiente di sviluppo per lo sviluppo e il test di script di distribuzione con un'immagine dello script di distribuzione. È possibile creare un'istanza del contenitore di Azure o usare Docker. Entrambe le opzioni sono illustrate in questo articolo.

Prerequisiti

Contenitore di Azure PowerShell

Se non si ha 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
param([string] $name, [string] $subscription)
$output = 'Hello {0}' -f $name
#Write-Output $output

Connect-AzAccount -UseDeviceAuthentication
Set-AzContext -subscription $subscription

$kv = Get-AzKeyVault
#Write-Output $kv

$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['greeting'] = $output
$DeploymentScriptOutputs['kv'] = $kv.resourceId
Write-Output $DeploymentScriptOutputs

In uno script di distribuzione di Azure PowerShell la variabile $DeploymentScriptOutputs viene usata per archiviare i valori di output. Per altre informazioni sull'uso degli output di Azure PowerShell, vedere Usare gli 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 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'

In uno script di distribuzione dell'interfaccia della riga di comando di Azure, una variabile di ambiente denominata AZ_SCRIPTS_OUTPUT_PATH archivia il percorso 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 Usare gli output degli script dell'interfaccia della riga di comando.

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.

Usare l'istanza del contenitore di Azure PowerShell

Per creare script di Azure PowerShell nel computer, è necessario creare un account di archiviazione e montare l'account di archiviazione nell'istanza del contenitore. In modo da poter caricare lo script nell'account di archiviazione ed eseguire lo script nell'istanza del contenitore. 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 del contenitore di Azure PowerShell

Il file Bicep seguente crea un'istanza del contenitore e una condivisione file e quindi monta la condivisione file nell'immagine del contenitore.

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2025-06-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2025-09-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/sh'
            '-c'
            'pwsh -c \'Start-Sleep -Seconds 1800\''
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

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 file Bicep è mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Vedere un elenco di tutte le versioni di Azure PowerShell supportate.

Il file Bicep sospende l'istanza di contenitore dopo 1.800 secondi. Hai 30 minuti prima che l'istanza del contenitore entri nello stato terminato e la sessione termini.

Usare lo script seguente per distribuire il file Bicep:

$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 Bicep 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

È anche possibile 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 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
    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.

Usa un'istanza di contenitore di interfaccia della riga di comando di Azure

Per scrivere script di interfaccia della riga di comando di Azure sul computer, crea un account di archiviazione e monta l'account di archiviazione nell'istanza contenitore. È quindi possibile caricare lo script nell'account di archiviazione ed eseguire lo script nell'istanza del contenitore. 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 dello script di distribuzione crea un nome univoco per una condivisione di file a ogni esecuzione.

Creare un'istanza di contenitore di interfaccia della riga di comando di Azure

Il file Bicep seguente crea un'istanza del contenitore e una condivisione file e quindi monta la condivisione file nell'immagine del contenitore:

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azure-cli:2.9.1'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileshare 'Microsoft.Storage/storageAccounts/fileServices/shares@2025-06-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2025-09-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/bash'
            '-c'
            'echo hello; sleep 1800'
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

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 file Bicep è mcr.microsoft.com/azure-cli:2.9.1. Vedere un elenco delle versioni supportate dell'interfaccia della riga di comando di Azure. Lo script di distribuzione usa le immagini CLI disponibili in 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, il messaggio di errore elenca le versioni supportate.

Il file Bicep sospende l'istanza di contenitore dopo 1.800 secondi. Sono disponibili 30 minuti prima che l'istanza di container entri in uno stato finale e che la sessione termini.

Per distribuire il file Bicep:

$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 Bicep 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. Lo script seguente è 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:az10.0
    

    Nell'esempio viene usata la versione di PowerShell 4.3.0.

    Per scaricare un'immagine CLI da un MCR:

    docker pull mcr.microsoft.com/azure-cli:2.52.0
    

    Questo esempio usa la versione CLI 2.52.0. Lo script di distribuzione usa le immagini predefinite dei contenitori CLI.

  2. Eseguire l'immagine di Docker localmente.

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

    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:az10.0
    

    -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.52.0
    
  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 che lo script è stato testato con successo, è possibile utilizzarlo come script di distribuzione nei file Bicep.

Passaggi successivi

In questo articolo si è appreso come creare ambienti di sviluppo di script. Per altre informazioni, vedere: