Implantações de locatário com modelos do ARM

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

Dica

Recomendamos o Bicep porque ele oferece as mesmas funcionalidades que os modelos do ARM e a sintaxe é mais fácil de usar. Para saber mais, confira implantações do locatário.

Recursos compatíveis

Nem todos os tipos de recursos podem ser implantados no nível de locatário. Esta seção lista os tipos de recursos compatíveis.

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

Para modelos aninhados que são implantados em grupos de gerenciamento, assinaturas ou grupos de recursos, use:

Para criar grupos de gerenciamento, use:

Para criar assinaturas, use:

Para gerenciar custos, use:

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 ver um exemplo de como atribuir uma definição de política interna a um recurso, consulte amostra tenantResourceId.

Esquema

O esquema que você pode usar para implantações de locatário são diferentes dos esquemas para implantações do 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 está implantando 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 do Microsoft Azure Active Directory não tem automaticamente permissão 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, confira Elevar o acesso para gerenciar todas as assinaturas e grupos de gerenciamento do Azure.

  2. Atribua o 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"
    

O principal 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 do grupo de recursos.

Para 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 os comandos de implantação e as opções para implantar modelos do ARM, confira:

Nome e local da implantação

Para implantações no nível do locatário, você deve fornecer um local para a implantação. O local da implantação é separado do local dos recursos que você implanta. 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 da implantação.

Você pode fornecer um nome da implantação ou usar o nome da 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.

O local não pode ser alterado para cada nome de implantação. Você não pode 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 em centralus, não poderá criar outra implantação mais tarde com o nome deployment1, mas um local de westus. Se você receber o código de erro InvalidDeploymentLocation, use um nome diferente ou o mesmo local que a implantação anterior para esse nome.

Escopos de implantação

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

  • locatário
  • grupos de gerenciamento dentro do locatário
  • subscriptions
  • grupos de recursos

É possível definir o escopo de um recurso de extensão para um destino 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 escopos diferentes em um só modelo.

Escopo de locatário

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": {}
}

Escopo do grupo de gerenciamento

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

{
  "$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": "2021-04-01",
      "name": "nestedMG",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources
        }
      }
    }
  ],
  "outputs": {}
}

Escopo de assinatura

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

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

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

Escopo de grupo de recursos

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

Para visar a um grupo de recursos dentro do locatário, use uma implantação aninhada. Definir as propriedades subscriptionId 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 gerenciamento

O modelo a seguir cria um grupo de recursos vazio.

{
    "$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, veja 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óximas etapas