Упражнение. Развертывание ресурсов в нескольких областях с помощью модулей

Завершено

Заметка

Для этого упражнения требуется подписка Azure. Если у вас еще нет подписки, вы можете получить бесплатную подписку.

Команда R&D попросила вашей помощи в создании виртуальной сети в подписке Project Teddybear. Вы знаете, что в будущем вы будете помогать команде с новыми подписками, поэтому решили расширить повторно используемый шаблон Bicep для развертывания виртуальной сети, которую смогут использовать участники команды.

В этом упражнении вы обновите шаблон, который вы начали создавать в последнем упражнении.

Во время процесса вы выполните следующие действия.

  • Обновите шаблон с областью действия подписки, чтобы создать новую группу ресурсов.
  • Создайте отдельный модуль Bicep с виртуальной сетью и используйте параметры для управления настройкой виртуальной сети.
  • Обновите шаблон для развертывания модуля в группе ресурсов.
  • Разверните шаблон.

В этом упражнении требуется разрешение на развертывание ресурсов с областью подписки. Если вы не можете выполнить это требование с текущей учетной записью Azure, вы можете получить бесплатную пробную версию и создать новую подписку Azure и клиент. Кроме того, можно пропустить шаги развертывания в этом упражнении.

Создание группы ресурсов

  1. В Visual Studio Code откройте файл main.bicep, созданный в предыдущем упражнении.

  2. В определении текущих переменных добавьте следующее определение переменной:

    var resourceGroupName = 'ToyNetworking'
    
  3. В нижней части файла добавьте следующее определение ресурса:

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

    Обратите внимание, что вы определяете группу ресурсов так же, как и другой ресурс. Группа ресурсов — это ресурс с областью подписки, который можно развернуть и управлять в файлах Bicep с targetScope, заданным для subscription.

  4. Сохраните изменения в файле.

Добавление модуля для создания виртуальной сети

Далее вы создадите модуль Bicep для виртуальной сети команды R&D. Вы развернете ресурсы из модуля в группу ресурсов позже в этом упражнении.

  1. В Visual Studio Code создайте новую папку с именем модулей в той же папке, в которой вы создали файл main.bicep.

  2. В папке модулей создайте и сохраните файл virtualNetwork.bicep.

  3. В файле virtualNetwork.bicep добавьте следующее содержимое:

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

    Обратите внимание, что вы не указали targetScope для этого модуля. Вам не нужно указывать целевую область, когда файл Bicep предназначен для группы ресурсов.

  4. Сохраните изменения в файле.

Использование модуля в развертывании подписки

Теперь вы готовы сообщить Bicep, чтобы он развернул модуль в группе ресурсов.

  1. В файле main.bicep в Visual Studio Code в строке targetScope добавьте следующие определения параметров:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Эти параметры позволяют повторно использовать шаблон. В любой момент, когда команда R&D нуждается в новой подписке, вы можете создать виртуальную сеть с уникальным именем и диапазоном IP-адресов.

  2. В нижней части файла добавьте следующее определение модуля:

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

    Обратите внимание, что вы явно указываете scope для модуля. Bicep понимает, что ресурсы внутри модуля должны развертываться в группе ресурсов, созданной ранее в файле.

Проверка шаблона

Файл main.bicep должен выглядеть следующим образом:

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

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

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-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@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

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

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

Файл modules/virtualNetwork.bicep должен выглядеть следующим образом:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

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

Если любой файл не соответствует примеру, скопируйте пример или измените шаблон.

Развертывание шаблона в Azure

В терминале Visual Studio Code разверните шаблон с помощью следующих команд Azure CLI:

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

В терминале Visual Studio Code разверните шаблон с помощью следующих команд 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

Обратите внимание, что вы передаете значения для параметров virtualNetworkName и virtualNetworkAddressPrefix. Когда другая команда R&D просит вас подготовить подписку для них, вы сможете изменить эти значения, чтобы дать этой команде собственную виртуальную сеть.

Развертывание может занять минуту или два, а затем вы увидите успешное развертывание.

Проверка развертывания

Теперь вы проверите группу ресурсов и развертывание, созданное модулем.

  1. Перейдите на портал Azure.

  2. На левой панели выберите группы ресурсов. Обратите внимание, что была создана группа ресурсов ToyNetworking.

  3. Выберите группу ресурсов ToyNetworking. Обратите внимание, что модуль был развернут в группе ресурсов и что виртуальная сеть создана:

    снимок экрана портала Azure, показывающий группу ресурсов ToyNetworking.

Очистка ресурсов

Вы успешно развернули ресурсы с областью подписки, включая группу ресурсов, и вы использовали модуль для развертывания ресурса в созданной группе ресурсов. Вы можете удалить созданные ресурсы политики и группу ресурсов.

Осторожность

Эта команда окончательно удаляет группу ресурсов с именем ToyNetworking и все ее ресурсы. Если вы развернули что-либо другое в этой группе ресурсов, пропустите этот шаг.

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