Развертывание группы управления с помощью файлов Bicep

В этой статье показано, как задать область с помощью Bicep при развертывании в группе управления.

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

Учебные ресурсы

Дополнительные сведения об областях развертывания, а также практические инструкции вы найдете в модуле Развертывание ресурсов в подписках, группах управления и арендаторах с помощью Bicep

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

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

Для Azure Blueprints используйте следующие типы:

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

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

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

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

Группы управления — это ресурсы уровня клиента. Тем не менее, вы можете создать группы управления в развертывании группы управления, установив область действия новой группы управления для клиента. См. раздел Группа управления.

Область — набор

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

targetScope = 'managementGroup'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

targetScope = 'managementGroup'

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

Чтобы назначить другую группу управления, добавьте модуль. Используйте функцию managementGroup, чтобы задать свойство scope. Укажите имя группы управления.

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

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

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

Чтобы назначить подписку в группе управления, добавьте модуль. Используйте функцию subscription, чтобы задать свойство scope. Укажите идентификатор подписки.

targetScope = 'managementGroup'

param subscriptionID string

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

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

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

Чтобы назначить группу ресурсов в группе управления, добавьте модуль. Используйте функцию resourceGroup, чтобы задать свойство scope. Укажите идентификатор подписки и имя группы ресурсов.

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

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

Чтобы создать ресурсы в клиенте, добавьте модуль. Используйте функцию tenant, чтобы задать его свойство scope. Пользователь, развертывающий шаблон, должен иметь необходимый доступ для развертывания в клиенте.

targetScope = 'managementGroup'

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

Или можно задать область / для некоторых типов ресурсов, например для групп управления. Создание новой группы управления описано в следующем разделе.

группа управления;

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

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

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

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

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

Подписки

Чтобы использовать шаблон ARM для создания новой подписки Azure в группе управления, см. следующие статьи:

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

Политика Azure

Определения настраиваемой политики, развернутые в группе управления, являются расширениями группы управления. Чтобы получить идентификатор определения настраиваемой политики, используйте функцию extensionResourceId(). Определения встроенных политик — это ресурсы уровня клиента. Чтобы получить идентификатор определения настраиваемой политики, используйте функцию tenantResourceId().

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

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

Дальнейшие действия

Сведения о других областях приведены в следующих статьях: