Distribuire le risorse in più ambiti

Completato

A volte è necessario distribuire le risorse in più livelli della gerarchia con un'unica operazione. Ecco alcune situazioni in cui può essere necessario:

  • È necessario distribuire le risorse in due gruppi di risorse diversi. Ad esempio, potrebbe essere necessario creare un gruppo di sicurezza di rete in un gruppo di risorse condivise e anche distribuire un'interfaccia di rete per una macchina virtuale in un gruppo di risorse per l'applicazione.
  • Si usa un modello per creare un gruppo di risorse, ovvero una risorsa con ambito sottoscrizione, e quindi si vogliono distribuire un account di archiviazione e altre risorse di Azure in tale gruppo di risorse usando una distribuzione con ambito gruppo di risorse.
  • Si distribuisce una gerarchia di gruppi di distribuzione e si vogliono anche distribuire alcune sottoscrizioni, ovvero risorse con ambito tenant.

Con Bicep è possibile creare una distribuzione che funzioni in un intervallo di ambiti usando la parola chiave scope.

Nota

I comandi riportati in questa unità vengono illustrati per spiegare i concetti. Non eseguire ancora i comandi. Presto sarà possibile provare quanto appreso.

Specificare l'ambito per un modulo

È possibile usare i moduli di Bicep per distribuire un set di risorse in un ambito diverso da targetScope specificato nel file. Ecco un esempio di file Bicep distribuito con targetScopesubscription ma che usa un modulo per distribuire alcune risorse in un gruppo di risorse:

targetScope = 'subscription'

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

Si noti che la proprietà scope usa una funzione di Bicep per identificare l'ambito di destinazione. Nell'esempio precedente viene usata la funzione resourceGroup() e viene specificato il nome del gruppo di risorse di destinazione. È anche possibile usare le funzioni subscription(), managementGroup() e tenant(). Usando la parola chiave targetScope nei file Bicep e la parola chiave scope nei moduli, è possibile creare molte combinazioni diverse di ambiti per le distribuzioni.

Nota

Un'eccezione è che i file Bicep con targetScoperesourceGroup o subscription non possono includere un modulo con scopemanagementGroup.

Suggerimento

Se si usa un file Bicep con ambito sottoscrizione per creare un gruppo di risorse, è possibile usare il nome simbolico del gruppo di risorse come scope per un modulo. Si vedrà come eseguire questa operazione nell'esercizio successivo.

Distribuire tra più gruppi di risorse

Un uso comune degli ambiti è la distribuzione di risorse tra più gruppi di risorse. Anche se non è possibile impostare la proprietà scope nella maggior parte delle risorse di Azure, è possibile usare i moduli per indicare a Bicep che un set di risorse deve essere distribuito in un gruppo di risorse diverso.

Ad esempio, è possibile creare un singolo set di file Bicep che distribuisce una rete virtuale e le risorse associate in un gruppo di risorse condiviso denominato ToyNetworking e quindi distribuire un'interfaccia di rete in un gruppo di risorse diverso. Il file Bicep ha l'aspetto seguente:

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

resource networkInterface 'Microsoft.Network/networkInterfaces@2020-11-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

Si noti che le risorse da distribuire nel gruppo di risorse ToyNetworking sono definite in un modulo e l'output subnetResourceId viene usato nella definizione di risorse dell'interfaccia di rete.

Dopo aver distribuito questo file, è possibile scegliere come destinazione un altro gruppo di risorse denominato ProjectTeddybear, come indicato di seguito:

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

Anche se la distribuzione è destinata al gruppo di risorse ProjectTeddybear , le risorse di rete virtuale vengono distribuite nel gruppo di risorse ToyNetworking . L'interfaccia di rete viene distribuita nel gruppo di risorse ProjectTeddybear .

È anche possibile distribuire un gruppo di risorse in un'altra sottoscrizione includendo l'ID sottoscrizione nell'ambito resourceGroup:

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

Analogamente, è possibile usare la funzione di ambito subscription() per distribuire le risorse tra più sottoscrizioni nell'ambito della sottoscrizione, nonché usare la funzione di ambito managementGroup() per distribuire le risorse tra più gruppi di gestione. Tuttavia, non è possibile distribuirle tra più tenant.

Specificare l'ambito per una singola risorsa

È possibile usare la scope parola chiave in alcuni altri tipi di risorse specifici, non solo nei moduli. Le risorse di estensione usano la parola chiave scope per specificare la risorsa a cui si applicano. Inoltre, le risorse con ambito tenant possono usare la parola chiave scope in modo che sia possibile distribuirle da qualsiasi modello.

Ad esempio, è possibile usare un file Bicep per creare una gerarchia di gruppi di gestione, come illustrato nell'esempio seguente:

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

Si noti che questo esempio usa targetScope = 'managementGroup' nel file modello, ma quindi distribuisce i gruppi di gestione all'interno dell'ambito tenant().

Nota

L'esempio precedente illustra come usare Bicep per creare una gerarchia di gruppi di gestione. Il gruppo di gestione NonProduction sarà un elemento figlio del gruppo di gestione radice e il gruppo di gestione SecretRND sarà un elemento figlio del gruppo di gestione NonProduction.

Creare un gruppo di gestione e una gerarchia di sottoscrizioni

Si è appreso come distribuire molte risorse diverse in una varietà di ambiti e come usare i moduli di Bicep e la parola chiave scope per distribuire combinazioni di risorse. Applicare tutte queste nuove conoscenze estendendo la gerarchia di gruppi di gestione nell'esempio precedente. Ora la gerarchia includerà anche un alias di sottoscrizione, ovvero una risorsa con ambito tenant che crea una nuova sottoscrizione di Azure:

resource subscription 'Microsoft.Subscription/aliases@2020-09-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Nota

Quando si crea un alias di sottoscrizione, si specificano anche altre proprietà, ad esempio un ambito di fatturazione. Li abbiamo omessi per maggiore chiarezza.

È quindi possibile associare la sottoscrizione a un gruppo di gestione, per cui è necessario distribuire un tipo di risorsa denominato Microsoft.Management/managementGroups/subscriptions. Considerando il nodo in cui funziona questa risorsa, è necessario dichiararla in un modulo. Ad esempio, ecco un file denominato 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@2021-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2021-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

Si noti che la existing parola chiave fa riferimento al gruppo di gestione.

Il file Bicep principale può quindi creare l'associazione includendo il modulo. Ecco l'intero file Bicep:

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2020-09-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

Come si è visto, è possibile usare tutti gli ambiti insieme alle funzionalità del linguaggio Bicep per creare distribuzioni sofisticate dell'intera infrastruttura di Azure.