Distribuire le risorse con i modelli di Azure Resource Manager e l'interfaccia della riga di comando di AzureDeploy resources with Resource Manager templates and Azure CLI

Questo argomento illustra come usare l'interfaccia della riga di comando di Azure 2.0 con modelli di Resource Manager per distribuire risorse in Azure.This topic explains how to use Azure CLI 2.0 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 a storage account template in GitHub.

Per eseguire questo esempio, verificare di aver installato l'ultima versione dell'interfaccia della riga di comando di Azure 2.0.To run this sample, make sure you have installed the latest Azure CLI 2.0. Per iniziare, eseguire az login per creare una connessione con Azure.To start, run az login to create a connection with Azure.

Questo esempio funziona in una shell Bash.This sample works in a Bash shell. Per le opzioni sull'esecuzione di script dell'interfaccia della riga di comando di Azure nel client Windows, vedere Running the Azure CLI in Windows (Esecuzione dell'interfaccia della riga di comando di Azure in Windows).For options on running Azure CLI scripts on Windows client, see Running the Azure CLI in Windows.

Se l'interfaccia della riga di comando di Azure non è installata, è possibile usare Cloud Shell.If you do not have Azure CLI installed, you can use the Cloud Shell.

Distribuire un modello localeDeploy local template

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:

az login

az group create --name ExampleGroup --location "Central US"
az group deployment create \
    --name ExampleDeployment \
    --resource-group ExampleGroup \
    --template-file storage.json \
    --parameters 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 esternoDeploy external template

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). È possibile, 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 template-uri.To deploy an external template, use the template-uri 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.

az login

az group create --name ExampleGroup --location "Central US"
az group deployment create \
    --name ExampleDeployment \
    --resource-group ExampleGroup \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json" \
    --parameters 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 nella condivisione file per Cloud Shell.However, you must first load your template into the file share 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.Log 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 File.Select Files.

    Selezione dei file

  5. Selezionare la condivisione file per Cloud Shell.Select the file share for Cloud Shell. Il modello del nome è cs-<user>-<domain>-com-<uniqueGuid>.The name pattern is cs-<user>-<domain>-com-<uniqueGuid>.

    Selezionare la condivisione file

  6. Selezionare Aggiungi directory.Select Add directory.

    Aggiungi directory

  7. Assegnare il nome templates e scegliere OK.Name it templates, and select Okay.

    Assegnare il nome alla directory

  8. Selezionare la nuova directory.Select your new directory.

    Selezionare la directory

  9. Selezionare Carica.Select Upload.

    Selezionare Carica

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

    Caricare il file

  11. Aprire il prompt.Open the prompt.

    Aprire Cloud Shell

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

az group create --name examplegroup --location "South Central US"
az group deployment create --resource-group examplegroup --template-file clouddrive/templates/azuredeploy.json --parameters storageAccountType=Standard_GRS

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 @ per specificare un file locale denominato storage.parameters.json.To pass a local parameter file, use @ to specify a local file named storage.parameters.json.

az group deployment create \
    --name ExampleDeployment \
    --resource-group ExampleGroup \
    --template-file storage.json \
    --parameters @storage.parameters.json

Testare una distribuzione del modelloTest a template deployment

Per testare il modello e i valori dei parametri senza distribuire effettivamente le risorse, usare il comando az group deployment validate.To test your template and parameter values without actually deploying any resources, use az group deployment validate.

az group deployment validate \
    --resource-group ExampleGroup \
    --template-file storage.json \
    --parameters @storage.parameters.json

Se non vengono rilevati errori, il comando restituisce informazioni sulla distribuzione di test.If no errors are detected, the command returns information about the test deployment. Si noti nello specifico che il valore dell'errore è null.In particular, notice that the error value is null.

{
  "error": null,
  "properties": {
      ...

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:

{
  "error": {
    "code": "InvalidTemplate",
    "details": null,
    "message": "Deployment template validation failed: 'The provided value 'badSKU' for the template parameter 
      'storageAccountType' at line '13' and column '20' is not valid. The parameter value is not part of the allowed 
      value(s): 'Standard_LRS,Standard_ZRS,Standard_GRS,Standard_RAGRS,Premium_LRS'.'.",
    "target": null
  },
  "properties": null
}

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.

{
  "error": {
    "code": "InvalidTemplate",
    "details": null,
    "message": "Deployment template parse failed: 'After parsing a value an unexpected character was encountered:
      \". Path 'variables', line 31, position 3.'.",
    "target": null
  },
  "properties": null
}

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:

az group deployment create \
    --name ExampleDeployment \
    --mode Complete \
    --resource-group ExampleGroup \
    --template-file storage.json \
    --parameters storageAccountType=Standard_GRS

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