Wdrażanie zasobów w wielu zakresach
Czasami należy wdrożyć zasoby na wielu poziomach hierarchii z poziomu jednego wdrożenia. Oto kilka sytuacji, w których warto to zrobić:
- Należy wdrożyć zasoby w dwóch różnych grupach zasobów. Możesz na przykład utworzyć sieciową grupę zabezpieczeń w udostępnionej grupie zasobów, a także wdrożyć interfejs sieciowy dla maszyny wirtualnej w grupie zasobów dla aplikacji.
- Używasz szablonu do utworzenia grupy zasobów, która jest zasobem o zakresie subskrypcji, a następnie chcesz wdrożyć konto magazynu i inne zasoby platformy Azure w tej grupie zasobów przy użyciu wdrożenia o zakresie grupy zasobów.
- Wdrażasz hierarchię grup zarządzania, a także chcesz wdrożyć niektóre subskrypcje, które są zasobami o zakresie dzierżawy.
Za pomocą Bicep można utworzyć wdrożenie, które działa w wielu zakresach przy użyciu słowa kluczowego scope
.
Uwaga
Polecenia w tej lekcji są wyświetlane w celu zilustrowania pojęć. Nie uruchamiaj jeszcze poleceń. Będziesz ćwiczyć to, czego nauczysz się tutaj wkrótce.
Określanie zakresu modułu
Moduły Bicep umożliwiają wdrażanie zestawu zasobów w zakresie innym niż targetScope
określony w pliku. Oto przykładowy plik Bicep wdrożony za pomocą targetScope
subscription
elementu , ale używa modułu do wdrażania niektórych zasobów w grupie zasobów:
targetScope = 'subscription'
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('ToyNetworking')
name: 'networkModule'
}
Zwróć uwagę, że scope
właściwość używa funkcji Bicep, aby ułatwić określenie zakresu, który ma być ukierunkowany. W poprzednim przykładzie użyto resourceGroup()
funkcji i określono nazwę grupy zasobów, która ma być docelowa. Można również użyć subscription()
funkcji , managementGroup()
i tenant()
. Używając słowa kluczowego targetScope
w plikach Bicep i słowie scope
kluczowym w modułach, można utworzyć wiele różnych kombinacji zakresów dla wdrożeń.
Uwaga
Jednym z wyjątków jest to, że pliki Bicep z elementem targetScope
lub resourceGroup
subscription
nie mogą zawierać modułu z wartością scope
managementGroup
.
Napiwek
Jeśli używasz pliku Bicep o zakresie subskrypcji do utworzenia grupy zasobów, możesz użyć symbolicznej nazwy grupy zasobów jako scope
dla modułu. Zobaczysz, jak to zrobić w następnym ćwiczeniu.
Wdrażanie w wielu grupach zasobów
Typowym zastosowaniem zakresów jest wdrożenie zasobów w wielu grupach zasobów. Chociaż nie można ustawić scope
właściwości dla większości zasobów platformy Azure, możesz użyć modułów, aby poinformować Bicep, że zestaw zasobów powinien zostać wdrożony w innej grupie zasobów.
Możesz na przykład utworzyć pojedynczy zestaw plików Bicep, który wdraża sieć wirtualną i skojarzone z nią zasoby do udostępnionej grupy zasobów o nazwie ToyNetworking, a następnie wdrożyć interfejs sieciowy w innej grupie zasobów. Oto jak wygląda plik 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
}
}
}
]
}
}
Zwróć uwagę, że zasoby, które mają zostać wdrożone w grupie zasobów ToyNetworking , są zdefiniowane w module, a subnetResourceId
dane wyjściowe są używane w definicji zasobów interfejsu sieciowego.
Po wdrożeniu tego pliku można zakierować inną grupę zasobów o nazwie ProjectTeddybear w następujący sposób:
az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...
Mimo że wdrożenie jest przeznaczone dla grupy zasobów ProjectTeddybear , zasoby sieci wirtualnej są wdrażane w grupie zasobów ToyNetworking . Interfejs sieciowy jest wdrażany w grupie zasobów ProjectTeddybear .
Możesz nawet wdrożyć grupę zasobów w innej subskrypcji, uwzględniając identyfikator subskrypcji w resourceGroup
zakresie:
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
name: 'networkModule'
}
Podobnie można użyć subscription()
funkcji zakresu, aby wdrożyć zasoby w wielu subskrypcjach w zakresie subskrypcji i użyć managementGroup()
funkcji zakresu, aby wdrożyć zasoby w wielu grupach zarządzania. Nie można ich jednak wdrożyć w wielu dzierżawach.
Określanie zakresu pojedynczego zasobu
Możesz użyć scope
słowa kluczowego w kilku innych typach zasobów, a nie tylko modułach. Zasoby rozszerzenia używają słowa kluczowego scope
, aby określić, do którego zasobu mają zastosowanie. Ponadto zasoby o zakresie dzierżawy mogą używać słowa kluczowego scope
, aby można je było wdrożyć z dowolnego szablonu.
Na przykład możesz użyć pliku Bicep do utworzenia hierarchii grup zarządzania, jak pokazano w poniższym przykładzie:
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
}
}
}
}
Zwróć uwagę, że w tym przykładzie użyto targetScope = 'managementGroup'
pliku szablonu, ale następnie wdraża grupy zarządzania w tenant()
zakresie.
Uwaga
W poprzednim przykładzie pokazano, jak za pomocą Bicep utworzyć hierarchię grup zarządzania. Grupa zarządzania NonProduction będzie elementem podrzędnym głównej grupy zarządzania, a grupa zarządzania SecretRND będzie elementem podrzędnym grupy zarządzania NonProduction .
Tworzenie grupy zarządzania i hierarchii subskrypcji
Teraz wiesz, jak wdrożyć wiele różnych zasobów w różnych zakresach i wiesz, jak używać modułów Bicep i scope
słowa kluczowego do wdrażania kombinacji zasobów. Zastosujmy całą tę nową wiedzę, aby rozszerzyć hierarchię grup zarządzania w poprzednim przykładzie. Teraz hierarchia będzie również zawierać alias subskrypcji, który jest zasobem o zakresie dzierżawy, który tworzy nową subskrypcję platformy Azure:
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
Uwaga
Podczas tworzenia aliasu subskrypcji należy również określić inne właściwości, takie jak zakres rozliczeniowy. Pominięto je w celu jasności.
Następnie możesz skojarzyć subskrypcję z grupą zarządzania, która wymaga wdrożenia typu zasobu o nazwie Microsoft.Management/managementGroups/subscriptions
. Ze względu na sposób działania tego zasobu należy zadeklarować go w module. Na przykład oto plik o nazwie 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
}
Zwróć uwagę, że grupa zarządzania jest przywołynięta za pomocą słowa kluczowego existing
.
Główny plik Bicep może następnie utworzyć skojarzenie, dołączając moduł. Oto cały plik 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
}
}
Jak już wiesz, możesz używać wszystkich zakresów i funkcji języka Bicep razem do tworzenia zaawansowanych wdrożeń całej infrastruktury platformy Azure.