Distribuire le risorse con i modelli di Azure Resource Manager e Azure PowerShellDeploy resources with Resource Manager templates and Azure PowerShell

Si vedrà ora come usare Azure PowerShell con i modelli di Resource Manager per distribuire risorse in Azure.Learn how to use Azure PowerShell with Resource Manager templates to deploy your resources to Azure. Per altre informazioni sui concetti di distribuzione e gestione delle soluzioni di Azure, vedere Panoramica di Azure Resource Manager.For more information about the concepts of deploying and managing your Azure solutions, see Azure Resource Manager overview.

Per distribuire un modello, occorrono in genere due passaggi:To deploy a template, you typically need two steps:

  1. Creare un gruppo di risorse.Create a resource group. Il gruppo di risorse funge da contenitore per le risorse distribuite.Resource group serves as the container for the deployed resources. Il nome del gruppo di risorse può contenere solo caratteri alfanumerici, punti, caratteri di sottolineatura, trattini e parentesi.The name of the resource group can only include alphanumeric characters, periods, underscores, hyphens, and parenthesis. Può contenere fino a 90 caratteri.It can be up to 90 characters. Non può terminare con un punto.It can't end in a period.
  2. Distribuire un modello.Deploy a template. Il modello definisce le risorse da creare.The template defines the resources to create. La distribuzione crea le risorse nel gruppo di risorse specificato.The deployment creates the resources in the resource group specified.

Questo metodo di distribuzione in due passaggi viene usato in questo articolo.This two-step deployment method is used in this article. L'altra opzione consiste nel distribuire un gruppo di risorse e le risorse contemporaneamente.The other option is to deploy a resource group and the resources at the same time. Per altre informazioni, vedere Creare un gruppo di risorse e distribuire risorse.For more information, see Create resource group and deploy resources.

PrerequisitiPrerequisites

A meno che non si usi Azure Cloud Shell per distribuire i modelli, è necessario installare Azure PowerShell e connettersi ad Azure:Unless you use the Azure Cloud shell to deploy templates, you need to install Azure PowerShell and connect to Azure:

Nota

Questo articolo è stato aggiornato per usare il nuovo modulo Az di Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Per altre informazioni sul nuovo modulo Az e sulla compatibilità di AzureRM, vedere Introduzione del nuovo modulo Az di Azure PowerShell.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Per istruzioni sull'installazione, vedere Installare Azure PowerShell.For installation instructions, see Install Azure PowerShell.

Distribuire modelli archiviati in localeDeploy templates stored locally

L'esempio seguente crea un gruppo di risorse e distribuisce un modello dal computer locale:The following example creates a resource group, and deploys a template from your local machine:

$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json

Si noti che c:\MyTemplates\azuredeploy.json è un modello di avvio rapido.Note c:\MyTemplates\azuredeploy.json is a quickstart template. Vedere Prerequisiti.See Prerequisites.

Per il completamento della distribuzione sarà necessario attendere alcuni minuti.The deployment can take a few minutes to complete.

Distribuire modelli archiviati esternamenteDeploy templates stored externally

Anziché archiviare i modelli di Resource Manager nel computer locale, è consigliabile archiviarli in una posizione esterna,Instead of storing Resource Manager templates on your local machine, you may prefer to store them in an external location. ad esempio in un repository di controllo del codice sorgente come GitHub.You can store templates in a source control repository (such as GitHub). o, in alternativa, archiviarli in un account di archiviazione di Azure per consentire l'accesso condiviso nell'organizzazione.Or, you can store them in an Azure storage account for shared access in your organization.

Per distribuire un modello esterno, usare il parametro TemplateUri.To deploy an external template, use the TemplateUri parameter. Usare l'URI indicato nell'esempio per distribuire il modello di esempio da GitHub.Use the URI in the example to deploy the sample template from GitHub.

$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json

L'esempio precedente richiede l'utilizzo di un URI accessibile pubblicamente per il modello, che funziona per la maggior parte degli scenari. Il proprio modello non deve infatti includere dati sensibili.The preceding example requires a publicly accessible URI for the template, which works for most scenarios because your template shouldn't include sensitive data. Se è necessario specificare dati riservati, ad esempio una password di amministratore, passare il valore come parametro protetto.If you need to specify sensitive data (like an admin password), pass that value as a secure parameter. Se invece si preferisce che il modello usato non sia accessibile pubblicamente, è possibile proteggerlo archiviandolo in un contenitore di archiviazione privato.However, if you don't want your template to be publicly accessible, you can protect it by storing it in a private storage container. Per informazioni sulla distribuzione di un modello che richiede un token di firma di accesso condiviso (SAS), vedere Distribuire un modello privato con un token di firma di accesso condiviso.For information about deploying a template that requires a shared access signature (SAS) token, see Deploy private template with SAS token. Per eseguire un'esercitazione, vedere Esercitazione: Integrare Azure Key Vault in Distribuzione modelli di Resource Manager.To go through a tutorial, see Tutorial: Integrate Azure Key Vault in Resource Manager Template deployment.

Distribuire modelli da Azure Cloud ShellDeploy templates from Azure Cloud shell

È possibile usare Azure Cloud Shell per distribuire il modello.You can use the Azure Cloud Shell to deploy your template. Per distribuire un modello esterno, specificare l'URI del modello.To deploy an external template, provide the URI of the template. Per distribuire un modello locale, è innanzitutto necessario caricare il modello nell'account di archiviazione per Cloud Shell.To deploy a local template, you must first load your template into the storage account for your Cloud Shell. Per caricare i file nella shell, selezionare l'icona del menu Carica/Scarica file dalla finestra della shell.To upload files to the shell, select the Upload/Download files menu icon from the shell window.

Per aprire Cloud Shell, passare a https://shell.azure.com oppure selezionare Prova dalla sezione di codice seguente:To open the Cloud shell, browse to https://shell.azure.com, or select Try-It from the following code section:

$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json

Per incollare il codice nella shell, fare clic con il pulsante destro del mouse all'interno della shell e quindi scegliere Incolla.To paste the code into the shell, right-click inside the shell and then select Paste.

Eseguire la distribuzione in più gruppi di risorse o sottoscrizioniDeploy to multiple resource groups or subscriptions

In genere si distribuiscono tutte le risorse del modello in un unico gruppo di risorse,Typically, you deploy all the resources in your template to a single resource group. ma in alcuni scenari può essere preferibile distribuire insieme un set di risorse, inserendole tuttavia in gruppi di sottoscrizioni e risorse diversi.However, there are scenarios where you want to deploy a set of resources together but place them in different resource groups or subscriptions. Un'unica distribuzione può interessare solo cinque gruppi di risorse.You can deploy to only five resource groups in a single deployment. Per altre informazioni, vedere Distribuire le risorse di Azure in più gruppi di sottoscrizioni e risorse.For more information, see Deploy Azure resources to multiple resource groups and subscriptions.

Eseguire nuovamente la distribuzione se non è riuscitaRedeploy when deployment fails

Quando una distribuzione non riesce, è possibile ridistribuire automaticamente una distribuzione precedente con esito positivo dalla cronologia della distribuzione.When a deployment fails, you can automatically redeploy an earlier, successful deployment from your deployment history. Per specificare la ridistribuzione, usare il parametro -RollbackToLastDeployment o -RollBackDeploymentName nel comando di distribuzione.To specify redeployment, use either the -RollbackToLastDeployment or -RollBackDeploymentName parameter in the deployment command.

Per usare questa opzione, le distribuzioni devono avere nomi univoci in modo che sia possibile identificarle nella cronologia.To use this option, your deployments must have unique names so they can be identified in the history. Se non si dispone di nomi univoci, la distribuzione non riuscita corrente potrebbe sovrascrivere quella eseguita in modo corretto nella cronologia.If you don't have unique names, the current failed deployment might overwrite the previously successful deployment in the history. È possibile usare questa opzione solo con le distribuzioni a livello di radice.You can only use this option with root level deployments. Le distribuzioni di un modello annidato non sono disponibili per la ridistribuzione.Deployments from a nested template aren't available for redeployment.

Per eseguire nuovamente l'ultima distribuzione con esito positivo, aggiungere il parametro -RollbackToLastDeployment come contrassegno.To redeploy the last successful deployment, add the -RollbackToLastDeployment parameter as a flag.

New-AzResourceGroupDeployment -Name ExampleDeployment02 `
  -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json `
  -RollbackToLastDeployment

Per eseguire nuovamente una distribuzione specifica, usare il parametro -RollBackDeploymentName e specificare il nome della distribuzione.To redeploy a specific deployment, use the -RollBackDeploymentName parameter and provide the name of the deployment.

New-AzResourceGroupDeployment -Name ExampleDeployment02 `
  -ResourceGroupName $resourceGroupName `
  -TemplateFile c:\MyTemplates\azuredeploy.json `
  -RollBackDeploymentName ExampleDeployment01

La distribuzione specificata deve aver avuto esito positivo.The specified deployment must have succeeded.

Passare i valori dei parametriPass parameter values

Per passare i valori dei parametri, è possibile usare i parametri inline o un file di parametri.To pass parameter values, you can use either inline parameters or a parameter file. Gli esempi precedenti in questo articolo illustrano i parametri inline.The preceding examples in this article show inline parameters.

Parametri inlineInline parameters

Per passare i parametri inline, specificare i nomi del parametro con il comando New-AzResourceGroupDeployment.To pass inline parameters, provide the names of the parameter with the New-AzResourceGroupDeployment command. Ad esempio, per passare una stringa e una matrice a un modello, usare:For example, to pass a string and array to a template, use:

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\demotemplate.json `
  -exampleString "inline string" `
  -exampleArray $arrayParam

È anche possibile ottenere i contenuti del file e fornire il contenuto come un parametro inline.You can also get the contents of file and provide that content as an inline parameter.

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\demotemplate.json `
  -exampleString $(Get-Content -Path c:\MyTemplates\stringcontent.txt -Raw) `
  -exampleArray $arrayParam

Ottenere un valore di parametro da un file è utile quando è necessario fornire i valori di configurazione.Getting a parameter value from a file is helpful when you need to provide configuration values. Ad esempio, è possibile fornire i valori cloud-init per una macchina virtuale Linux.For example, you can provide cloud-init values for a Linux virtual machine.

File dei parametriParameter files

Invece di passare i parametri come valori inline nello script, può risultare più facile usare un file JSON che contenga i valori dei parametri.Rather than passing parameters as inline values in your script, you may find it easier to use a JSON file that contains the parameter values. Il file dei parametri può essere un file locale o un file esterno con un URI accessibile.The parameter file can be a local file or an external file with an accessible URI.

Il file dei parametri deve essere nel formato seguente:The parameter file must be in the following format:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
     "storageAccountType": {
         "value": "Standard_GRS"
     }
  }
}

Si noti che la sezione dei parametri include un nome di parametro che corrisponde al parametro definito nel modello (storageAccountType).Notice that the parameters section includes a parameter name that matches the parameter defined in your template (storageAccountType). Il file dei parametri contiene un valore per il parametro.The parameter file contains a value for the parameter. Questo valore viene passato automaticamente al modello durante la distribuzione.This value is automatically passed to the template during deployment. È possibile creare più di un file dei parametri e successivamente passare il file dei parametri appropriato per lo scenario.You can create more than one parameter file, and then pass in the appropriate parameter file for the scenario.

Copiare l'esempio precedente e salvarlo come file denominato storage.parameters.json.Copy the preceding example and save it as a file named storage.parameters.json.

Per passare un file dei parametri locale, usare il parametro TemplateParameterFile:To pass a local parameter file, use the TemplateParameterFile parameter:

New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\azuredeploy.json `
  -TemplateParameterFile c:\MyTemplates\storage.parameters.json

Per passare un file dei parametri esterno, usare il parametro TemplateParameterUri:To pass an external parameter file, use the TemplateParameterUri parameter:

New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json `
  -TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.parameters.json

Precedenza dei parametriParameter precedence

È possibile usare i parametri inline e un file di parametri locale nella stessa operazione di distribuzione.You can use inline parameters and a local parameter file in the same deployment operation. Ad esempio, è possibile specificare alcuni valori nel file di parametri locale e aggiungere altri valori inline durante la distribuzione.For example, you can specify some values in the local parameter file and add other values inline during deployment. Se si specificano valori per un parametro sia nel file dei parametri locale che inline, il valore inline ha la precedenza.If you provide values for a parameter in both the local parameter file and inline, the inline value takes precedence.

Tuttavia, quando si usa un file di parametri esterni, non è possibile trasmettere altri valori, né inline né da un file locale.However, when you use an external parameter file, you can't pass other values either inline or from a local file. Quando si specifica un file di parametri nel parametro TemplateParameterUri, tutti i parametri inline vengono ignorati.When you specify a parameter file in the TemplateParameterUri parameter, all inline parameters are ignored. È necessario fornire tutti i valori dei parametri presenti nel file esterno.Provide all parameter values in the external file. Se il modello include un valore importante che non è possibile includere nel file dei parametri, aggiungere tale valore a un insieme di credenziali delle chiavi oppure fornire inline tutti valori dei parametri in modo dinamico.If your template includes a sensitive value that you can't include in the parameter file, either add that value to a key vault, or dynamically provide all parameter values inline.

Conflitti nei nomi di parametroParameter name conflicts

Se il modello include un parametro con lo stesso nome di uno dei parametri nel comando di PowerShell, PowerShell aggiunge al parametro del modello il suffisso FromTemplate.If your template includes a parameter with the same name as one of the parameters in the PowerShell command, PowerShell presents the parameter from your template with the postfix FromTemplate. Ad esempio, un parametro denominato ResourceGroupName nel modello sarà in conflitto con il parametro ResourceGroupName nel cmdlet New-AzResourceGroupDeployment.For example, a parameter named ResourceGroupName in your template conflicts with the ResourceGroupName parameter in the New-AzResourceGroupDeployment cmdlet. Verrà quindi richiesto di fornire un valore per ResourceGroupNameFromTemplate.You're prompted to provide a value for ResourceGroupNameFromTemplate. In generale, è consigliabile evitare questa confusione non attribuendo ai parametri lo stesso nome dei parametri usati per operazioni di distribuzione.In general, you should avoid this confusion by not naming parameters with the same name as parameters used for deployment operations.

Testare le distribuzioni del modelloTest template deployments

Per testare il modello e i valori dei parametri senza distribuire effettivamente le risorse, usare Test-AzureRmResourceGroupDeployment.To test your template and parameter values without actually deploying any resources, use Test-AzureRmResourceGroupDeployment.

Test-AzResourceGroupDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\azuredeploy.json -storageAccountType Standard_GRS

Se non vengono rilevati errori, il comando termina senza una risposta.If no errors are detected, the command finishes without a response. Se viene rilevato un errore, il comando restituisce un messaggio di errore.If an error is detected, the command returns an error message. Ad esempio, passare un valore non corretto per lo SKU dell'account di archiviazione restituisce l'errore seguente:For example, passing an incorrect value for the storage account SKU, returns the following error:

Test-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\azuredeploy.json -storageAccountType badSku

Code    : InvalidTemplate
Message : Deployment template validation failed: 'The provided value 'badSku' for the template parameter 'storageAccountType'
          at line '15' and column '24' is not valid. The parameter value is not part of the allowed value(s):
          'Standard_LRS,Standard_ZRS,Standard_GRS,Standard_RAGRS,Premium_LRS'.'.
Details :

Se il modello contiene un errore di sintassi, il comando restituisce un errore che indica l'impossibilità di analizzare il modello.If your template has a syntax error, the command returns an error indicating it couldn't parse the template. Il messaggio contiene il numero di riga e la posizione dell'errore di analisi.The message indicates the line number and position of the parsing error.

Test-AzResourceGroupDeployment : After parsing a value an unexpected character was encountered: 
  ". Path 'variables', line 31, position 3.

Passaggi successiviNext steps