Ejercicio: Implementación de recursos en varios ámbitos mediante módulos
Nota:
Este ejercicio requiere una suscripción de Azure. Si aún no tiene una, puede obtener una suscripción gratuita.
El equipo de I+D le ha pedido ayuda para crear una red virtual en la suscripción del Project Teddybear. Sabe que va a ayudar al equipo con más suscripciones en el futuro, por lo que decide ampliar la plantilla de Bicep reutilizable para implementar una red virtual que podrán usar los miembros del equipo.
En este ejercicio, actualizará la plantilla que empezó a compilar en el último ejercicio.
Durante el proceso, hará lo siguiente:
- Actualice la plantilla con ámbito de suscripción para crear un nuevo grupo de recursos.
- Cree un módulo de Bicep independiente con una red virtual y use parámetros para controlar cómo se configura la red virtual.
- Actualice la plantilla para implementar el módulo en el grupo de recursos.
- Implemente la plantilla.
Para realizar este ejercicio, debe tener permiso para implementar recursos con ámbito de suscripción. Si no puede cumplir estos requisitos con la cuenta de Azure actual, puede obtener una evaluación gratuita y crear una suscripción y un inquilino de Azure. Como alternativa, puede omitir los pasos de implementación de este ejercicio.
Crear un grupo de recursos
En Visual Studio Code, abra el archivo main.bicep que creó en el ejercicio anterior.
En las definiciones de variable actuales, agregue la siguiente definición de variable:
var resourceGroupName = 'ToyNetworking'
En la parte inferior del archivo, agregue la siguiente definición de recurso:
resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = { name: resourceGroupName location: deployment().location }
Tenga en cuenta que está definiendo el grupo de recursos igual que definiría otro recurso. Un grupo de recursos es un recurso con ámbito de suscripción que se puede implementar y administrar en archivos de Bicep con
targetScope
establecido ensubscription
.Guarde los cambios en el archivo.
Adición de un módulo para crear una red virtual
A continuación, creará un módulo de Bicep para la red virtual del equipo de I+D. Implementará los recursos del módulo en el grupo de recursos más adelante en este ejercicio.
En Visual Studio Code, cree una carpeta llamada modules en la misma carpeta donde creó el archivo main.bicep.
En la carpeta modules, cree y guarde un archivo denominado virtualNetwork.bicep.
En el archivo virtualNetwork.bicep, agregue el siguiente contenido:
param virtualNetworkName string param virtualNetworkAddressPrefix string resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = { name: virtualNetworkName location: resourceGroup().location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } } }
Tenga en cuenta que no ha especificado un valor
targetScope
para este módulo. No es necesario especificar un ámbito de destino cuando el archivo de Bicep tiene como destino un grupo de recursos.Guarde los cambios en el archivo.
Uso del módulo en la implementación de suscripciones
Ahora está listo para indicar a Bicep que implemente el módulo en el grupo de recursos.
En el archivo main.bicep de Visual Studio Code, en la línea
targetScope
, agregue las siguientes definiciones de parámetros:param virtualNetworkName string param virtualNetworkAddressPrefix string
Estos parámetros hacen que la plantilla sea reutilizable. Cada vez que el equipo de I+D necesite una nueva suscripción, puede crear una red virtual con un nombre único y un intervalo de direcciones IP.
En la parte inferior del archivo, agregue la siguiente definición de módulo:
module virtualNetwork 'modules/virtualNetwork.bicep' = { scope: resourceGroup name: 'virtualNetwork' params: { virtualNetworkName: virtualNetworkName virtualNetworkAddressPrefix: virtualNetworkAddressPrefix } }
Observe que está especificando explícitamente
scope
para el módulo. Bicep entiende que los recursos del módulo deben implementarse en el grupo de recursos que creó anteriormente en el archivo.
Comprobación de la plantilla
El archivo main.bicep debe tener un aspecto parecido al siguiente:
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
}
}
El archivo modules/virtualNetwork.bicep debe tener un aspecto parecido al siguiente:
param virtualNetworkName string
param virtualNetworkAddressPrefix string
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
name: virtualNetworkName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
virtualNetworkAddressPrefix
]
}
}
}
Si alguno de los archivos no coincide con el ejemplo, copie el ejemplo o ajuste la plantilla.
Implementación de la plantilla en Azure
En el terminal de Visual Studio Code, implemente la plantilla mediante los siguientes comandos de la CLI de 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
En el terminal de Visual Studio Code, implemente la plantilla mediante los siguientes comandos de 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
Tenga en cuenta que está pasando valores para los parámetros virtualNetworkName
y virtualNetworkAddressPrefix
. Cuando otro equipo de I+D le pida que prepare una suscripción para ellos, podrá cambiar estos valores para proporcionar a ese equipo su propia red virtual.
La implementación puede tardar un par de minutos en completarse; después, verá que la implementación se ha realizado correctamente.
Comprobación de la implementación
Ahora comprobará el grupo de recursos y la implementación que creó el módulo.
Vaya a Azure Portal.
En el panel izquierdo, seleccione Grupos de recursos. Observe que se ha creado el grupo de recursos ToyNetworking.
Seleccione el grupo de recursos ToyNetworking. Observe que el módulo se ha implementado correctamente en el grupo de recursos y que se ha creado la red virtual:
Limpiar los recursos
Ha implementado correctamente los recursos con ámbito de suscripción, incluido un grupo de recursos, y ha usado un módulo para implementar el recurso en el grupo de recursos que ha creado. Puede quitar los recursos de directiva y el grupo de recursos que ha creado.
Precaución
Este comando eliminará permanentemente el grupo de recursos denominado ToyNetworking y todos sus recursos. Si ha implementado algo más en este grupo de recursos, debe omitir este paso.
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