Condividi tramite


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 dell'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.

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@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

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

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-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 del 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 del contenitore dopo 1.800 secondi. Si hanno 30 minuti di tempo prima che l'istanza del contenitore passi allo stato terminato e la sessione si concluda.

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.

    Screenshot dell'opzione di connessione dell'istanza del 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.

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

Usare un'istanza del contenitore dell'interfaccia della riga di comando di Azure

Per creare script dell'interfaccia della riga di comando di Azure nel computer, creare un account di archiviazione e montare l'account di archiviazione nell'istanza del 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 script di distribuzione crea un nome univoco come condivisione file in ogni esecuzione.

Creare un'istanza del contenitore dell'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@2023-04-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

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

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-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 del 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 dell'interfaccia della riga di comando disponibili del Registro Microsoft Container (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, vedere Note sulla versione dell'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 del contenitore dopo 1.800 secondi. Si hanno 30 minuti prima che l'istanza del contenitore entri in uno stato del terminale e 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.

    Screenshot dell'opzione di connessione dell'istanza del 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
    ./hello.sh John Dole
    

    L'output è Hello John Dole.

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

Usare 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. Eseguire il pull dell'immagine del contenitore dello script di distribuzione nel computer locale:

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
    

    Nell'esempio viene usata la versione di PowerShell 4.3.0.

    Per eseguire il pull di un'immagine dell'interfaccia della riga di comando 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. Esegue il mapping della cartella nella cartella /data del 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.

    Esempio di interfaccia della riga di comando:

    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: