Exercício - Implantar recursos em vários escopos usando módulos
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
No Visual Studio Code, abra o arquivo main.bicep que você criou no exercício anterior.
Nas definições de variáveis atuais, adicione a seguinte definição de variável:
var resourceGroupName = 'ToyNetworking'
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 comosubscription
.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.
No Visual Studio Code, crie uma nova pasta chamada modules na mesma pasta onde você criou o arquivo main.bicep .
Na pasta modules, crie e salve um arquivo chamado virtualNetwork.bicep.
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.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.
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.
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.
Aceda ao portal do Azure.
No painel esquerdo, selecione Grupos de recursos. Observe que o grupo de recursos ToyNetworking foi criado.
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:
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