Развертывание ресурсов в нескольких областях
Иногда требуется развернуть ресурсы на нескольких уровнях иерархии в рамках одного развертывания. Ниже приведены некоторые ситуации, в которых это может потребоваться.
- Необходимо развернуть ресурсы в двух разных группах ресурсов. Например, может потребоваться создать группу безопасности сети в общей группе ресурсов, а также развернуть сетевой интерфейс для виртуальной машины в группе ресурсов для приложения.
- Вы используете шаблон для создания группы ресурсов, которая является ресурсом с областью действия подписки, а затем хотите развернуть учетную запись хранения и другие ресурсы Azure в этой группе ресурсов с помощью развертывания с областью действия группы ресурсов.
- Вы развертываете иерархию группы управления, а также хотите развернуть некоторые подписки, которые являются ресурсами с областью действия клиента.
С помощью Bicep можно создать развертывание, которое работает в диапазоне областей, используя ключевое слово scope
.
Примечание.
Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.
Указание области для модуля
Модули Bicep можно использовать для развертывания набора ресурсов в области, отличной от targetScope
, указанной в файле. Ниже приведен пример файла Bicep, который развернут с targetScope
из subscription
и использует модуль для развертывания некоторых ресурсов в группы ресурсов:
targetScope = 'subscription'
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('ToyNetworking')
name: 'networkModule'
}
Обратите внимание, что свойство scope
использует функцию Bicep, чтобы помочь определить целевую область. В предыдущем примере используется функция resourceGroup()
и указывается имя целевой группы ресурсов. Можно также использовать функции subscription()
, managementGroup()
и tenant()
. Используя ключевое слово targetScope
в файлах Bicep и ключевое слово scope
в модулях, можно создавать множество различных комбинаций областей действия для развертываний.
Примечание.
Единственным исключением является то, что файлы Bicep с targetScope
из resourceGroup
или subscription
не могут содержать модуль с scope
из managementGroup
.
Совет
При использовании файла Bicep с областью действия подписки для создания группы ресурсов можно использовать символьное имя группы ресурсов в качестве scope
для модуля. Это будет реализовано в следующем упражнении.
Развертывание в нескольких группах ресурсов
Обычно области используются для развертывания ресурсов в нескольких группах ресурсов. Хотя вы не можете задать свойство scope
для большинства ресурсов Azure, вы можете использовать модули, чтобы сообщить Bicep, что набор ресурсов должен быть развернут в другой группе ресурсов.
Например, может потребоваться создать один набор файлов Bicep, который развертывает виртуальную сеть и связанные с ней ресурсы в общей группе ресурсов ToyNetworking, а затем развернуть сетевой интерфейс в другой группе ресурсов. Ниже приведен пример того, как выглядит файл Bicep:
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('ToyNetworking')
name: 'networkModule'
}
resource networkInterface 'Microsoft.Network/networkInterfaces@2024-01-01' = {
name: 'production-nic'
location: resourceGroup().location
properties: {
ipConfigurations: [
{
name: 'toy-subnet-ip-configuration'
properties: {
subnet: {
id: networkModule.outputs.subnetResourceId
}
}
}
]
}
}
Обратите внимание, что ресурсы, которые должны быть развернуты в группе ресурсов ToyNetworking, определены в модуле, а выходные данные subnetResourceId
используются в определении ресурса сетевого интерфейса.
После развертывания этого файла можно выбрать другую целевую группу ресурсов с именем ProjectTeddybear, например:
az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...
Хотя развертывание предназначено для группы ресурсов ProjectTeddybear , ресурсы виртуальной сети развертываются в группе ресурсов ToyNetworking . Сетевой интерфейс развертывается в группе ресурсов ProjectTeddybear .
Группу ресурсов можно даже развернуть в другой подписке, включив идентификатор подписки в область resourceGroup
:
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
name: 'networkModule'
}
Аналогичным образом можно использовать функцию области subscription()
для развертывания ресурсов в нескольких подписках в области действия подписки, а функцию области managementGroup()
можно использовать для развертывания ресурсов в нескольких группах управления. Однако их нельзя развернуть для нескольких клиентов.
Указание области для одного ресурса
Ключевое scope
слово можно использовать для нескольких других типов ресурсов, а не только модулей. Ресурсы расширения используют ключевое слово scope
, чтобы указать, к какому ресурсу они применяются. Кроме того, ресурсы с областью действия клиента могут использовать ключевое слово scope
, чтобы их можно было развернуть из любого шаблона.
Например, файл Bicep можно использовать для создания иерархии группы управления, как показано в следующем примере:
targetScope = 'managementGroup'
resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'NonProduction'
properties: {
displayName: 'Non-production'
}
}
resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'SecretRND'
properties: {
displayName: 'Secret R&D Projects'
details: {
parent: {
id: parentManagementGroup.id
}
}
}
}
Обратите внимание, что в этом примере в файле шаблона используется targetScope = 'managementGroup'
, а затем он развертывает группы управления в пределах области tenant()
.
Примечание.
В предыдущем примере показано, как можно использовать Bicep для создания иерархии групп управления. Группа управления NonProduction будет дочерней по отношению к корневой группе управления, а группа управления SecretRND будет дочерней по отношению к группе управления NonProduction.
Создание группы управления и иерархии подписок
Теперь вы знаете, как развертывать множество различных ресурсов в разных областях, а также как использовать модули Bicep и ключевое слово scope
для развертывания комбинаций ресурсов. Давайте применим все эти новые знания для расширения иерархии групп управления в предыдущем примере. Теперь иерархия также будет содержать псевдоним подписки, который представляет собой ресурс с областью действия клиента, который создает новую подписку Azure:
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
Примечание.
При создании псевдонима подписки также указываются некоторые другие свойства, например область выставления счетов. Мы опустили их для ясности.
Затем можно связать подписку с группой управления, для которой требуется развернуть тип ресурса с именем Microsoft.Management/managementGroups/subscriptions
. Учитывая способ работы этого ресурса, его можно объявить в модуле. Например, есть файл с именем modules/mg-subscription-association.bicep:
targetScope = 'tenant'
@description('The name of the management group that should contain the subscription.')
param managementGroupName string
@description('The subscription ID to place into the management group.')
param subscriptionId string
resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' existing = {
name: managementGroupName
}
resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2023-04-01' = {
parent: managementGroup
name: subscriptionId
}
Обратите внимание, что ссылка на группу управления указывается с помощью ключевого слова existing
.
После обновления основной файл Bicep сможет создавать связь, включив модуль. Ниже приведен весь файл Bicep:
targetScope = 'managementGroup'
@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string
resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'NonProduction'
properties: {
displayName: 'Non-production'
}
}
resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'SecretRND'
properties: {
displayName: 'Secret R&D Projects'
details: {
parent: {
id: parentManagementGroup.id
}
}
}
}
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
name: 'subscriptionAssociation'
scope: tenant()
params: {
managementGroupName: childManagementGroup.name
subscriptionId: subscription.properties.subscriptionId
}
}
Как было показано выше, вы можете использовать все области и функции языка Bicep для создания сложных развертываний всей инфраструктуры Azure.