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 Gestione risorse per distribuire risorse in Azure.This article 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 Connect-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 Connect-AzureRmAccount to create a connection with Azure.

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:

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

Distribuire il modello da Cloud ShellDeploy template from Cloud Shell

È possibile usare Cloud Shell per distribuire il modello.You can use Cloud Shell to deploy your template. Tuttavia, è prima necessario caricare il modello nell'account di archiviazione per Cloud Shell.However, you must first load your template into the storage account for your Cloud Shell. Per informazioni sulla configurazione di Cloud Shell per il primo utilizzo, vedere Panoramica di Azure Cloud Shell.If you have not used Cloud Shell, see Overview of Azure Cloud Shell for information about setting it up.

  1. Accedere al portale di Azure.Sign in to the Azure portal.

  2. Selezionare il gruppo di risorse di Cloud Shell.Select your Cloud Shell resource group. Il modello del nome è cloud-shell-storage-<region>.The name pattern is cloud-shell-storage-<region>.

    Selezionare il gruppo di risorse

  3. Selezionare l'account di archiviazione per Cloud Shell.Select the storage account for your Cloud Shell.

    Selezionare l'account di archiviazione

  4. Selezionare BLOB.Select Blobs.

    Selezionare BLOB

  5. Selezionare + Contenitore.Select + Container.

    Aggiungere il contenitore

  6. Assegnare un nome e un livello di accesso al contenitore.Give your container a name and an access level. Il modello di esempio in questo articolo non contiene informazioni riservate, quindi è consentito l'accesso in lettura anonimo.The sample template in this article contains no sensitive information, so allow anonymous read access. Selezionare OK.Select OK.

    Fornire i valori del contenitore

  7. Selezionare il contenitore creato.Select the container you created.

    Selezionare un nuovo contenitore

  8. Selezionare Carica.Select Upload.

    Caricamento del BLOB

  9. Trovare e caricare il modello.Find and upload your template.

    Caricare il file

  10. Al termine del caricamento, selezionare il modello.After it has uploaded, select the template.

    Selezionare un nuovo modello

  11. Copiare l'URL.Copy the URL.

    Copia l'URL

  12. Aprire il prompt.Open the prompt.

    Aprire Cloud Shell

Immettere i comandi seguenti in Cloud Shell:In the Cloud Shell, use the following commands:

New-AzureRmResourceGroup -Name ExampleResourceGroup -Location "South Central US"
New-AzureRmResourceGroupDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateUri <copied URL> `
  -storageAccountType Standard_GRS

Effettuale la distribuzione in più gruppi di risorse o sottoscrizioniDeploy to more than one resource group or subscription

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 more than one subscription or resource group.

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

Modello di esempioSample template

Il modello seguente viene usato per gli esempi in questo articolo.The following template is used for the examples in this article. 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