Поделиться через


Развертывания клиентов с помощью шаблонов 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/*) и создание ресурсов, определенных в шаблоне. Например, чтобы создать группу управления, у субъекта должно быть разрешение "Участник" в области клиента. Чтобы создавать назначения ролей, у участника должно быть разрешение "Владелец".

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

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

Дальнейшие шаги