Развертывание арендаторов с помощью шаблонов ARM

По мере развития организации может потребоваться определить и назначить политики или управление доступом на основе ролей Azure (Azure RBAC) в клиенте Microsoft Entra. С помощью шаблонов уровня клиента можно декларативно применять политики и назначать роли на глобальном уровне.

Совет

Мы рекомендуем использовать Bicep, так как он предоставляет те же возможности, что и шаблоны ARM, и имеет более простой синтаксис. Дополнительные сведения см. в разделе Развертывания клиентов.

Поддерживаемые ресурсы

Не все типы ресурсов можно развернуть на уровне арендатора. В этом разделе перечислены поддерживаемые типы ресурсов.

Для Управления доступом на основе ролей Azure (Azure RBAC) используйте следующие типы:

Для вложенных шаблонов, которые развертываются в группах управления, подписках или группах ресурсов, используйте следующие типы:

Для создания групп управления используйте следующие типы:

Для создания подписок используйте следующие типы:

Для управления затратами используйте следующие типы:

Для настройки портала используйте следующие типы:

Встроенные определения политик — это ресурсы уровня арендатора, однако развертывать на арендаторе пользовательские определения политик нельзя. Пример назначения встроенного определения политики ресурсу см. в примере для tenantResourceId.

Схема

Схема, используемая для развертываний клиентов, отличается от схемы развертываний группы ресурсов.

Для шаблонов используйте:

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

Схема для файла параметров одинакова для всех областей развертывания. Для файлов параметров используйте:

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

Требуемый доступ

У субъекта, развертывающего шаблон, должны быть разрешения на создание ресурсов в области клиента. У субъекта должно быть разрешение на действия развертывания (Microsoft.Resources/deployments/*) и создание ресурсов, определенных в шаблоне. Например, чтобы создать группу управления, у субъекта должно быть разрешение "Участник" в области клиента. Чтобы создавать назначения ролей, у участника должно быть разрешение "Владелец".

Глобальный Администратор istrator для идентификатора Microsoft Entra id не имеет разрешения на назначение ролей. Чтобы включить развертывания шаблонов в области клиента, глобальному администратору следует выполнить такие действия:

  1. Повысить уровень доступа к учетной записи, чтобы глобальный администратор мог назначать роли. Дополнительные сведения см. в статье Повышение прав доступа для управления всеми подписками Azure и группами управления.

  2. Назначьте роль "Владелец" или "Участник" субъекту, который будет развертывать шаблоны.

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

У субъекта теперь есть необходимые разрешения для развертывания шаблона.

Команды развертывания

Команды, используемые для развертываний клиентов, отличаются от команд для развертываний группы ресурсов.

Для Azure CLI используйте az deployment tenant 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"

Более подробные сведения о командах и параметрах развертывания для развертывания шаблонов ARM приведены в следующих статьях:

Расположение и имя развертывания

Для развертываний на уровне клиента необходимо указать расположение для развертывания. Расположение развертывания отделено от расположения развертываемых ресурсов. В расположении развертывания указывается место хранения данных развертывания. При развертывании подписок и групп управления также требуется расположение. При развертывании группы ресурсов для хранения данных развертывания используется расположение группы ресурсов.

Можно указать имя развертывания или использовать имя развертывания по умолчанию. Имя по умолчанию — это имя файла шаблона. Например, развернув шаблон с именем azuredeploy.json создается имя развертывания по умолчанию azuredeploy.

Для каждого имени развертывания расположение остается неизменным. Нельзя создать развертывание в одном расположении, если в другом уже есть развертывание с таким же именем. Например, если вы создаете развертывание арендатора с именем deployment1 в centralus, вы не сможете позже создать другое развертывание с именем deployment1, но уже в расположении westus. Если появится код ошибки InvalidDeploymentLocation, используйте другое имя или то же расположение, что и для предыдущего развертывания с этим именем.

Области развертывания

При развертывании в арендаторе ресурсы можно развернуть в:

  • арендаторе;
  • группе управления в арендаторе;
  • подписки;
  • группы ресурсов

Ресурс расширения можно ограничить целевым объектом, который отличается от целевого объекта развертывания.

Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

В этом разделе показано, как указать различные области. Такие различные области можно объединить в один шаблон.

Область для клиента

Ресурсы, определенные в разделе ресурсов шаблона, применяются к арендатору.

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

Область для группы управления

Чтобы выбрать в качестве области группу управления в арендаторе, добавьте вложенное развертывание и укажите свойство 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": "2022-09-01",
      "name": "nestedMG",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources
        }
      }
    }
  ],
  "outputs": {}
}

Область действия для подписки

Вы также можете выбирать в качестве области подписки в арендаторе. Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

Чтобы выбрать в качестве области подписку в арендаторе, используйте вложенное развертывание и свойство 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
            }
          ]
        }
      }
    }
  ]
}

Область для группы ресурсов

Вы также можете выбирать в качестве области группы ресурсов в арендаторе. Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

Чтобы выбрать в качестве области группу ресурсов в арендаторе, используйте вложенное развертывание. Укажите свойства subscriptionId и resourceGroup. Задавать расположение для вложенного развертывания не нужно, так как оно развертывается в расположении группы ресурсов.

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

Создание группы управления

В следующем примере создается группа управления.

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

Если у вашей учетной записи нет разрешения на развертывание в арендаторе, вы все равно можете создавать группы управления, развернув их в другой области. Дополнительные сведения находятся в Обзоре группы управления.

Назначение роли

В следующем шаблоне присваивается роль в области арендатора.

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

Следующие шаги