Ćwiczenie — wdrażanie zasobów w wielu zakresach przy użyciu modułów

Ukończone

Uwaga

To ćwiczenie wymaga subskrypcji platformy Azure. Jeśli jeszcze go nie masz, możesz uzyskać bezpłatną subskrypcję.

Zespół ds. zasobów badawczo-badawczy poprosił o pomoc w utworzeniu sieci wirtualnej w subskrypcji usługi Project Teddybear. Wiesz, że w przyszłości pomożesz zespołowi w korzystaniu z większej liczby subskrypcji, więc zdecydujesz się rozszerzyć szablon Bicep wielokrotnego użytku, aby wdrożyć sieć wirtualną dla członków zespołu do użycia.

W tym ćwiczeniu zaktualizujesz szablon, który został rozpoczęty w ostatnim ćwiczeniu.

Podczas tego procesu wykonasz następujące czynności:

  • Zaktualizuj szablon o zakresie subskrypcji, aby utworzyć nową grupę zasobów.
  • Utwórz oddzielny moduł Bicep z siecią wirtualną i użyj parametrów, aby kontrolować sposób konfigurowania sieci wirtualnej.
  • Zaktualizuj szablon, aby wdrożyć moduł w grupie zasobów.
  • Wdrażanie szablonu.

To ćwiczenie wymaga uprawnień do wdrażania zasobów w zakresie subskrypcji. Jeśli nie możesz spełnić tego wymagania przy użyciu bieżącego konta platformy Azure, możesz uzyskać bezpłatną wersję próbną i utworzyć nową subskrypcję i dzierżawę platformy Azure. Możesz też pominąć kroki wdrażania w tym ćwiczeniu.

Tworzenie grupy zasobów

  1. W programie Visual Studio Code otwórz plik main.bicep utworzony we wcześniejszym ćwiczeniu.

  2. W obszarze bieżących definicji zmiennych dodaj następującą definicję zmiennej:

    var resourceGroupName = 'ToyNetworking'
    
  3. W dolnej części pliku dodaj następującą definicję zasobu:

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-01-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    Zwróć uwagę, że definiujesz grupę zasobów tak samo jak w przypadku definiowania innego zasobu. Grupa zasobów to zasób o zakresie subskrypcji, który można wdrożyć i zarządzać subscriptionw plikach Bicep z ustawionym ustawieniem targetScope .

  4. Zapisz zmiany w pliku.

Dodawanie modułu w celu utworzenia sieci wirtualnej

Następnie utworzysz moduł Bicep dla sieci wirtualnej zespołu R&D. W dalszej części tego ćwiczenia wdrożysz zasoby w module w grupie zasobów.

  1. W programie Visual Studio Code utwórz nowy folder o nazwie modules w tym samym folderze, w którym utworzono plik main.bicep .

  2. W folderze modules utwórz i zapisz plik o nazwie virtualNetwork.bicep.

  3. W pliku virtualNetwork.bicep dodaj następującą zawartość:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-11-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    Zwróć uwagę, że nie określono targetScope elementu dla tego modułu. Nie musisz określać zakresu docelowego, gdy plik Bicep jest przeznaczony dla grupy zasobów.

  4. Zapisz zmiany w pliku.

Korzystanie z modułu we wdrożeniu subskrypcji

Teraz możesz poinformować Bicep o wdrożeniu modułu w grupie zasobów.

  1. W pliku main.bicep w programie Visual Studio Code w wierszu targetScope dodaj następujące definicje parametrów:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Te parametry umożliwiają wielokrotne użycie szablonu. Za każdym razem, gdy zespół badawczy potrzebuje nowej subskrypcji, możesz utworzyć sieć wirtualną o unikatowej nazwie i zakresie adresów IP.

  2. W dolnej części pliku dodaj następującą definicję modułu:

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    Zwróć uwagę, że jawnie określasz scope element dla modułu. Bicep rozumie, że zasoby w module powinny być wdrażane w grupie zasobów utworzonej wcześniej w pliku.

Weryfikowanie szablonu

Plik main.bicep powinien wyglądać następująco:

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-01-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

Plik modules/virtualNetwork.bicep powinien wyglądać następująco:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-11-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

Jeśli dowolny plik nie jest zgodny z przykładem, skopiuj przykład lub dostosuj szablon.

Wdrażanie szablonu na platformie Azure

W terminalu programu Visual Studio Code wdróż szablon przy użyciu następujących poleceń interfejsu wiersza polecenia platformy Azure:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

W terminalu programu Visual Studio Code wdróż szablon przy użyciu następujących poleceń programu Azure PowerShell:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

Zwróć uwagę, że przekazujesz wartości parametrów virtualNetworkName i virtualNetworkAddressPrefix . Gdy inny zespół ds. ściągnąć prośbę o przygotowanie subskrypcji, będzie można zmienić te wartości, aby nadać zespołowi własną sieć wirtualną.

Wdrożenie może potrwać minutę lub dwie, a następnie zobaczysz pomyślne wdrożenie.

Weryfikowanie wdrożenia

Teraz sprawdzisz grupę zasobów i wdrożenie utworzone przez moduł.

  1. Przejdź do portalu Azure Portal.

  2. W okienku po lewej stronie wybierz pozycję Grupy zasobów. Zwróć uwagę, że utworzono grupę zasobów ToyNetworking .

  3. Wybierz grupę zasobów ToyNetworking . Zwróć uwagę, że moduł został pomyślnie wdrożony w grupie zasobów i że sieć wirtualna została utworzona:

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

Oczyszczanie zasobów

Pomyślnie wdrożono zasoby o zakresie subskrypcji, w tym grupę zasobów, i użyto modułu do wdrożenia zasobu w utworzonej grupie zasobów. Możesz usunąć utworzone zasoby zasad i grupę zasobów.

Uwaga

To polecenie spowoduje trwałe usunięcie grupy zasobów o nazwie ToyNetworking i wszystkich jej zasobów. Jeśli wdrożono inne elementy w tej grupie zasobów, należy pominąć ten krok.

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking