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.

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 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 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": "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'))]"
      ]
    }
  ]
}

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. Ci vogliono 30 minuti perché l'istanza di contenitore passi in stato di terminazione 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. 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.

    Screenshot dell'opzione di connessione dell'istanza del contenitore dello script di distribuzione nella 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 dell'istanza del contenitore connect dello script di distribuzione visualizzato nella console.

Usare un'istanza di contenitore dell'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.

Usare un'istanza di contenitore dell'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": "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"
      ]
    }
  ]
}

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

    Screenshot dell'opzione di connessione dell'istanza del contenitore dello script di distribuzione nella 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:az4.3
    

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

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

  2. Eseguire l'immagine di 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. 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:az4.3
    

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

Una volta testato correttamente lo script, è possibile usarlo come script di distribuzione nel modello.

Passaggi successivi

In questo articolo si è appreso come usare gli script di distribuzione. Per esaminare un'esercitazione relativa a uno script di distribuzione: