Penyebaran grup manajemen dengan file Bicep

Artikel ini menjelaskan cara menetapkan cakupan dengan Bicep saat menyebarkan ke grup manajemen.

Ketika organisasi Anda telah matang, Anda dapat menggunakan file Bicep untuk membuat sumber daya di tingkat grup manajemen. Misalnya, Anda mungkin perlu menentukan dan menetapkan kebijakan atau kontrol akses berbasis peran Azure (Azure RBAC) untuk grup manajemen. Dengan templat tingkat grup manajemen, Anda dapat menerapkan kebijakan secara deklaratif dan menetapkan peran di tingkat grup manajemen.

Sumber daya pelatihan

Jika Anda lebih suka mempelajari tentang cakupan penyebaran melalui panduan langkah demi langkah, lihat Menyebarkan sumber daya ke langganan, grup manajemen, dan penyewa dengan menggunakan Bicep.

Sumber daya yang didukung

Tidak semua jenis sumber daya dapat disebarkan ke tingkat grup manajemen. Bagian ini mencantumkan jenis sumber daya mana yang didukung.

Untuk Azure Blueprints, gunakan:

Untuk Azure Policy, gunakan:

Untuk kontrol akses, gunakan:

Untuk templat bersarang yang disebarkan ke langganan, langganan, atau grup sumber daya, gunakan:

Untuk mengelola sumber daya Anda, gunakan:

Grup manajemen adalah sumber daya tingkat penyewa. Namun, Anda dapat membuat grup manajemen dalam penyebaran grup manajemen dengan menetapkan lingkup grup manajemen baru ke penyewa. Lihat Grup manajemen.

Menetapkan cakupan

Untuk menetapkan cakupan ke grup manajemen, gunakan:

targetScope = 'managementGroup'

Perintah penyebaran

Untuk menyebarkan ke grup manajemen, gunakan perintah penyebaran grup manajemen.

Untuk Azure CLI, gunakan 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"

Untuk informasi selengkapnya tentang perintah penyebaran dan opsi untuk menyebarkan templat ARM, lihat:

Lokasi dan nama penyebaran

Untuk penyebaran tingkat penyewa, Anda harus menyediakan lokasi untuk penyebaran. Lokasi penyebaran terpisah dari lokasi sumber daya yang Anda sebarkan. Lokasi penyebaran menentukan tempat menyimpan data penyebaran. Penyebaran langganan dan penyewa juga memerlukan lokasi. Untuk penyebaran grup sumber daya, lokasi grup sumber daya digunakan untuk menyimpan data penyebaran.

Anda dapat memberikan nama untuk penyebaran atau menggunakan nama penyebaran default. Nama default adalah nama file templat. Misalnya, menyebarkan templat bernama main.bicep akan membuat nama penyebaran default main.

Untuk setiap nama penyebaran, lokasi tidak dapat diubah. Anda tidak dapat membuat penyebaran di satu lokasi saat ada penyebaran yang ada dengan nama yang sama di lokasi lain. Misalnya, jika Anda membuat penyebaran penyewa dengan nama deployment1 di centralus, Anda nantinya tidak dapat membuat penyebaran lain dengan nama deployment1 tetapi lokasinya di westus. Jika Anda mendapatkan kode kesalahan InvalidDeploymentLocation, gunakan nama yang berbeda atau lokasi yang sama dengan penyebaran sebelumnya untuk nama tersebut.

Cakupan penyebaran

Saat menyebarkan ke grup manajemen, Anda bisa menggunakan menyebarkan sumber daya untuk:

  • grup manajemen target dari operasi
  • grup manajemen lain dalam penyewa
  • langganan dalam grup manajemen
  • grup sumber daya dalam grup manajemen
  • penyewa untuk grup sumber daya

Sumber daya ekstensi dapat dicakup ke target yang berbeda dari target penyebaran.

Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Cakupan ke grup manajemen

Untuk menyebarkan sumber daya ke grup manajemen target, tambahkan sumber daya tersebut dengan kata kunci resource.

targetScope = 'managementGroup'

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

Untuk menargetkan grup manajemen lain, tambahkan modul. Gunakan fungsi managementGroup untuk menetapkan properti scope. Berikan nama grup manajemen.

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)
}

Cakupan ke langganan

Anda juga dapat menargetkan langganan dalam grup manajemen. Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Untuk menargetkan langganan dalam grup manajemen, tambahkan modul. Gunakan fungsi langganan untuk menetapkan properti scope. Berikan ID langganan.

targetScope = 'managementGroup'

param subscriptionID string

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

Cakupan ke grup sumber daya

Anda juga dapat menargetkan grup sumber daya dalam penyewa. Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Untuk menargetkan grup sumber daya dalam grup manajemen, tambahkan modul. Gunakan fungsi resourceGroup untuk menetapkan properti scope. Berikan ID langganan dan nama grup sumber daya.

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)
}

Cakupan ke penyewa

Untuk membuat sumber daya di penyewa, tambahkan modul. Gunakan fungsi penyewa untuk mengatur properti scope. Pengguna yang menyebarkan templat harus memiliki akses yang diperlukan untuk disebarkan di penyewa.

targetScope = 'managementGroup'

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

Atau, Anda dapat mengatur cakupan ke / untuk beberapa jenis sumber daya, seperti grup manajemen. Membuat grup manajemen baru dijelaskan di bagian berikutnya.

Grup manajemen

Untuk membuat grup manajemen dalam penyebaran grup manajemen, Anda harus mengatur cakupan ke penyewa.

Contoh berikut membuat grup manajemen baru di grup manajemen root.

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

Contoh berikutnya membuat grup manajemen baru di grup manajemen yang ditargetkan untuk penyebaran. Ia menggunakan fungsi grup manajemen.

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

Langganan

Untuk menggunakan templat ARM untuk membuat langganan Azure baru di grup manajemen, lihat:

Untuk menyebarkan templat yang memindahkan langganan Azure yang sudah ada ke grup manajemen baru, lihat Memindahkan langganan di templat ARM

Kebijakan Azure

Definisi kebijakan kustom yang disebarkan ke grup manajemen adalah ekstensi dari grup manajemen. Untuk mendapatkan ID definisi kebijakan kustom, gunakan fungsi extensionResourceId(). Definisi kebijakan bawaan adalah sumber daya tingkat penyewa. Untuk mendapatkan ID definisi kebijakan kustom, gunakan fungsi tenantResourceId().

Contoh berikut menunjukkan cara menentukan kebijakan di tingkat grup manajemen, dan menetapkannya.

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
  }
}

Langkah berikutnya

Untuk mempelajari tentang cakupan lain, lihat: