Implantações de grupo de gerenciamento com arquivos Bicep

Este artigo descreve como definir o escopo com o Bicep ao implantar em um grupo de gerenciamento.

À medida que sua organização amadurece, você pode implantar um arquivo Bicep para criar recursos no nível do grupo de gerenciamento. Por exemplo, talvez seja necessário definir e atribuir políticas ou o controle de acesso baseado em função do Azure (Azure RBAC) para um grupo de gerenciamento. Com modelos de nível de grupo de gerenciamento, você pode aplicar políticas declarativamente e atribuir funções no nível do grupo de gerenciamento.

Recursos de formação

Se preferir saber mais sobre escopos de implantação por meio de orientação passo a passo, consulte Implantar recursos para assinaturas, grupos de gerenciamento e locatários usando o Bicep.

Recursos suportados

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

Para Azure Blueprints, use:

Para a Política do Azure, use:

Para controle de acesso, use:

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

Para gerenciar seus recursos, use:

Os grupos de gerenciamento são recursos no nível do locatário. No entanto, você pode criar grupos de gerenciamento em uma implantação de grupo de gerenciamento definindo o escopo do novo grupo de gerenciamento para o locatário. Consulte Grupo de gestão.

Definir âmbito

Para definir o escopo como grupo de gerenciamento, use:

targetScope = 'managementGroup'

Comandos de implantação

Para implantar em um grupo de gerenciamento, use os comandos de implantação do grupo de gerenciamento.

Para a CLI do Azure, use 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 comandos de implantação e opções para implantar modelos ARM, consulte:

Local e nome da implantação

Para implantações no nível do grupo de gerenciamento, 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 locatário 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, a implantação de um modelo chamado main.bicep cria um nome de implantação padrão de main.

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 grupo de gerenciamento 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 grupo de gerenciamento, você pode implantar recursos para:

  • o grupo-alvo de gestão da operação
  • outro grupo de gestão no inquilino
  • Subscrições no grupo de gestão
  • Grupos de recursos no grupo de gerenciamento
  • O locatário do grupo de recursos

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

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

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

Para implantar recursos no grupo de gerenciamento de destino, adicione esses recursos com a resource palavra-chave.

targetScope = 'managementGroup'

// policy definition created in the management group
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2023-04-01' = {
  ...
}

Para direcionar outro grupo de gerenciamento, adicione um módulo. Use a função managementGroup para definir a scope propriedade. Forneça o nome do grupo de gerenciamento.

targetScope = 'managementGroup'

param otherManagementGroupName string

// module deployed at management group level but in a different management group
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentMG'
  scope: managementGroup(otherManagementGroupName)
}

Âmbito da subscrição

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

Para direcionar uma assinatura dentro do grupo de gerenciamento, adicione um módulo. Use a função de assinatura para definir a scope propriedade. Forneça o ID da assinatura.

targetScope = 'managementGroup'

param subscriptionID string

// module deployed to subscription in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

Âmbito do grupo de recursos

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

Para direcionar um grupo de recursos dentro do grupo de gerenciamento, adicione um módulo. Use a função resourceGroup para definir a scope propriedade. Forneça a ID da assinatura e o nome do grupo de recursos.

targetScope = 'managementGroup'

param subscriptionID string
param resourceGroupName string

// module deployed to resource group in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

Âmbito de aplicação para o inquilino

Para criar recursos no locatário, adicione um módulo. Use a função tenant para definir sua scope propriedade. O usuário que implanta o modelo deve ter o acesso necessário para implantar no locatário.

targetScope = 'managementGroup'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

Ou, você pode definir o escopo para / alguns tipos de recursos, como grupos de gerenciamento. A criação de um novo grupo de gerenciamento é descrita na próxima seção.

Grupo de Gestão

Para criar um grupo de gerenciamento em uma implantação de grupo de gerenciamento, você deve definir o escopo como o locatário.

O exemplo a seguir cria um novo grupo de gerenciamento no grupo de gerenciamento raiz.

targetScope = 'managementGroup'

param mgName string = 'mg-${uniqueString(newGuid())}'

resource newMG 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output newManagementGroup string = mgName

O próximo exemplo cria um novo grupo de gerenciamento no grupo de gerenciamento destinado à implantação. Ele usa a função de grupo de gerenciamento.

targetScope = 'managementGroup'

param mgName string = 'mg-${uniqueString(newGuid())}'

resource newMG 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: mgName
  properties: {
    details: {
      parent: {
        id: managementGroup().id
      }
    }
  }
}

output newManagementGroup string = mgName

Subscrições

Para usar um modelo ARM para criar uma nova assinatura do Azure em um grupo de gerenciamento, consulte:

Para implantar um modelo que move uma assinatura existente do Azure para um novo grupo de gerenciamento, consulte Mover assinaturas no modelo ARM

Azure Policy

As definições de política personalizadas implantadas no grupo de gerenciamento são extensões do grupo de gerenciamento. Para obter a ID de uma definição de política personalizada, use a função extensionResourceId(). As definições de política internas são recursos no nível do locatário. Para obter a ID de uma definição de política interna, use a função tenantResourceId().

O exemplo a seguir mostra como definir uma política no nível do grupo de gerenciamento e como atribuí-la.

targetScope = 'managementGroup'

@description('An array of the allowed locations, all other locations will be denied by the created policy.')
param allowedLocations array = [
  'australiaeast'
  'australiasoutheast'
  'australiacentral'
]

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2023-04-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-04-01' = {
  name: 'locationAssignment'
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

Próximos passos

Para saber mais sobre outros escopos, consulte: