Implantações de locatários com modelos ARM

À medida que sua organização amadurece, talvez seja necessário definir e atribuir políticas ou controle de acesso baseado em função do Azure (Azure RBAC) em seu locatário do Microsoft Entra. Com modelos de nível de locatário, você pode aplicar políticas declarativamente e atribuir funções em um nível global.

Gorjeta

Recomendamos o Bicep porque ele oferece os mesmos recursos que os modelos ARM e a sintaxe é mais fácil de usar. Para saber mais, consulte Implantações de locatário.

Recursos suportados

Nem todos os tipos de recursos podem ser implantados no nível do locatário. Esta seção lista quais tipos de recursos são suportados.

Para o controle de acesso baseado em função do Azure (Azure RBAC), use:

Para modelos aninhados que implantam em grupos de gerenciamento, assinaturas ou grupos de recursos, use:

Para criar grupos de gerenciamento, use:

Para criar assinaturas, use:

Para gerir custos, utilize:

Para configurar o portal, use:

As definições de política internas são recursos no nível do locatário, mas você não pode implantar definições de política personalizadas no locatário. Para obter um exemplo de atribuição de uma definição de política interna a um recurso, consulte tenantResourceId example.

Esquema

O esquema usado para implantações de locatário é diferente do esquema para implantações de grupo de recursos.

Para modelos, use:

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

O esquema para um arquivo de parâmetro é o mesmo para todos os escopos de implantação. Para arquivos de parâmetros, use:

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

Acesso necessário

A entidade de segurança que implanta o modelo deve ter permissões para criar recursos no escopo do locatário. A entidade de segurança deve ter permissão para executar as ações de implantação (Microsoft.Resources/deployments/*) e para criar os recursos definidos no modelo. Por exemplo, para criar um grupo de gerenciamento, a entidade de segurança deve ter permissão de Colaborador no escopo do locatário. Para criar atribuições de função, a entidade de segurança deve ter permissão de proprietário.

O Administrador Global da ID do Microsoft Entra não tem permissão automática para atribuir funções. Para habilitar implantações de modelo no escopo do locatário, o Administrador Global deve executar as seguintes etapas:

  1. Eleve o acesso à conta para que o Administrador Global possa atribuir funções. Para obter mais informações, veja Elevar o acesso para gerir todas as subscrições e grupos de gestão do Azure.

  2. Atribua Proprietário ou Colaborador à entidade de segurança que precisa implantar os modelos.

    New-AzRoleAssignment -SignInName "[userId]" -Scope "/" -RoleDefinitionName "Owner"
    
    az role assignment create --assignee "[userId]" --scope "/" --role "Owner"
    

A entidade de segurança agora tem as permissões necessárias para implantar o modelo.

Comandos de implantação

Os comandos para implantações de locatário são diferentes dos comandos para implantações de grupo de recursos.

Para a CLI do Azure, use az deployment tenant create:

az deployment tenant create \
  --name demoTenantDeployment \
  --location WestUS \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/tenant-deployments/new-mg/azuredeploy.json"

Para obter informações mais detalhadas sobre comandos de implantação e opções para implantar modelos ARM, consulte:

Local e nome da implantação

Para implantações em nível de locatário, você deve fornecer um local para a implantação. O local da implantação é separado do local dos recursos implantados. O local de implantação especifica onde armazenar os dados de implantação. As implantações de assinatura e grupo de gerenciamento também exigem um local. Para implantações de grupo de recursos, o local do grupo de recursos é usado para armazenar os dados de implantação.

Você pode fornecer um nome para a implantação ou usar o nome de implantação padrão. O nome padrão é o nome do arquivo de modelo. Por exemplo, implantar um modelo chamado azuredeploy.json cria um nome de implantação padrão de azuredeploy.

Para cada nome de implantação, o local é imutável. Não é possível criar uma implantação em um local quando há uma implantação existente com o mesmo nome em um local diferente. Por exemplo, se você criar uma implantação de locatário com o nome deployment1 no centralus, não poderá criar posteriormente outra implantação com o nome deployment1, mas um local do westus. Se você receber o código InvalidDeploymentLocationde erro , use um nome diferente ou o mesmo local da implantação anterior para esse nome.

Escopos de implantação

Ao implantar em um locatário, você pode implantar recursos para:

  • o inquilino
  • grupos de gerenciamento dentro do locatário
  • subscrições
  • grupos de recursos

Um recurso de extensão pode ter um escopo diferente do destino de implantação.

O usuário que implanta o modelo deve ter acesso ao escopo especificado.

Esta seção mostra como especificar escopos diferentes. Você pode combinar esses diferentes escopos em um único modelo.

Âmbito de aplicação para o inquilino

Os recursos definidos na seção de recursos do modelo são aplicados ao locatário.

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

Âmbito de aplicação do grupo de gestão

Para direcionar um grupo de gerenciamento dentro do locatário, adicione uma implantação aninhada e especifique a scope propriedade.

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

Âmbito da subscrição

Você também pode segmentar assinaturas dentro do locatário. O usuário que implanta o modelo deve ter acesso ao escopo especificado.

Para direcionar uma assinatura dentro do locatário, use uma implantação aninhada e a subscriptionId propriedade.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-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 do grupo de recursos

Você também pode segmentar grupos de recursos dentro do locatário. O usuário que implanta o modelo deve ter acesso ao escopo especificado.

Para direcionar um grupo de recursos dentro do locatário, use uma implantação aninhada. Defina as subscriptionId propriedades e resourceGroup . Não defina um local para a implantação aninhada porque ela é implantada no local do grupo de recursos.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-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
            }
          ]
        }
      }
    }
  ]
}

Criar grupo de gestão

O modelo a seguir cria um grupo de gerenciamento.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "mgName": {
        "type": "string",
        "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
      }
    },
    "resources": [
      {
        "type": "Microsoft.Management/managementGroups",
        "apiVersion": "2020-02-01",
        "name": "[parameters('mgName')]",
        "properties": {
        }
      }
    ]
  }

Se sua conta não tiver permissão para implantar no locatário, você ainda poderá criar grupos de gerenciamento implantando em outro escopo. Para obter mais informações, consulte Grupo de gerenciamento.

Atribuir função

O modelo a seguir atribui uma função no escopo do locatário.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.5.6.12127",
      "templateHash": "17107802581699825924"
    }
  },
  "parameters": {
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "principalId if the user that will be given contributor access to the tenant"
      }
    },
    "roleDefinitionId": {
      "type": "string",
      "defaultValue": "8e3af657-a8ff-443c-a75c-2fe8c4bcb635",
      "metadata": {
        "description": "roleDefinition for the assignment - default is owner"
      }
    }
  },
  "variables": {
    "roleAssignmentName": "[guid('/', parameters('principalId'), parameters('roleDefinitionId'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2020-03-01-preview",
      "name": "[variables('roleAssignmentName')]",
      "properties": {
        "roleDefinitionId": "[tenantResourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
        "principalId": "[parameters('principalId')]"
      }
    }
  ]
}

Próximos passos