Exercício - Implantar recursos em vários escopos usando módulos

Concluído

Nota

Este exercício requer uma assinatura do Azure. Se ainda não tiver uma, pode obter uma subscrição gratuita.

A equipa de I&D pediu a sua ajuda para criar uma rede virtual na subscrição do Project Teddybear. Você sabe que ajudará a equipe com mais assinaturas no futuro, então decide estender seu modelo Bicep reutilizável para implantar uma rede virtual para os membros da equipe usarem.

Neste exercício, você atualizará o modelo que começou a criar no último exercício.

Durante o processo, você:

  • Atualize o modelo com escopo de assinatura para criar um novo grupo de recursos.
  • Crie um módulo Bicep separado com uma rede virtual e use parâmetros para controlar como a rede virtual é configurada.
  • Atualize o modelo para implantar o módulo no grupo de recursos.
  • Implemente o modelo.

Este exercício requer que você tenha permissão para implantar recursos com escopo de assinatura. Se não conseguir cumprir este requisito com a sua conta atual do Azure, pode obter uma avaliação gratuita e criar uma nova subscrição e inquilino do Azure. Como alternativa, você pode ignorar as etapas de implantação neste exercício.

Criar um grupo de recursos

  1. No Visual Studio Code, abra o arquivo main.bicep que você criou no exercício anterior.

  2. Nas definições de variáveis atuais, adicione a seguinte definição de variável:

    var resourceGroupName = 'ToyNetworking'
    
  3. Na parte inferior do arquivo, adicione a seguinte definição de recurso:

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

    Observe que você está definindo o grupo de recursos da mesma forma que definiria outro recurso. Um grupo de recursos é um recurso com escopo de assinatura que pode ser implantado e gerenciado em arquivos Bicep com o targetScope definido como subscription.

  4. Guarde as alterações ao ficheiro.

Adicionar um módulo para criar uma rede virtual

Em seguida, você criará um módulo Bicep para a rede virtual da equipe de P&D. Você implantará os recursos no módulo para o grupo de recursos posteriormente neste exercício.

  1. No Visual Studio Code, crie uma nova pasta chamada modules na mesma pasta onde você criou o arquivo main.bicep .

  2. Na pasta modules, crie e salve um arquivo chamado virtualNetwork.bicep.

  3. No arquivo virtualNetwork.bicep, adicione o seguinte conteúdo:

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

    Observe que você não especificou um targetScope para este módulo. Não é necessário especificar um escopo de destino quando o arquivo Bicep está direcionado a um grupo de recursos.

  4. Guarde as alterações ao ficheiro.

Usar o módulo na implantação da assinatura

Agora você está pronto para dizer ao Bicep para implantar o módulo no grupo de recursos.

  1. No arquivo main.bicep no Visual Studio Code, sob a targetScope linha, adicione as seguintes definições de parâmetro:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Esses parâmetros tornam o modelo reutilizável. Sempre que a equipe de pesquisa e desenvolvimento precisar de uma nova assinatura, você pode criar uma rede virtual com um nome exclusivo e intervalo de endereços IP.

  2. Na parte inferior do arquivo, adicione a seguinte definição de módulo:

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

    Observe que você está especificando explicitamente o para o scope módulo. O Bicep entende que os recursos dentro do módulo devem ser implantados no grupo de recursos que você criou anteriormente no arquivo.

Verificar o modelo

Seu arquivo main.bicep deve ter a seguinte aparência:

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
  }
}

Seu arquivo modules/virtualNetwork.bicep deve ter a seguinte aparência:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

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

Se um dos arquivos não corresponder ao exemplo, copie o exemplo ou ajuste o modelo.

Implementar o modelo no Azure

No terminal do Visual Studio Code, implante o modelo usando os seguintes comandos da CLI do 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

No terminal do Visual Studio Code, implante o modelo usando os seguintes comandos do 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

Observe que você está passando valores para os virtualNetworkName parâmetros e virtualNetworkAddressPrefix . Quando outra equipa de I&D lhe pedir para preparar uma subscrição para eles, poderá alterar esses valores para dar a essa equipa a sua própria rede virtual.

A implantação pode levar um ou dois minutos para ser concluída e, em seguida, você verá uma implantação bem-sucedida.

Verificar a implementação

Agora você verificará o grupo de recursos e a implantação que o módulo criou.

  1. Aceda ao portal do Azure.

  2. No painel esquerdo, selecione Grupos de recursos. Observe que o grupo de recursos ToyNetworking foi criado.

  3. Selecione o grupo de recursos ToyNetworking . Observe que o módulo foi implantado no grupo de recursos com êxito e que a rede virtual foi criada:

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

Limpar os recursos

Você implantou com êxito os recursos com escopo de assinatura, incluindo um grupo de recursos, e usou um módulo para implantar o recurso no grupo de recursos criado. Pode remover os recursos de política e o grupo de recursos que criou.

Atenção

Este comando excluirá permanentemente o grupo de recursos chamado ToyNetworking e todos os seus recursos. Se você implantou qualquer outra coisa neste grupo de recursos, ignore esta etapa.

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