Resources implementeren in meerdere bereiken

Voltooid

Soms moet u resources implementeren op meerdere niveaus van uw hiërarchie vanuit één implementatie. Hier volgen enkele situaties waarin u dit mogelijk wilt doen:

  • U moet resources implementeren in twee verschillende resourcegroepen. U kunt bijvoorbeeld een netwerkbeveiligingsgroep maken in een gedeelde resourcegroep en ook een netwerkinterface implementeren voor een virtuele machine in een resourcegroep voor uw toepassing.
  • U gebruikt een sjabloon om een resourcegroep te maken. Dit is een resource met abonnementsbereik en u wilt vervolgens een opslagaccount en andere Azure-resources implementeren in die resourcegroep met behulp van een implementatie binnen het bereik van een resourcegroep.
  • U implementeert een beheergroephiërarchie en wilt ook enkele abonnementen implementeren. Dit zijn resources met tenantbereik.

Met Bicep kunt u een implementatie maken die binnen een bereik werkt met behulp van het scope trefwoord.

Notitie

De opdrachten in deze les worden weergegeven om concepten te illustreren. Voer de opdrachten nog niet uit. U oefent wat u hier binnenkort leert.

Het bereik voor een module opgeven

U kunt Bicep-modules gebruiken om een set resources te implementeren binnen een bereik dat verschilt van de targetScope opgegeven in het bestand. Hier volgt een voorbeeld van een Bicep-bestand dat is geïmplementeerd met een van een targetScope subscription, maar die een module gebruikt om bepaalde resources te implementeren in een resourcegroep:

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

U ziet dat de scope eigenschap een Bicep-functie gebruikt om het bereik te identificeren waarop moet worden gericht. In het voorgaande voorbeeld wordt de resourceGroup() functie gebruikt en wordt de naam opgegeven van de resourcegroep die moet worden gericht. U kunt ook de subscription()functies en managementGroup()tenant() functies gebruiken. Door het targetScope trefwoord op Bicep-bestanden en het scope trefwoord op modules te gebruiken, is het mogelijk om veel verschillende combinaties van bereiken voor uw implementaties te maken.

Notitie

Een uitzondering hierop is dat Bicep-bestanden met een targetScope van resourceGroup of subscription niet een module kunnen bevatten met een scope van managementGroup.

Tip

Als u een Bicep-bestand met abonnementsbereik gebruikt om een resourcegroep te maken, kunt u de symbolische naam van de resourcegroep gebruiken als de scope naam voor een module. In de volgende oefening ziet u hoe u dit doet.

Implementeren in meerdere resourcegroepen

Een veelvoorkomend gebruik van bereiken is het implementeren van resources in meerdere resourcegroepen. Hoewel u de eigenschap voor de scope meeste Azure-resources niet kunt instellen, kunt u modules gebruiken om Bicep te laten weten dat een set resources moet worden geïmplementeerd in een andere resourcegroep.

U kunt bijvoorbeeld één set Bicep-bestanden maken waarmee een virtueel netwerk en de bijbehorende resources worden geïmplementeerd in een gedeelde resourcegroep met de naam ToyNetworking en vervolgens een netwerkinterface implementeren in een andere resourcegroep. Het Bicep-bestand ziet er als volgt uit:

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

U ziet dat de resources die in de Resourcegroep ToyNetworking moeten worden geïmplementeerd, zijn gedefinieerd in een module en dat de subnetResourceId uitvoer wordt gebruikt in de resourcedefinitie van de netwerkinterface.

Nadat u dit bestand hebt geïmplementeerd, kunt u zich als volgt richten op een andere resourcegroep met de naam ProjectTeddybear:

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

Hoewel de implementatie is gericht op de ProjectTeddybear-resourcegroep , worden de virtuele netwerkresources geïmplementeerd in de Resourcegroep ToyNetworking . De netwerkinterface wordt geïmplementeerd in de resourcegroep ProjectTeddybear .

U kunt zelfs een resourcegroep in een ander abonnement implementeren door de abonnements-id in het resourceGroup bereik op te halen:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

Op dezelfde manier kunt u de subscription() bereikfunctie gebruiken om resources te implementeren voor meerdere abonnementen binnen het abonnementsbereik en kunt u de managementGroup() bereikfunctie gebruiken om de resources in meerdere beheergroepen te implementeren. U kunt ze echter niet implementeren in meerdere tenants.

Het bereik voor één resource opgeven

U kunt het scope trefwoord gebruiken voor enkele andere specifieke resourcetypen, niet alleen modules. Extensieresources gebruiken het scope trefwoord om op te geven op welke resource ze van toepassing zijn. Daarnaast kunnen resources met tenantbereik het scope trefwoord gebruiken, zodat u ze vanuit elke sjabloon kunt implementeren.

U kunt bijvoorbeeld een Bicep-bestand gebruiken om een beheergroephiërarchie te maken, zoals wordt weergegeven in het volgende voorbeeld:

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

In dit voorbeeld wordt gebruikgemaakt targetScope = 'managementGroup' van het sjabloonbestand, maar vervolgens worden de beheergroepen binnen het tenant() bereik geïmplementeerd.

Notitie

In het voorgaande voorbeeld ziet u hoe u Bicep kunt gebruiken om een beheergroephiërarchie te maken. De niet-productiebeheergroep is een onderliggend element van de hoofdbeheergroep en de SecretRND-beheergroep is een onderliggend element van de niet-productiebeheergroep .

Een beheergroep en abonnementshiërarchie maken

U weet nu hoe u veel verschillende resources implementeert op verschillende bereiken en u weet hoe u Bicep-modules en het scope trefwoord kunt gebruiken om combinaties van resources te implementeren. Laten we al deze nieuwe kennis toepassen om de hiërarchie van beheergroepen in het voorgaande voorbeeld uit te breiden. De hiërarchie bevat nu ook een abonnementsalias. Dit is een resource met tenantbereik waarmee een nieuw Azure-abonnement wordt gemaakt:

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Notitie

Wanneer u een abonnementsalias maakt, geeft u ook enkele andere eigenschappen op, zoals een factureringsbereik. We hebben ze voor duidelijkheid weggelaten.

Vervolgens kunt u het abonnement koppelen aan een beheergroep. Hiervoor moet u een resourcetype met de naam Microsoft.Management/managementGroups/subscriptionsimplementeren. Vanwege de manier waarop deze resource werkt, declareert u deze in een module. Hier volgt bijvoorbeeld een bestand met de naam 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
}

U ziet dat naar de beheergroep wordt verwezen via het existing trefwoord.

Het belangrijkste Bicep-bestand kan vervolgens de koppeling maken door de module op te slaan. Dit is het hele Bicep-bestand:

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

Zoals u hebt gezien, kunt u alle bereiken en bicep-taalfuncties samen gebruiken om geavanceerde implementaties van uw volledige Azure-infrastructuur te maken.