Exercício – Implantar recursos em vários escopos usando módulos
Observação
Este módulo exige uma assinatura do Azure. Caso ainda não tenha uma, obtenha uma assinatura gratuita.
A equipe de P e D pediu sua ajuda para criar uma rede virtual na assinatura do Projeto Teddybear. Você sabe que ajudará a equipe com mais assinaturas no futuro. Portanto, decide estender seu modelo de Bicep reutilizável a fim de implantar uma rede virtual para uso dos membros da equipe.
Neste exercício, você atualizará o modelo que começou a criar no último exercício.
Durante o processo, você vai:
- Atualizar o modelo com escopo de assinatura para criar um grupo de recursos.
- Criar um módulo Bicep separado com uma rede virtual e usar parâmetros para controlar como a rede virtual é configurada.
- Atualizar o modelo para implantar o módulo no grupo de recursos.
- Implante o modelo.
Para este exercício, você precisa ter permissão para implantar recursos no escopo da assinatura. Se você não puder atender a esse requisito com sua conta atual do Azure, obtenha uma avaliação gratuita e crie uma assinatura e um locatário 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 criado no exercício anterior.
Nas definições de variável 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
.Salve as alterações no arquivo.
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 e D. Você implantará os recursos no módulo para o grupo de recursos mais adiante neste exercício.
No Visual Studio Code, crie uma pasta chamada módulos na mesma pasta em que 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 é preciso especificar um escopo de destino quando o arquivo Bicep é direcionado a um grupo de recursos.Salve as alterações no arquivo.
Usar o módulo na implantação da assinatura
Agora você está pronto para instruir o Bicep a implantar o módulo no grupo de recursos.
No arquivo main.bicep no Visual Studio Code, na linha
targetScope
, 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 P e D precisar de uma nova assinatura, você poderá criar uma rede virtual com um nome exclusivo e um 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
scope
para o módulo. O Bicep reconhece que os recursos dentro do módulo devem ser implantados no grupo de recursos criado anteriormente no arquivo.
Verificar o modelo
O arquivo main.bicep deverá ser semelhante ao seguinte:
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
}
}
O arquivo modules/virtualNetwork.bicep deverá ser semelhante ao seguinte:
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 desses arquivos não corresponder ao exemplo, copie o exemplo ou ajuste o modelo.
Implantar 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á transmitindo valores para os parâmetros virtualNetworkName
e virtualNetworkAddressPrefix
. Quando outra equipe de P e D pedir para você preparar uma assinatura para ela, você poderá alterar esses valores para fornecer a essa equipe uma rede virtual própria.
A implantação pode levar alguns minutos para ser concluída, e você verá uma implantação bem-sucedida.
Verificar a implantação
Agora, você verificará o grupo de recursos e a implantação criados pelo módulo.
Acesse o portal do Azure.
No painel esquerdo, selecione Grupos de recursos. Observe que o grupo de recursos ToyNetworking foi criado.
Escolha 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. Você pode remover os recursos de política e o grupo de recursos criados.
Cuidado
Esse comando excluirá permanentemente o grupo de recursos chamado ToyNetworking e todos os respectivos recursos. Se você implantou qualquer outra coisa nesse 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