Penyebaran penyewa dengan templat ARM

Seiring organisasi Anda berkembang, Anda mungkin perlu menentukan dan menetapkan kebijakan atau kontrol akses berbasis peran Azure (Azure RBAC) di seluruh penyewa Azure AD Anda. Dengan templat tingkat penyewa, Anda dapat menerapkan kebijakan secara deklaratif dan menetapkan peran di tingkat global.

Tip

Kami merekomendasikan Bicep karena menawarkan kemampuan yang sama dengan templat ARM dan sintaksnya lebih mudah digunakan. Untuk mempelajari selengkapnya, lihat penyebaran penyewa.

Sumber daya yang didukung

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

Untuk kontrol akses berbasis peran Azure (Azure RBAC), gunakan:

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

Untuk membuat grup manajemen, gunakan:

Untuk membuat langganan, gunakan:

Untuk mengelola biaya, gunakan:

Untuk mengonfigurasi portal, gunakan:

Definisi kebijakan bawaan adalah sumber daya tingkat penyewa, tetapi Anda tidak dapat meneyebarkan definisi kebijakan kustom di penyewa. Untuk contoh penetapan definisi kebijakan bawaan ke sumber daya, lihat contoh tenantResourceId.

Skema

Skema yang Anda gunakan untuk penyebaran tingkat langganan berbeda dengan skema untuk penyebaran grup sumber daya.

Untuk templat, gunakan:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#",
  ...
}

Skema untuk file parameter sama untuk semua cakupan penyebaran. Untuk file parameter, gunakan:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  ...
}

Akses yang diperlukan

Utama yang menyebarkan templat harus memiliki izin untuk membuat sumber daya di lingkup penyewa. Utama harus memiliki izin untuk menjalankan tindakan penyebaran (Microsoft.Resources/deployments/*) dan untuk membuat sumber daya yang ditentukan dalam template. Misalnya, untuk membuat grup manajemen, utama harus memiliki izin Kontributor di lingkup penyewa. Untuk membuat tugas peran, utama harus memiliki izin Pemilik.

Administrator Global untuk Microsoft Azure Active Directory Azure Active Directory tidak memiliki izin untuk menetapkan peran secara otomatis. Untuk mengaktifkan penyebaran templat di cakupan penyewa, Administrator Global harus melakukan langkah-langkah berikut:

  1. Tingkatkan akses akun sehingga Administrator Global dapat menetapkan peran. Untuk informasi lebih lanjut, lihatTingkatkan akses untuk mengelola semua langganan Azure dan grup manajemen.

  2. Tetapkan Pemilik atau Kontributor ke utama yang perlu menyebarkan templat.

    New-AzRoleAssignment -SignInName "[userId]" -Scope "/" -RoleDefinitionName "Owner"
    
    az role assignment create --assignee "[userId]" --scope "/" --role "Owner"
    

Utama sekarang memiliki izin yang diperlukan untuk menyebarkan templat.

Perintah penyebaran

Perintah untuk penyebaran penyewa berbeda dari perintah untuk penyebaran grup sumber daya.

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

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 grup manajemen 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 azuredeploy.json akan membuat nama penyebaran azuredeploy secara default.

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 penyewa, Anda dapat menyebarkan sumber daya untuk:

  • penyewa
  • grup manajemen dalam penyewa
  • subscriptions
  • 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.

Bagian ini memperlihatkan cara menentukan cakupan yang berbeda. Anda dapat menggabungkan cakupan yang berbeda ini dalam templat tunggal.

Cakupan ke penyewa

Sumber daya yang ditentukan dalam bagian sumber daya templat akan diterapkan ke penyewa.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    tenant-resources
  ],
  "outputs": {}
}

Cakupan ke grup manajemen

Untuk menargetkan grup manajemen dalam penyewa, tambahkan penyebaran berlapis dan tentukan properti 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": {}
}

Cakupan ke langganan

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

Untuk menargetkan langganan dalam penyewa, tambahkan penyebaran berlapis dan properti 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
            }
          ]
        }
      }
    }
  ]
}

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 penyewa, gunakan penyebaran berlapis. Atur properti subscriptionId dan resourceGroup. Jangan atur lokasi untuk penyebaran berlapis karena penyebaran dilakukan di lokasi grup sumber daya.

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

Membuat grup manajemen

Templat berikut ini akan membuat grup manajemen.

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

Jika akun Anda tidak memiliki izin untuk melakukan penyebaran ke penyewa, Anda masih dapat membuat grup manajemen dengan menggunakan cakupan lain. Untuk informasi selengkapnya, lihat Grup manajemen.

Tetapkan peran

Templat berikut menetapkan peran di cakupan penyewa.

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

Langkah berikutnya