Condividi tramite


Distribuzioni di gruppi di gestione con modelli di ARM

Con la maturità della tua organizzazione, puoi distribuire un modello di Azure Resource Manager (modello di ARM) per creare risorse a livello di gruppo di gestione. Ad esempio, potresti aver bisogno di definire e assegnare criteri o il controllo degli accessi in base al ruolo di Azure per un gruppo di gestione. Con i modelli a livello di gruppo di gestione, puoi applicare criteri in modo dichiarativo e assegnare ruoli a livello di gruppo di gestione.

Suggerimento

È consigliabile Bicep perché offre le stesse funzionalità dei modelli di ARM e la sintassi è più semplice da usare. Per saperne di più, vedi Distribuzioni di gruppi di gestione.

Risorse supportate

Non tutti i tipi di risorse possono essere distribuiti a livello di gruppo di gestione. Questa sezione elenca i tipi di risorse supportati.

Per Azure Blueprints, usare:

Per Criteri di Azure, usa:

Per il controllo di accesso, usa:

Per i modelli annidati che vengono distribuiti in sottoscrizioni o gruppi di risorse, usare:

Per gestire le proprie risorse, usare:

I gruppi di gestione sono risorse a livello di tenant. È tuttavia possibile creare gruppi di gestione in una distribuzione di gruppi di gestione impostando l'ambito del nuovo gruppo di gestione sul tenant. Vedi Gruppo di gestione.

Schema

Lo schema che usi per le distribuzioni di gruppi di gestione è diverso rispetto allo schema per le distribuzioni di gruppi di risorse.

Per i modelli, usare:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  ...
}

Lo schema per un file di parametri è lo stesso per tutti gli ambiti di distribuzione. Per i file di parametri, usare:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  ...
}

Comandi di distribuzione

Per eseguire la distribuzione in un gruppo di gestione, usare i comandi di distribuzione del gruppo di gestione.

Per l'interfaccia della riga di comando di Azure, usare az deployment my create:

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

Per informazioni più dettagliate sui comandi e sulle opzioni di distribuzione per la distribuzione di modelli di ARM, vedi:

Percorso e nome della distribuzione

Per le distribuzioni a livello di gruppo di gestione, è necessario specificare una posizione di distribuzione. Il percorso di distribuzione è separato dal percorso delle risorse distribuite e specifica dove archiviare i dati di distribuzione. Anche le distribuzioni di sottoscrizioni e tenant richiedono una posizione. Per le distribuzioni del gruppo di risorse, la posizione del gruppo di risorse viene usata per archiviare i dati di distribuzione.

È possibile specificare un nome per la distribuzione oppure usare il nome predefinito. Il nome predefinito è il nome del file modello. Ad esempio, la distribuzione di un modello denominato azuredeploy.json crea un nome di distribuzione predefinito di azuredeploy.

Per ogni nome di distribuzione il percorso non è modificabile. Non è possibile creare una distribuzione in un percorso se esiste una distribuzione con lo stesso nome in un percorso diverso. Ad esempio, se si crea una distribuzione di gruppo di gestione con il nome deployment1 in centralus, non sarò possibile creare in seguito un'altra distribuzione con il nome deployment1 ma con posizione westus. Se viene visualizzato il codice di errore InvalidDeploymentLocation, utilizzare un nome diverso o lo stesso percorso come la distribuzione precedente per tale nome.

Ambiti di distribuzione

Quando si esegue la distribuzione in un gruppo di gestione, è possibile distribuire le risorse in:

  • gruppo di gestione di destinazione dell'operazione
  • un altro gruppo di gestione nel tenant
  • sottoscrizioni nel gruppo di gestione
  • gruppi di risorse nel gruppo di gestione
  • tenant per il gruppo di risorse

Le uniche transizioni di ambito non consentite vengono eseguite dal gruppo di risorse al gruppo di gestione o dalla sottoscrizione al gruppo di gestione.

È possibile definire l'ambito di una risorsa di estensione in una destinazione diversa da quella di distribuzione.

L'utente che distribuisce il modello deve avere accesso all’ambito specificato.

Questa sezione mostra come specificare ambiti diversi. Puoi combinare questi ambiti diversi in un singolo modello.

Ambito del gruppo di gestione di destinazione

Le risorse definite all'interno della sezione resources del modello vengono applicate al gruppo di gestione dal comando di distribuzione.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    management-group-resources-default
  ],
  "outputs": {}
}

Ambito di un altro gruppo di gestione

Per impostare come destinazione un altro gruppo di gestione, aggiungi una distribuzione annidata e specifica la proprietà scope. Imposta la proprietà scope su un valore nel formato Microsoft.Management/managementGroups/<mg-name>.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string"
    }
  },
  "variables": {
    "mgId": "[format('Microsoft.Management/managementGroups/{0}', parameters('mgName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources-non-default
        }
      }
    }
  ],
  "outputs": {}
}

Ambito della sottoscrizione

È anche possibile specificare come destinazione le sottoscrizioni all'interno di un gruppo di gestione. L'utente che distribuisce il modello deve avere accesso all’ambito specificato.

Per impostare come destinazione una sottoscrizione all'interno del gruppo di gestione, usa una distribuzione annidata e la proprietà subscriptionId.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedSub",
      "location": "westus2",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              subscription-resources
            }
          ]
        }
      }
    }
  ]
}

Ambito per il gruppo di risorse

È anche possibile specificare come destinazione i gruppi di risorse all'interno del gruppo di gestione. L'utente che distribuisce il modello deve avere accesso all’ambito specificato.

Per specificare come destinazione un gruppo di risorse all'interno del gruppo di gestione, usa una distribuzione annidata. Impostare le proprietà subscriptionId e resourceGroup. Non impostare una posizione per la distribuzione annidata poiché questa viene distribuita nella posizione del gruppo di risorse.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedRGDeploy",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "resourceGroup": "demoResourceGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              resource-group-resources
            }
          ]
        }
      }
    }
  ]
}

Per usare una distribuzione di un gruppo di gestione per creare di un gruppo di risorse all'interno di una sottoscrizione e distribuire un account di archiviazione in tale gruppo di risorse, vedi Distribuire nella sottoscrizione e nel gruppo di risorse.

Ambito del tenant

Per creare risorse nel tenant, imposta scope su /. L'utente che distribuisce il modello deve avere l'accesso obbligatorio per la distribuzione nel tenant.

Per usare una distribuzione annidata, imposta scope e location.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "location": "centralus",
      "scope": "/",
      "properties": {
        "mode": "Incremental",
        "template": {
          tenant-resources
        }
      }
    }
  ],
  "outputs": {}
}

In alternativa, puoi impostare l'ambito su / per alcuni tipi di risorse, ad esempio i gruppi di gestione. La creazione di un nuovo gruppo di gestione è descritta nella sezione successiva.

Gruppo di gestione

Per creare un gruppo di gestione in una distribuzione del gruppo di gestione, devi impostare l'ambito su / per il gruppo di gestione.

Nell'esempio seguente viene creato un nuovo gruppo di gestione nel gruppo di gestione radice.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('mgName')]",
      "scope": "/",
      "location": "eastus",
      "properties": {}
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

Nell'esempio seguente viene creato un nuovo gruppo di gestione nel gruppo di gestione specificato come padre. Nota che l'ambito è impostato su /.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    },
    "parentMG": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "[parameters('mgName')]",
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "scope": "/",
      "location": "eastus",
      "properties": {
        "details": {
          "parent": {
            "id": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('parentMG'))]"
          }
        }
      }
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

Sottoscrizioni

Per usare un modello di ARM per creare una nuova sottoscrizione di Azure in un gruppo di gestione, vedere:

Per distribuire un modello che trasferisca una sottoscrizione di Azure esistente in un nuovo gruppo di gestione, vedere Trasferire sottoscrizioni nel modello di ARM

Criteri di Azure

Le definizioni di criteri personalizzate distribuite nel gruppo di gestione sono estensioni del gruppo di gestione. Per ottenere l'ID di una definizione di criteri personalizzata, usare la funzione extensionResourceId(). Le definizioni di criteri predefinite sono risorse a livello di tenant. Per ottenere l'ID di una definizione di criteri predefinita, usare la funzione tenantResourceId().

Nell'esempio seguente viene illustrato come definire un criterio a livello di gruppo di gestione e assegnarlo.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "targetMG": {
      "type": "string",
      "metadata": {
        "description": "Target Management Group"
      }
    },
    "allowedLocations": {
      "type": "array",
      "defaultValue": [
        "australiaeast",
        "australiasoutheast",
        "australiacentral"
      ],
      "metadata": {
        "description": "An array of the allowed locations, all other locations will be denied by the created policy."
      }
    }
  },
  "variables": {
    "mgScope": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('targetMG'))]",
    "policyDefinition": "LocationRestriction"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "name": "[variables('policyDefinition')]",
      "apiVersion": "2020-09-01",
      "properties": {
        "policyType": "Custom",
        "mode": "All",
        "parameters": {
        },
        "policyRule": {
          "if": {
            "not": {
              "field": "location",
              "in": "[parameters('allowedLocations')]"
            }
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "name": "location-lock",
      "apiVersion": "2020-09-01",
      "dependsOn": [
        "[variables('policyDefinition')]"
      ],
      "properties": {
        "scope": "[variables('mgScope')]",
        "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', variables('policyDefinition'))]"
      }
    }
  ]
}

Eseguire la distribuzione nella sottoscrizione e nel gruppo di risorse

Da una distribuzione a livello di gruppo di gestione, puoi specificare come destinazione una sottoscrizione all'interno del gruppo di gestione. Nell'esempio seguente viene creato un gruppo di risorse all'interno di una sottoscrizione e viene distribuito un account di archiviazione in tale gruppo di risorse.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "nestedsubId": {
      "type": "string"
    },
    "nestedRG": {
      "type": "string"
    },
    "storageAccountName": {
      "type": "string"
    },
    "nestedLocation": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedSub",
      "location": "[parameters('nestedLocation')]",
      "subscriptionId": "[parameters('nestedSubId')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
          },
          "variables": {
          },
          "resources": [
            {
              "type": "Microsoft.Resources/resourceGroups",
              "apiVersion": "2021-04-01",
              "name": "[parameters('nestedRG')]",
              "location": "[parameters('nestedLocation')]"
            }
          ]
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedRG",
      "subscriptionId": "[parameters('nestedSubId')]",
      "resourceGroup": "[parameters('nestedRG')]",
      "dependsOn": [
        "nestedSub"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2021-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "[parameters('nestedLocation')]",
              "kind": "StorageV2",
              "sku": {
                "name": "Standard_LRS"
              }
            }
          ]
        }
      }
    }
  ]
}

Passaggi successivi