Esercizio: Aggiungere la logica condizionale al modello di ARM

Completato

Negli esercizi precedenti si è lavorato con macchine virtuali Linux. In questo esercizio ci si concentra invece sulla gestione degli account di archiviazione.

Si supponga di avere tre ambienti in cui è necessario eseguire la distribuzione: Sviluppo, Gestione temporanea e Produzione.

  • L'ambiente Dev è l'ambiente di sviluppo, il primo posto in cui vengono riuniti tutti gli elementi necessari per l'applicazione. Questo ambiente può includere server Web, un servizio di bilanciamento del carico e un database.
  • L'ambiente Staging è l'ambiente di gestione temporanea in cui viene eseguito il test finale prima del rilascio delle nuove funzionalità dell'applicazione agli utenti finali.
  • L'ambiente Production è l'ambiente di produzione in cui gli utenti finali accedono all'applicazione.

Quando si passa da Dev a Production è necessario usare un'infrastruttura aggiuntiva. Ad esempio, in Production è necessario un account di archiviazione aggiuntivo che non è necessario negli ambienti precedenti.

Qui si usa una condizione per stabilire quando viene effettuato il provisioning di un account di archiviazione. In questo modo è possibile supportare tutti gli ambienti dell'infrastruttura usando lo stesso modello di ARM.

Creare il modello di Resource Manager

In questo esercizio si crea un modello di Azure Resource Manager (ARM) che definisce una risorsa dell'account di archiviazione.

Il modello definisce anche due parametri:

  • environment: il nome dell'ambiente corrente.
  • storageAccountName: il nome per l'account di archiviazione.

environment può avere uno di tre valori: dev, staging o production. La condizione effettua il provisioning dell'account di archiviazione solo quando environment è uguale a production.

  1. In Visual Studio Code creare un file denominato condition.json nella stessa directory che contiene azuredeploy.json.

  2. Aggiungere questi contenuti a condition.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

Si vedrà ora come distribuire un modello di ARM, con un costrutto condition, usando PowerShell e il modulo Az.

Effettuare il provisioning dell'ambiente Dev

In questo esempio si distribuisce il modello di ARM nell'ambiente Dev. Per eseguire questa operazione, impostare il parametro del modello environment su dev.

Poiché la condizione effettua il provisioning dell'account di archiviazione solo quando environment è uguale a production, si prevede che il modello non effettui il provisioning dell'account di archiviazione. In altre parole, si prevede una distribuzione che contiene zero risorse.

  1. Creare una variabile di PowerShell che contenga il nome dell'account di archiviazione.

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    I nomi degli account di archiviazione devono essere univoci. La parte Get-Random garantisce che il nome dell'account di archiviazione termini con una serie casuale di numeri.

  2. Eseguire il comando seguente New-AzResourceGroupDeployment per distribuire il modello nell'ambiente di sviluppo:

    New-AzResourceGroupDeployment `
      -TemplateFile "./condition.json" `
      -storageAccountName $STORAGE_ACCT_NAME `
      -environment dev
    

Verificare la distribuzione in Dev

Tenere presente che è previsto che il modello non abbia effettuato il provisioning dell'account di archiviazione.

Per avere una conferma, eseguire il comando Get-AzStorageAccount per verificare se il nome dell'account di archiviazione è già in uso.

Eseguire il comando Get-AzStorageAccount:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

L'output è simile al seguente:

Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

Indica che non è stato ancora effettuato il provisioning dell'account di archiviazione. Questa situazione è prevista perché non è ancora stata effettuata la distribuzione nell'ambiente Production.

Effettuare il provisioning dell'ambiente Production

Qui il modello di ARM viene distribuito nell'ambiente Production con una procedura analoga a quella vista per l'ambiente Dev.

A titolo di promemoria, ecco come è indicata la condizione nel modello:

"condition": "[equals(parameters('environment'),'production')]"

Per attivare questa condizione, impostare il parametro del modello environment su production.

Eseguire il comando seguente New-AzResourceGroupDeployment per distribuire il modello nell'ambiente di produzione:

New-AzResourceGroupDeployment `
  -TemplateFile "./condition.json" `
  -storageAccountName $STORAGE_ACCT_NAME `
  -environment production

Verificare la distribuzione in Production

Questa volta è previsto che il modello abbia effettuato il provisioning dell'account di archiviazione.

Per avere una conferma, eseguire di nuovo il comando Get-AzStorageAccount per verificare se il nome dell'account di archiviazione è in uso.

Eseguire il comando Get-AzStorageAccount seguente:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

Questa volta si otterrà un output diverso. Anziché un messaggio di errore viene visualizzato un output della tabella con informazioni sulla risorsa dell'account di archiviazione:

L'output è simile al seguente:

Location Name              Type                              Kind
-------- ----              ----                              ----
westus   tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2

Questi valori indicano che è stato effettuato il provisioning dell'account di archiviazione come previsto.

Sebbene questo sia un esempio semplice, consente di vedere come si esegue una distribuzione in base a una condizione.

Gli ambienti Dev, Staging e Production in realtà normalmente contengono altre risorse di Azure per supportare le esigenze di calcolo, rete e archiviazione. È probabile che ogni ambiente venga gestito usando un proprio gruppo di risorse, in modo che possa essere sottoposto a provisioning e trattato come singola unità.

Creare il modello di Resource Manager

In questo esercizio si crea un modello di Azure Resource Manager (ARM) che definisce una risorsa dell'account di archiviazione.

Il modello definisce anche due parametri:

  • environment: il nome dell'ambiente corrente.
  • storageAccountName: il nome per l'account di archiviazione.

environment può avere uno di tre valori: dev, staging o production. La condizione effettua il provisioning dell'account di archiviazione solo quando environment è uguale a production.

  1. In Visual Studio Code creare un file denominato condition.json nella stessa directory che contiene azuredeploy.json.

  2. Aggiungere questi contenuti a condition.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

Effettuare il provisioning dell'ambiente Dev

In questo esempio si distribuisce il modello di ARM nell'ambiente Dev. Per eseguire questa operazione, impostare il parametro del modello environment su dev.

Poiché la condizione effettua il provisioning dell'account di archiviazione solo quando environment è uguale a production, si prevede che il modello non effettui il provisioning dell'account di archiviazione. In altre parole, si prevede una distribuzione che contiene zero risorse.

  1. Creare una variabile Bash che contenga il nome dell'account di archiviazione.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    I nomi degli account di archiviazione devono essere univoci. La parte $RANDOM garantisce che il nome dell'account di archiviazione termini con una serie casuale di numeri.

  2. Eseguire il comando seguente az deployment group create per distribuire il modello nell'ambiente di sviluppo:

    az deployment group create \
      --template-file condition.json \
      --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
    

Verificare la distribuzione in Dev

Tenere presente che è previsto che il modello non abbia effettuato il provisioning dell'account di archiviazione.

Per avere una conferma, eseguire il comando az storage account check-name per verificare se il nome dell'account di archiviazione è già in uso.

Eseguire il comando az storage account check-name seguente:

az storage account check-name --name $STORAGE_ACCT_NAME

Verrà visualizzato quanto segue:

{
  "message": null,
  "nameAvailable": true,
  "reason": null
}

Il valore per nameAvailable è true e questo significa che il nome dell'account di archiviazione è ancora disponibile e non è ancora stato sottoposto a provisioning. Questa situazione è prevista perché non è ancora stata effettuata la distribuzione nell'ambiente Production.

Effettuare il provisioning dell'ambiente Production

In questo caso si distribuisce il modello di Resource Manager nell'ambiente di produzione, in modo analogo a come è stato fatto per l'ambiente di sviluppo .

A titolo di promemoria, ecco come è indicata la condizione nel modello:

"condition": "[equals(parameters('environment'),'production')]"

Per attivare questa condizione, impostare il parametro del modello environment su production.

Eseguire il comando seguente az deployment group create per distribuire il modello nell'ambiente di produzione:

az deployment group create \
  --template-file condition.json \
  --parameters storageAccountName=$STORAGE_ACCT_NAME environment=production

Verificare la distribuzione in Production

Questa volta è previsto che il modello abbia effettuato il provisioning dell'account di archiviazione.

Per avere una conferma, eseguire di nuovo il comando az storage account check-name per verificare se il nome dell'account di archiviazione è in uso.

Eseguire il comando az storage account check-name seguente:

az storage account check-name --name $STORAGE_ACCT_NAME

L'output è simile al seguente:

{
  "message": "The storage account named tailwindsa32100 is already taken.",
  "nameAvailable": false,
  "reason": "AlreadyExists"
}

Questi valori indicano che è stato effettuato il provisioning dell'account di archiviazione come previsto.

Sebbene questo sia un esempio semplice, consente di vedere come si esegue una distribuzione in base a una condizione.

Gli ambienti Dev, Staging e Production in realtà normalmente contengono altre risorse di Azure per supportare le esigenze di calcolo, rete e archiviazione. È probabile che ogni ambiente venga gestito usando un proprio gruppo di risorse, in modo che possa essere sottoposto a provisioning e trattato come singola unità.