Bereitstellen von Ressourcen in mehreren Bereichen
Manchmal müssen Sie Ressourcen auf mehreren Ebenen Ihrer Hierarchie aus einer Bereitstellung bereitstellen. Dies sind einige Situationen, in denen Sie vielleicht so vorgehen möchten:
- Sie müssen Ressourcen in zwei verschiedenen Ressourcengruppen bereitstellen. Beispielsweise möchten Sie vielleicht eine Netzwerksicherheitsgruppe in einer freigegebenen Ressourcengruppe erstellen und außerdem eine Netzwerkschnittstelle für einen virtuellen Computer in einer Ressourcengruppe für Ihre Anwendung bereitstellen.
- Sie verwenden eine Vorlage, um eine Ressourcengruppe zu erstellen, bei der es sich um eine Ressource im Abonnementbereich handelt. Anschließend möchten Sie ein Speicherkonto und andere Azure-Ressourcen mithilfe einer Bereitstellung im Ressourcengruppenbereich für diese Ressourcengruppe bereitstellen.
- Sie stellen eine Verwaltungsgruppenhierarchie bereit und möchten auch einige Abonnements bereitstellen, bei denen es sich um Ressourcen im Mandantenbereich handelt.
Mit Bicep können Sie mithilfe des Schlüsselworts scope
eine Bereitstellung erstellen, die für verschiedene Bereiche funktioniert.
Hinweis
Die Befehle in dieser Lerneinheit dienen der Veranschaulichung der Konzepte. Führen Sie die Befehle jetzt noch nicht aus. Sie können das Erlernte in Kürze üben.
Angeben des Bereichs für ein Modul
Sie können Bicep-Module verwenden, um einen Satz von Ressourcen in einem Bereich bereitzustellen, der sich von dem in der Datei targetScope
angegebenen Bereich unterscheidet. Hier sehen Sie eine Bicep-Beispieldatei, die mit einem targetScope
von subscription
bereitgestellt wird, aber ein Modul verwendet, um einige Ressourcen in einer Ressourcengruppe bereitzustellen:
targetScope = 'subscription'
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('ToyNetworking')
name: 'networkModule'
}
Beachten Sie, dass die scope
-Eigenschaft eine Bicep-Funktion verwendet, um den Zielbereich zu identifizieren. Im vorherigen Beispiel wird die resourceGroup()
-Funktion verwendet und der Name der Zielressourcengruppe angegeben. Sie können auch die Funktionen subscription()
, managementGroup()
und tenant()
verwenden. Durch die Verwendung des Schlüsselworts targetScope
für Bicep-Dateien und des Schlüsselworts scope
für Module ist es möglich, viele verschiedene Kombinationen von Bereichen für Ihre Bereitstellungen zu erstellen.
Hinweis
Eine Ausnahme besteht darin, dass Bicep-Dateien mit einem targetScope
von resourceGroup
oder subscription
kein Modul mit einem scope
von managementGroup
enthalten können.
Tipp
Wenn Sie eine Bicep-Datei im Abonnementbereich verwenden, um eine Ressourcengruppe zu erstellen, können Sie den symbolischen Namen der Ressourcengruppe als scope
für ein Modul verwenden. Die entsprechende Vorgehensweise wird in der nächsten Übung gezeigt.
Bereitstellen in mehreren Ressourcengruppen
Bereiche werden häufig verwendet, um Ressourcen über mehrere Ressourcengruppen hinweg bereitzustellen. Obwohl Sie die scope
-Eigenschaft für die meisten Azure-Ressourcen nicht festlegen können, können Sie Bicep mithilfe von Modulen mitteilen, dass eine Gruppe von Ressourcen in einer anderen Ressourcengruppe bereitgestellt werden soll.
Beispielsweise können Sie eine einzelne Gruppe von Bicep-Dateien erstellen, die ein virtuelles Netzwerk und die zugehörigen Ressourcen in einer freigegebenen Ressourcengruppe namens ToyNetworking bereitstellen und dann eine Netzwerkschnittstelle in einer anderen Ressourcengruppe bereitstellen. Die Bicep-Datei sieht wie folgt aus:
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
}
}
}
]
}
}
Beachten Sie, dass die Ressourcen, die in der Ressourcengruppe ToyNetworking bereitgestellt werden sollen, in einem Modul definiert sind. Außerdem wird die subnetResourceId
-Ausgabe in der Ressourcendefinition der Netzwerkschnittstelle verwendet.
Nachdem Sie diese Datei bereitgestellt haben, können Sie eine andere Ressourcengruppe mit dem Namen ProjectTeddybear wie folgt als Ziel verwenden:
az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...
Obwohl die Bereitstellung auf die Ressourcengruppe ProjectTeddybear abzielt, werden die Ressourcen des virtuellen Netzwerks in der Ressourcengruppe ToyNetworking bereitgestellt. Die Netzwerkschnittstelle wird in der Ressourcengruppe ProjectTeddybear bereitgestellt.
Sie können sogar eine Ressourcengruppe in einem anderen Abonnement bereitstellen, indem Sie die Abonnement-ID in den resourceGroup
-Bereich einbinden:
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
name: 'networkModule'
}
Auf ähnliche Weise können Sie die subscription()
-Bereichsfunktion verwenden, um Ressourcen für mehrere Abonnements im Abonnementbereich bereitzustellen, und Sie können die managementGroup()
-Bereichsfunktion verwenden, um die Ressourcen über mehrere Verwaltungsgruppen hinweg bereitzustellen. Sie können sie jedoch nicht mandantenübergreifend bereitstellen.
Angeben des Bereichs für eine einzelne Ressource
Sie können das Schlüsselwort scope
für einige andere spezifische Ressourcentypen verwenden, nicht nur für Module. Erweiterungsressourcen verwenden das Schlüsselwort scope
, um anzugeben, für welche Ressource sie gelten. Darüber hinaus können Ressourcen im Mandantenbereich das Schlüsselwort scope
verwenden, sodass Sie sie aus einer beliebigen Vorlage bereitstellen können.
Beispielsweise können Sie eine Bicep-Datei verwenden, um eine Verwaltungsgruppenhierarchie zu erstellen, wie im folgenden Beispiel gezeigt:
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
}
}
}
}
Beachten Sie, dass in diesem Beispiel targetScope = 'managementGroup'
in der Vorlagendatei verwendet wird, dann aber die Verwaltungsgruppen innerhalb des tenant()
-Bereichs bereitgestellt werden.
Hinweis
Im vorherigen Beispiel wird veranschaulicht, wie Sie Bicep verwenden können, um eine Verwaltungsgruppenhierarchie zu erstellen. Die Verwaltungsgruppe NonProduction ist ein untergeordnetes Element der Stammverwaltungsgruppe, und die Verwaltungsgruppe SecretRND ist ein untergeordnetes Element der Verwaltungsgruppe NonProduction.
Erstellen einer Verwaltungsgruppe und einer Abonnementhierarchie
Nun wissen Sie, wie Sie viele verschiedene Ressourcen in einer Vielzahl von Bereichen bereitstellen, und Sie wissen, wie Sie Bicep-Module und das Schlüsselwort scope
verwenden, um Kombinationen von Ressourcen bereitzustellen. Wenden wir dieses neue Wissen an, um die Verwaltungsgruppenhierarchie im vorherigen Beispiel zu erweitern. Nun enthält die Hierarchie auch einen Abonnementalias, bei dem es sich um eine Ressource im Mandantenbereich handelt, die ein neues Azure-Abonnement erstellt:
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
Hinweis
Wenn Sie einen Abonnementalias erstellen, geben Sie auch einige andere Eigenschaften an, z. B. einen Abrechnungsbereich. Wir haben diese aus Gründen der Übersichtlichkeit weggelassen.
Anschließend können Sie das Abonnement einer Verwaltungsgruppe zuordnen. Dazu müssen Sie einen Ressourcentyp namens Microsoft.Management/managementGroups/subscriptions
bereitstellen. Aufgrund der Funktionsweise dieser Ressource würden Sie sie in einem Modul deklarieren. Hier ist beispielsweise eine Datei mit dem Namen 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
}
Beachten Sie, dass über das Schlüsselwort existing
auf die Verwaltungsgruppe verwiesen wird.
Die Bicep-Hauptdatei kann dann die Zuordnung erstellen, indem sie das Modul einbindet. Dies ist die gesamte Bicep-Datei:
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
}
}
Wie Sie gesehen haben, können Sie alle Bereiche und Bicep-Sprachfeatures zusammen verwenden, um anspruchsvolle Bereitstellungen Ihrer gesamten Azure-Infrastruktur zu erstellen.