Distribuire le risorse con i modelli di Azure Resource Manager e l'interfaccia della riga di comando di Azure

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. Per comprendere i concetti di distribuzione e gestione delle soluzioni di Azure, vedere Panoramica di Azure Resource Manager.

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. Il modello che viene distribuito in questo articolo è disponibile nella sezione Modello di esempio o come modello di account di archiviazione in GitHub.

Per eseguire questo esempio, verificare di aver installato l'ultima versione dell'interfaccia della riga di comando di Azure 2.0. Per iniziare, eseguire az login per creare una connessione con Azure.

Questo esempio funziona in una shell Bash. 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).

Se l'interfaccia della riga di comando di Azure non è installata, è possibile usare Cloud Shell.

Distribuire un modello locale

Per distribuire le risorse in Azure, seguire questa procedura:

  1. Accedere all'account Azure
  2. Creare un gruppo di risorse che funge da contenitore per le risorse distribuite. Il nome del gruppo di risorse può contenere solo caratteri alfanumerici, punti, caratteri di sottolineatura, trattini e parentesi. Può contenere fino a 90 caratteri. Non può terminare con un punto.
  3. Distribuire nel gruppo di risorse il modello che definisce le risorse da creare.

Un modello può includere parametri che consentono di personalizzare la distribuzione. Può includere ad esempio valori specifici per un determinato ambiente (di sviluppo, test e produzione). Il modello di esempio definisce un parametro per lo SKU dell'account di archiviazione.

L'esempio seguente crea un gruppo di risorse e distribuisce un modello dal computer locale:

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. Al termine, viene visualizzato un messaggio che include il risultato:

"provisioningState": "Succeeded",

Distribuire un modello esterno

Anziché archiviare i modelli di Resource Manager nel computer locale, è consigliabile archiviarli in una posizione esterna, ad esempio in un repository di controllo del codice sorgente come GitHub. È possibile, in alternativa, archiviarli in un account di archiviazione di Azure per consentire l'accesso condiviso nell'organizzazione.

Per distribuire un modello esterno, usare il parametro template-uri. Usare l'URI indicato nell'esempio per distribuire il modello di esempio da 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. Se è necessario specificare dati riservati, ad esempio una password di amministratore, passare il valore come parametro protetto. Se invece si preferisce che il modello usato non sia accessibile pubblicamente, è possibile proteggerlo archiviandolo in un contenitore di archiviazione privato. 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.

Distribuire il modello da Cloud Shell

È possibile usare Cloud Shell per eseguire i comandi dell'interfaccia della riga di comando di Azure per la distribuzione del modello. Tuttavia, è prima necessario caricare il modello nella condivisione file per Cloud Shell. Per informazioni sulla configurazione di Cloud Shell per il primo utilizzo, vedere Panoramica di Azure Cloud Shell.

  1. Accedere al Portale di Azure.

  2. Selezionare il gruppo di risorse di Cloud Shell. Il modello del nome è cloud-shell-storage-<region>.

    Selezionare il gruppo di risorse

  3. Selezionare l'account di archiviazione per Cloud Shell.

    Selezionare l'account di archiviazione

  4. Selezionare File.

    Selezione dei file

  5. Selezionare la condivisione file per Cloud Shell. Il modello del nome è cs-<user>-<domain>-com-<uniqueGuid>.

    Selezionare la condivisione file

  6. Selezionare Aggiungi directory.

    Aggiungi directory

  7. Assegnare il nome templates e scegliere OK.

    Assegnare il nome alla directory

  8. Selezionare la nuova directory.

    Selezionare la directory

  9. Selezionare Carica.

    Selezionare Carica

  10. Trovare e caricare il modello.

    Caricare il file

  11. Aprire il prompt.

    Aprire Cloud Shell

  12. Immettere i comandi seguenti in Cloud Shell:

    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 parametri

Invece di passare i parametri come valori inline nello script, può risultare più facile usare un file JSON che contenga i valori dei parametri. Il file dei parametri deve essere nel formato seguente:

{
  "$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). Il file dei parametri contiene un valore per il parametro. Questo valore viene passato automaticamente al modello durante la distribuzione. È possibile creare più file dei parametri per scenari di distribuzione diversi e successivamente passare il file dei parametri appropriato.

Copiare l'esempio precedente e salvarlo come file denominato storage.parameters.json.

Per passare un file dei parametri locale, usare @ per specificare un file locale denominato storage.parameters.json.

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

Testare una distribuzione del modello

Per testare il modello e i valori dei parametri senza distribuire effettivamente le risorse, usare il comando 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. Si noti nello specifico che il valore dell'errore è null.

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

Se viene rilevato un errore, il comando restituisce un messaggio di errore. Il tentativo, ad esempio, di passare un valore non corretto per lo SKU dell'account di archiviazione, restituisce l'errore seguente:

{
  "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. Il messaggio contiene il numero di riga e la posizione dell'errore di analisi.

{
  "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 complete

Quando si distribuiscono le risorse, specificare se la distribuzione è un aggiornamento incrementale o completo. 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:

  • Nella modalità di completamento, Resource Manager elimina le risorse esistenti nel gruppo di risorse che non sono specificate nel modello.
  • Nella modalità incrementale, Resource Manager lascia invariate le risorse esistenti nel gruppo di risorse che non sono specificate nel modello.

Per entrambe le modalità, Resource Manager prova a effettuare il provisioning di tutte le risorse specificate nel modello. Se la risorsa esiste già nel gruppo di risorse e le relative impostazioni sono identiche, l'operazione non comporta alcuna modifica. Se si modificano le impostazioni per una risorsa, il provisioning viene effettuato con le nuove impostazioni della risorsa. Se si prova ad aggiornare il percorso o il tipo di una risorsa esistente, la distribuzione ha esito negativo e restituisce un errore. È invece necessario distribuire una nuova risorsa con il percorso o il tipo necessari.

Per impostazione predefinita, Resource Manager usa la modalità incrementale.

Per illustrare la differenza tra le modalità incrementale e completa, si consideri lo scenario seguente.

Il gruppo di risorse esistente contiene:

  • Risorsa A
  • Risorsa B
  • Risorsa C

Il modello definisce:

  • Risorsa A
  • Risorsa B
  • Risorsa D

Quando viene implementato in modalità incrementale, il gruppo di risorse contiene:

  • Risorsa A
  • Risorsa B
  • Risorsa C
  • Risorsa D

Quando viene implementato in modalità completa, la risorsa C viene eliminata. Il gruppo di risorse contiene:

  • Risorsa A
  • Risorsa B
  • Risorsa D

Per usare la modalità completa, usare il parametro mode:

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

Modello di esempio

Il modello seguente viene usato per gli esempi in questo argomento. Copiarlo e salvarlo come file denominato storage.json. Per informazioni su come creare questo modello, vedere Creare il primo modello di Azure Resource Manager.

{
  "$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 successivi