Wdrażanie zasobów w wielu zakresach

Ukończone

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 subscriptionelementu , 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.