Implementações de grupos de gestão com modelos do ARM

À medida que a sua organização amadurece, pode implementar um modelo do Azure Resource Manager (modelo arm) para criar recursos ao nível do grupo de gestão. Por exemplo, poderá ter de definir e atribuir políticas ou controlo de acesso baseado em funções do Azure (RBAC do Azure) para um grupo de gestão. Com os modelos de nível de grupo de gestão, pode aplicar políticas de forma declarativa e atribuir funções ao nível do grupo de gestão.

Dica

Recomendamos o Bicep porque oferece as mesmas capacidades que os modelos do ARM e a sintaxe é mais fácil de utilizar. Para saber mais, veja Implementações de grupos de gestão.

Recursos suportados

Nem todos os tipos de recursos podem ser implementados ao nível do grupo de gestão. Esta secção lista os tipos de recursos suportados.

Para o Azure Blueprints, utilize:

Para Azure Policy, utilize:

Para controlo de acesso, utilize:

Para modelos aninhados que são implementados em subscrições ou grupos de recursos, utilize:

Para gerir os seus recursos, utilize:

Os grupos de gestão são recursos ao nível do inquilino. No entanto, pode criar grupos de gestão numa implementação de grupo de gestão ao definir o âmbito do novo grupo de gestão para o inquilino. Veja Grupo de gestão.

Esquema

O esquema que utiliza para implementações de grupos de gestão é diferente do esquema para implementações de grupos de recursos.

Para modelos, utilize:

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

O esquema de um ficheiro de parâmetros é o mesmo para todos os âmbitos de implementação. Para ficheiros de parâmetros, utilize:

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

Comandos de implementação

Para implementar num grupo de gestão, utilize os comandos de implementação do grupo de gestão.

Para a CLI do Azure, utilize az deployment mg 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"

Para obter informações mais detalhadas sobre os comandos de implementação e as opções para implementar modelos do ARM, consulte:

Localização e nome da implementação

Para implementações ao nível do grupo de gestão, tem de fornecer uma localização para a implementação. A localização da implementação é separada da localização dos recursos que implementar. A localização da implementação especifica onde armazenar dados de implementação. As implementações de subscrições e inquilinos também requerem uma localização. Para implementações de grupos de recursos , a localização do grupo de recursos é utilizada para armazenar os dados de implementação.

Pode fornecer um nome para a implementação ou utilizar o nome de implementação predefinido. O nome predefinido é o nome do ficheiro de modelo. Por exemplo, implementar um modelo com o nome azuredeploy.json cria um nome de implementação predefinido de azuredeploy.

Para cada nome de implementação, a localização é imutável. Não pode criar uma implementação numa localização quando existe uma implementação com o mesmo nome numa localização diferente. Por exemplo, se criar uma implementação de grupo de gestão com o nome deployment1 no centrous, não poderá criar mais tarde outra implementação com o nome deployment1 , mas sim uma localização de westus. Se receber o código InvalidDeploymentLocationde erro, utilize um nome diferente ou a mesma localização da implementação anterior para esse nome.

Âmbitos de implementação

Ao implementar num grupo de gestão, pode implementar recursos para:

  • o grupo de gestão de destino da operação
  • outro grupo de gestão no inquilino
  • subscrições no grupo de gestão
  • grupos de recursos no grupo de gestão
  • o inquilino do grupo de recursos

Um recurso de extensão pode ser confinado a um destino diferente do destino de implementação.

O utilizador que está a implementar o modelo tem de ter acesso ao âmbito especificado.

Esta secção mostra como especificar diferentes âmbitos. Pode combinar estes âmbitos diferentes num único modelo.

Âmbito para o grupo de gestão de destino

Os recursos definidos na secção recursos do modelo são aplicados ao grupo de gestão a partir do comando de implementação.

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

Âmbito para outro grupo de gestão

Para direcionar outro grupo de gestão, adicione uma implementação aninhada e especifique a scope propriedade. Defina a scope propriedade como um valor no 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": {}
}

Âmbito da subscrição

Também pode direcionar subscrições num grupo de gestão. O utilizador que está a implementar o modelo tem de ter acesso ao âmbito especificado.

Para direcionar uma subscrição dentro do grupo de gestão, utilize uma implementação aninhada e a subscriptionId propriedade.

{
  "$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
            }
          ]
        }
      }
    }
  ]
}

Âmbito para grupo de recursos

Também pode direcionar grupos de recursos no grupo de gestão. O utilizador que está a implementar o modelo tem de ter acesso ao âmbito especificado.

Para direcionar um grupo de recursos dentro do grupo de gestão, utilize uma implementação aninhada. Defina as subscriptionId propriedades e resourceGroup . Não defina uma localização para a implementação aninhada porque está implementada na localização do grupo de recursos.

{
  "$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
            }
          ]
        }
      }
    }
  ]
}

Para utilizar uma implementação de grupo de gestão para criar um grupo de recursos numa subscrição e implementar uma conta de armazenamento nesse grupo de recursos, veja Implementar na subscrição e no grupo de recursos.

Âmbito para inquilino

Para criar recursos no inquilino, defina como scope/. O utilizador que está a implementar o modelo tem de ter o acesso necessário para implementar no inquilino.

Para utilizar uma implementação aninhada, defina 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": {}
}

Em alternativa, pode definir o âmbito para / alguns tipos de recursos, como grupos de gestão. A criação de um novo grupo de gestão é descrita na secção seguinte.

Grupo de gestão

Para criar um grupo de gestão numa implementação de grupo de gestão, tem de definir o âmbito como / para o grupo de gestão.

O exemplo seguinte cria um novo grupo de gestão no grupo de gestão de raiz.

{
  "$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')]"
    }
  }
}

O exemplo seguinte cria um novo grupo de gestão no grupo de gestão especificado como principal. Repare que o âmbito está definido como /.

{
  "$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')]"
    }
  }
}

Subscrições

Para utilizar um modelo do ARM para criar uma nova subscrição do Azure num grupo de gestão, veja:

Para implementar um modelo que move uma subscrição do Azure existente para um novo grupo de gestão, veja Mover subscrições no modelo do ARM

Azure Policy

As definições de política personalizadas implementadas no grupo de gestão são extensões do grupo de gestão. Para obter o ID de uma definição de política personalizada, utilize a função extensionResourceId( ). As definições de política incorporadas são recursos ao nível do inquilino. Para obter o ID de uma definição de política incorporada, utilize a função tenantResourceId( ).

O exemplo seguinte mostra como definir uma política ao nível do grupo de gestão e atribuí-la.

{
  "$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'))]"
      }
    }
  ]
}

Implementar na subscrição e no grupo de recursos

A partir de uma implementação ao nível do grupo de gestão, pode direcionar uma subscrição dentro do grupo de gestão. O exemplo seguinte cria um grupo de recursos numa subscrição e implementa uma conta de armazenamento nesse grupo de recursos.

{
  "$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"
              }
            }
          ]
        }
      }
    }
  ]
}

Passos seguintes