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

Завершено

Примечание.

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

Команда исследования и разработки попросила вас помочь с созданием виртуальной сети в подписке 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 для виртуальной сети команды исследования и разработки. Позже в рамках этого упражнения вы развернете ресурсы модуля в группе ресурсов.

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

  2. В папке modules создайте и сохраните файл с именем 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. В Visual Studio Code в файле main.bicep под строкой targetScope добавьте следующие определения параметров:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Благодаря этим параметрам шаблон станет многоразовым. В любое время, когда команде исследования и разработки потребуется новая подписка, вы сможете создать виртуальную сеть с уникальным именем и диапазоном 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. Когда другая команда разработчиков попросит вас подготовить для них подписку, вы сможете изменить эти значения, чтобы предоставить этой команде собственную виртуальную сеть.

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

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

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

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

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

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

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

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

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

Внимание

Эта команда навсегда удалит группу ресурсов с именем 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