Distribuera resurser till flera omfång

Slutförd

Ibland behöver du distribuera resurser över flera nivåer i hierarkin inifrån en distribution. Här är några situationer där du kanske vill göra detta:

  • Du måste distribuera resurser mellan två olika resursgrupper. Du kanske till exempel vill skapa en nätverkssäkerhetsgrupp i en delad resursgrupp och även distribuera ett nätverksgränssnitt för en virtuell dator i en resursgrupp för ditt program.
  • Du använder en mall för att skapa en resursgrupp, som är en resurs med prenumerationsomfång, och vill sedan distribuera ett lagringskonto och andra Azure-resurser till resursgruppen med hjälp av en resursgruppsomfångsdistribution.
  • Du distribuerar en hanteringsgruppshierarki och vill även distribuera vissa prenumerationer, som är klientomfattande resurser.

Med Bicep kan du skapa en distribution som fungerar inom en rad olika omfång med hjälp av nyckelordet scope .

Kommentar

Kommandona i den här enheten visas för att illustrera begrepp. Kör inte kommandona än. Du kommer att öva på det du lär dig här snart.

Ange omfånget för en modul

Du kan använda Bicep-moduler för att distribuera en uppsättning resurser i ett omfång som skiljer sig från det targetScope som anges i filen. Här är ett exempel på en Bicep-fil som distribueras med en targetScope av en subscription, men som använder en modul för att distribuera vissa resurser till en resursgrupp:

targetScope = 'subscription'

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

Observera att egenskapen scope använder en Bicep-funktion för att identifiera det omfång som ska riktas. I föregående exempel används resourceGroup() funktionen och namnet på den resursgrupp som ska riktas. Du kan också använda subscription()funktionerna , managementGroup()och tenant() . Genom att använda nyckelordet targetScope i Bicep-filer och nyckelordet scope i moduler är det möjligt att skapa många olika kombinationer av omfång för dina distributioner.

Kommentar

Ett undantag är att Bicep-filer med en targetScope av resourceGroup eller subscription inte kan inkludera en modul med en scope av managementGroup.

Dricks

Om du använder en Bicep-fil med prenumerationsomfång för att skapa en resursgrupp kan du använda resursgruppens symboliska namn som scope för en modul. Du får se hur du gör detta i nästa övning.

Distribuera över flera resursgrupper

En vanlig användning av omfång är att distribuera resurser mellan flera resursgrupper. Även om du inte kan ange scope egenskapen för de flesta Azure-resurser kan du använda moduler för att berätta för Bicep att en uppsättning resurser ska distribueras till en annan resursgrupp.

Du kanske till exempel vill skapa en enda uppsättning Bicep-filer som distribuerar ett virtuellt nätverk och dess associerade resurser till en delad resursgrupp med namnet ToyNetworking och sedan distribuera ett nätverksgränssnitt till en annan resursgrupp. Så här ser Bicep-filen ut:

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

Observera att de resurser som ska distribueras till resursgruppen ToyNetworking definieras i en modul och subnetResourceId att utdata används i nätverksgränssnittets resursdefinition.

När du har distribuerat den här filen kan du rikta in dig på en annan resursgrupp med namnet ProjectTeddybear, så här:

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

Även om distributionen riktar sig mot resursgruppen ProjectTeddybear distribueras de virtuella nätverksresurserna till resursgruppen ToyNetworking . Nätverksgränssnittet distribueras till resursgruppen ProjectTeddybear .

Du kan till och med distribuera en resursgrupp i en annan prenumeration genom att inkludera prenumerations-ID:t i omfånget resourceGroup :

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

På samma sätt kan du använda omfångsfunktionen subscription() för att distribuera resurser över flera prenumerationer i prenumerationsomfånget, och du kan använda omfångsfunktionen managementGroup() för att distribuera resurserna mellan flera hanteringsgrupper. Du kan dock inte distribuera dem över flera klienter.

Ange omfånget för en enskild resurs

Du kan använda nyckelordet scope för några andra specifika resurstyper, inte bara moduler. Tilläggsresurser använder nyckelordet scope för att ange vilken resurs de gäller för. Dessutom kan resurser med klientomfattning använda nyckelordet scope så att du kan distribuera dem från valfri mall.

Du kan till exempel använda en Bicep-fil för att skapa en hanteringsgruppshierarki, som du ser i följande exempel:

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

Observera att det här exemplet används targetScope = 'managementGroup' i mallfilen, men distribuerar sedan hanteringsgrupperna inom omfånget tenant() .

Kommentar

Föregående exempel illustrerar hur du kan använda Bicep för att skapa en hanteringsgruppshierarki. Hanteringsgruppen NonProduction är underordnad rothanteringsgruppen och SecretRND-hanteringsgruppen är underordnad hanteringsgruppen NonProduction.

Skapa en hanteringsgrupp och prenumerationshierarki

Nu vet du hur du distribuerar många olika resurser i olika omfång och du vet hur du använder Bicep-moduler och nyckelordet scope för att distribuera kombinationer av resurser. Nu ska vi tillämpa all den här nya kunskapen på att utöka hanteringsgruppshierarkin i föregående exempel. Nu innehåller hierarkin även ett prenumerationsalias, som är en resurs med klientomfattning som skapar en ny Azure-prenumeration:

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

Kommentar

När du skapar ett prenumerationsalias anger du även några andra egenskaper som ett faktureringsomfång. Vi har utelämnat dem för tydlighetens skull.

Du kan sedan associera prenumerationen med en hanteringsgrupp, vilket kräver att du distribuerar en resurstyp med namnet Microsoft.Management/managementGroups/subscriptions. På grund av hur den här resursen fungerar deklarerar du den i en modul. Här är till exempel en fil med namnet 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
}

Observera att hanteringsgruppen refereras via nyckelordet existing .

Den huvudsakliga Bicep-filen kan sedan skapa associationen genom att inkludera modulen. Här är hela Bicep-filen:

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

Som du har sett kan du använda alla omfångs- och Bicep-språkfunktioner tillsammans för att skapa avancerade distributioner av hela Azure-infrastrukturen.