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

Este artigo descreve como definir o âmbito com a Bicep ao implementar para um 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, pode ser necessário definir e atribuir políticas ou controlo de acesso baseado em funções (Azure RBAC) para um grupo de gestão. Com modelos de nível de grupo de gestão, pode aplicar declarativamente políticas e atribuir funções ao nível do grupo de gestão.

Recursos suportados

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

Para plantas Azure, utilize:

Para a Política Azure, utilize:

Para o controlo de acesso baseado em funções Azure (Azure RBAC), utilize:

Para modelos aninhados que se implementem para subscrições ou grupos de recursos, utilize:

Para gerir os seus recursos, utilize:

Os grupos de gestão são recursos ao nível dos inquilinos. No entanto, pode criar grupos de gestão numa implantação de grupo de gestão, definindo o âmbito do novo grupo de gestão para o arrendatário. Ver Grupo de Gestão.

Definir âmbito

Para definir o âmbito de aplicação do grupo de gestão, utilize:

targetScope = 'managementGroup'

Comandos de implantação

Para implantar num grupo de gestão, utilize os comandos de implantação do grupo de gestão.

Para O Azure CLI, utilize mg de implantação az:

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 a implementação de modelos ARM, consulte:

Localização e nome de implantação

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

Pode fornecer um nome para a implementação ou utilizar o nome de implementação predefinido. O nome predefinido é o nome do ficheiro do modelo. Por exemplo, a implementação de um modelo chamado main.bicep cria um nome de implementação predefinido do principal.

Para cada nome de implantação, a localização é imutável. Não é possível criar uma implantação num local quando há uma implantação existente com o mesmo nome num local diferente. Por exemplo, se criar uma implementação de grupo de gestão com o nome implantado1 em central, não pode mais tarde criar outra implantação com o nome de implantação1, mas uma localização de Westus. Se obter o código de erro InvalidDeploymentLocation , utilize um nome diferente ou o mesmo local que a colocação anterior para esse nome.

Âmbitos de implantação

Ao ser implantado num grupo de gestão, pode mobilizar recursos para:

  • o grupo de gestão alvo da operação
  • outro grupo de gestão no inquilino
  • assinaturas no grupo de gestão
  • grupos de recursos no grupo de gestão
  • o inquilino para o grupo de recursos

Um recurso de extensão pode ser traçado para um alvo diferente do alvo de implantação.

O utilizador que implementa o modelo deve ter acesso ao âmbito especificado.

Âmbito para grupo de gestão

Para mobilizar recursos para o grupo de gestão de alvos, adicione esses recursos com a resource palavra-chave.

targetScope = 'managementGroup'

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

Para direcionar outro grupo de gestão, adicione um módulo. Utilize a função ManagementGroup para definir o scope imóvel. Forneça 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: 'deployToDifferntMG'
  scope: managementGroup(otherManagementGroupName)
}

Âmbito de subscrição

Também pode direcionar as subscrições dentro de um grupo de gestão. O utilizador que implementa o modelo deve 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 o scope imóvel. Forneça o ID de assinatura.

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 implementa o modelo deve 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 grupo de recursos para definir a scope propriedade. Forneça o ID de 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 arrendatário, adicione um módulo. Utilize a função de inquilino para definir o seu scope imóvel. O utilizador que implementa o modelo deve ter o acesso necessário para implantar no arrendatário.

targetScope = 'managementGroup'

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

Ou, 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 implantação de grupo de gestão, tem de definir a margem / para o grupo de gestão.

O exemplo a seguir 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@2020-05-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output newManagementGroup string = mgName

O próximo exemplo cria um novo grupo de gestão no grupo de gestão especificado como o progenitor.

targetScope = 'managementGroup'

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

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

resource parentMG 'Microsoft.Management/managementGroups@2020-05-01' existing = {
  name: parentMGName
  scope: tenant()
}

output newManagementGroup string = mgName

Subscrições

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

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

Azure Policy

As definições de política personalizada que são implementadas para o 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 políticas incorporadas são recursos ao nível dos inquilinos. Para obter o ID de uma definição de política incorporada, use a função tenantResourceId().

O exemplo a seguir mostra como definir uma política a 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@2019-09-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

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

Passos seguintes

Para conhecer outros âmbitos, consulte: