Implementações de grupos de gestão com ficheiros Bicep

Este artigo descreve como definir o âmbito com o Bicep ao implementar num grupo de gestão.

À medida que a sua organização amadurece, pode implementar um ficheiro Bicep 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.

Recursos de preparação

Se preferir saber mais sobre os âmbitos de implementação através da documentação de orientação passo a passo, veja Implementar recursos em subscrições, grupos de gestão e inquilinos com o Bicep.

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.

Definir âmbito

Para definir o âmbito para o grupo de gestão, utilize:

targetScope = 'managementGroup'

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, veja:

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 de 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 indicar 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, a implementação de um modelo com o nome main.bicep cria um nome de implementação predefinido principal.

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 centralus, 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 em:

  • 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.

Âmbito para grupo de gestão

Para implementar recursos no grupo de gestão de destino, adicione esses recursos com a resource palavra-chave .

targetScope = 'managementGroup'

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

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

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

Também pode direcionar subscrições dentro de um 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, adicione um módulo. Utilize a função de subscrição para definir a scope propriedade . Indique o ID da subscrição.

targetScope = 'managementGroup'

param subscriptionID string

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

Âmbito para grupo de recursos

Também pode direcionar grupos de recursos dentro do 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, adicione um módulo. Utilize a função resourceGroup para definir a scope propriedade . Indique o ID da subscrição 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 para inquilino

Para criar recursos no inquilino, adicione um módulo. Utilize a função de inquilino para definir a respetiva scope propriedade. O utilizador que está a implementar o modelo tem de ter o acesso necessário para implementar no inquilino.

targetScope = 'managementGroup'

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

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 para o inquilino.

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

targetScope = 'managementGroup'

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

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

output newManagementGroup string = mgName

O exemplo seguinte cria um novo grupo de gestão no grupo de gestão direcionado para a implementação. Utiliza a função do grupo de gestão.

targetScope = 'managementGroup'

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

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

output newManagementGroup string = mgName

Subscrições

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

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.

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@2021-06-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

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

Passos seguintes

Para saber mais sobre outros âmbitos, consulte: