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

Questo articolo illustra come usare Azure PowerShell con modelli di Resource Manager per distribuire risorse in Azure.This topic explains how to use Azure PowerShell with Resource Manager templates to deploy your resources to Azure. Per comprendere i concetti di distribuzione e gestione delle soluzioni di Azure, vedere Panoramica di Azure Resource Manager.If you are not familiar with the concepts of deploying and managing your Azure solutions, see Azure Resource Manager overview.

Il modello di Resource Manager che si distribuisce può essere un file locale nel computer o un file esterno che si trova in un repository come GitHub.The Resource Manager template you deploy can either be a local file on your machine, or an external file that is located in a repository like GitHub. Il modello che viene distribuito in questo articolo è disponibile nella sezione Modello di esempio o come modello di account di archiviazione in GitHub.The template you deploy in this article is available in the Sample template section, or as storage account template in GitHub.

Se necessario, installare il modulo Azure PowerShell usando le istruzioni disponibili nella Guida di Azure PowerShell e quindi eseguire Login-AzureRmAccount per creare una connessione con Azure.If needed, install the Azure PowerShell module using the instructions found in the Azure PowerShell guide, and then run Login-AzureRmAccount to create a connection with Azure. È inoltre necessario disporre di una chiave pubblica SSH denominata id_rsa.pub nella directory .ssh del profilo utente.Also, you need to have an SSH public key named id_rsa.pub in the .ssh directory of your user profile.

Distribuire un modello dal computer localeDeploy a template from your local machine

Per distribuire le risorse in Azure, seguire questa procedura:When deploying resources to Azure, you:

  1. Accedere all'account AzureLog in to your Azure account
  2. Creare un gruppo di risorse che funge da contenitore per le risorse distribuite.Create a resource group that 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 cannot end in a period.
  3. Distribuire nel gruppo di risorse il modello che definisce le risorse da creare.Deploy to the resource group the template that defines the resources to create

Un modello può includere parametri che consentono di personalizzare la distribuzione.A template can include parameters that enable you to customize the deployment. Può includere ad esempio valori specifici per un determinato ambiente (di sviluppo, test e produzione).For example, you can provide values that are tailored for a particular environment (such as dev, test, and production). Il modello di esempio definisce un parametro per lo SKU dell'account di archiviazione.The sample template defines a parameter for the storage account SKU.

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:

Login-AzureRmAccount

Select-AzureRmSubscription -SubscriptionName <yourSubscriptionName>

New-AzureRmResourceGroup -Name ExampleResourceGroup -Location "South Central US"
New-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.json -storageAccountType Standard_GRS

Per il completamento della distribuzione sarà necessario attendere alcuni minuti.The deployment can take a few minutes to complete. Al termine, viene visualizzato un messaggio che include il risultato:When it finishes, you see a message that includes the result:

ProvisioningState       : Succeeded

Distribuire un modello da un'origine esternaDeploy a template from an external source

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.

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

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 riservati.The preceding example requires a publicly accessible URI for the template, which works for most scenarios because your template should not 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 do not 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.

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 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ù file dei parametri per scenari di distribuzione diversi e successivamente passare il file dei parametri appropriato.You can create multiple parameter files for different deployment scenarios, and then pass in the appropriate parameter file.

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-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.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-AzureRmResourceGroupDeployment -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

È 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 cannot 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 cannot include in the parameter file, either add that value to a key vault, or dynamically provide all parameter values inline.

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-AzureRmResourceGroupDeployment.For example, a parameter named ResourceGroupName in your template conflicts with the ResourceGroupName parameter in the New-AzureRmResourceGroupDeployment cmdlet. Verrà quindi richiesto di fornire un valore per ResourceGroupNameFromTemplate.You are 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 una distribuzione del modelloTest a template deployment

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-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.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. Il tentativo, ad esempio, di passare un valore non corretto per lo SKU dell'account di archiviazione, restituisce l'errore seguente:For example, attempting to pass an incorrect value for the storage account SKU, returns the following error:

Test-AzureRmResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\storage.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 could not 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-AzureRmResourceGroupDeployment : After parsing a value an unexpected character was encountered: 
  ". Path 'variables', line 31, position 3.

Distribuzioni incrementali e completeIncremental and complete deployments

Quando si distribuiscono le risorse, specificare se la distribuzione è un aggiornamento incrementale o completo.When deploying your resources, you specify that the deployment is either an incremental update or a complete update. La differenza principale tra le due modalità è il modo in cui Resource Manager gestisce le risorse esistenti nel gruppo di risorse che non sono presenti nel modello:The primary difference between these two modes is how Resource Manager handles existing resources in the resource group that are not in the template:

  • Nella modalità di completamento, Resource Manager elimina le risorse esistenti nel gruppo di risorse che non sono specificate nel modello.In complete mode, Resource Manager deletes resources that exist in the resource group but are not specified in the template.
  • Nella modalità incrementale, Resource Manager lascia invariate le risorse esistenti nel gruppo di risorse che non sono specificate nel modello.In incremental mode, Resource Manager leaves unchanged resources that exist in the resource group but are not specified in the template.

Per entrambe le modalità, Resource Manager prova a effettuare il provisioning di tutte le risorse specificate nel modello.For both modes, Resource Manager attempts to provision all resources specified in the template. Se la risorsa esiste già nel gruppo di risorse e le relative impostazioni sono identiche, l'operazione non comporta alcuna modifica.If the resource already exists in the resource group and its settings are unchanged, the operation results in no change. Se si modificano le impostazioni per una risorsa, il provisioning viene effettuato con le nuove impostazioni della risorsa.If you change the settings for a resource, the resource is provisioned with those new settings. Se si prova ad aggiornare il percorso o il tipo di una risorsa esistente, la distribuzione ha esito negativo e restituisce un errore.If you attempt to update the location or type of an existing resource, the deployment fails with an error. È invece necessario distribuire una nuova risorsa con il percorso o il tipo necessari.Instead, deploy a new resource with the location or type that you need.

Per impostazione predefinita, Resource Manager usa la modalità incrementale.By default, Resource Manager uses the incremental mode.

Per illustrare la differenza tra le modalità incrementale e completa, si consideri lo scenario seguente.To illustrate the difference between incremental and complete modes, consider the following scenario.

Il gruppo di risorse esistente contiene:Existing Resource Group contains:

  • Risorsa AResource A
  • Risorsa BResource B
  • Risorsa CResource C

Il modello definisce:Template defines:

  • Risorsa AResource A
  • Risorsa BResource B
  • Risorsa DResource D

Quando viene implementato in modalità incrementale, il gruppo di risorse contiene:When deployed in incremental mode, the resource group contains:

  • Risorsa AResource A
  • Risorsa BResource B
  • Risorsa CResource C
  • Risorsa DResource D

Quando viene implementato in modalità completa, la risorsa C viene eliminata.When deployed in complete mode, Resource C is deleted. Il gruppo di risorse contiene:The resource group contains:

  • Risorsa AResource A
  • Risorsa BResource B
  • Risorsa DResource D

Per usare la modalità completa, usare il parametro Mode:To use complete mode, use the Mode parameter:

New-AzureRmResourceGroupDeployment -Mode Complete -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup -TemplateFile c:\MyTemplates\storage.json 

Modello di esempioSample template

Il modello seguente viene usato per gli esempi in questo argomento.The following template is used for the examples in this topic. Copiarlo e salvarlo come file denominato storage.json.Copy and save it as a file named storage.json. Per informazioni su come creare questo modello, vedere Creare il primo modello di Azure Resource Manager.To understand how to create this template, see Create your first Azure Resource Manager template.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Storage Account type"
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "apiVersion": "2016-01-01",
      "location": "[resourceGroup().location]",
      "sku": {
          "name": "[parameters('storageAccountType')]"
      },
      "kind": "Storage", 
      "properties": {
      }
    }
  ],
  "outputs": {
      "storageAccountName": {
          "type": "string",
          "value": "[variables('storageAccountName')]"
      }
  }
}

Passaggi successiviNext steps