Esercizio - Distribuire le risorse in più ambiti usando i moduli
Nota
Per questo esercizio è necessaria una sottoscrizione di Azure. Se non si ha una sottoscrizione, è possibile ottenerne una gratuita.
Il team di ricerca e sviluppo chiede aiuto per creare una rete virtuale nella sottoscrizione Project Teddybear. In futuro sarà possibile aiutare il team con più sottoscrizioni, quindi si decide di estendere il modello Bicep riutilizzabile per distribuire una rete virtuale che i membri del team possono usare.
In questo esercizio si aggiornerà il modello creato nell'ultimo esercizio.
Durante il processo, si eseguiranno queste operazioni:
- Aggiornare il modello con ambito sottoscrizione per creare un nuovo gruppo di risorse.
- Creare un modulo di Bicep separato con una rete virtuale e usare i parametri per controllare la configurazione della rete virtuale.
- Aggiornare il modello per distribuire il modulo nel gruppo di risorse.
- Distribuire il modello.
Per questo esercizio è necessario avere l'autorizzazione per distribuire risorse con ambito sottoscrizione. Se non è possibile soddisfare questo requisito con l'account Azure corrente, è possibile ottenere una versione di valutazione gratuita e creare una nuova sottoscrizione e un nuovo tenant di Azure. In alternativa, è possibile ignorare i passaggi di distribuzione in questo esercizio.
Creare un gruppo di risorse
In Visual Studio Code aprire il file main.bicep creato nell'esercizio precedente.
Nelle definizioni di variabili correnti aggiungere la definizione di variabile seguente:
var resourceGroupName = 'ToyNetworking'
Alla fine del file aggiungere la definizione di risorsa seguente:
resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = { name: resourceGroupName location: deployment().location }
Si noti che il gruppo di risorse viene definito esattamente come si definirebbe un'altra risorsa. Un gruppo di risorse è una risorsa con ambito sottoscrizione che è possibile distribuire e gestire nei file Bicep con la parola chiave
targetScope
impostata susubscription
.Salvare le modifiche apportate al file.
Aggiungere un modulo per creare una rete virtuale
Successivamente, creare un modulo di Bicep per la rete virtuale del team di ricerca e sviluppo. Le risorse del modulo verranno distribuite nel gruppo di risorse più avanti in questo esercizio.
In Visual Studio Code creare una nuova cartella denominata modules nella stessa cartella in cui è stato creato il file main.bicep.
Nella cartella modules creare e salvare un file denominato virtualNetwork.bicep.
Nel file virtualNetwork.bicep aggiungere il contenuto seguente:
param virtualNetworkName string param virtualNetworkAddressPrefix string resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = { name: virtualNetworkName location: resourceGroup().location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } } }
Si noti che non è stata specificata una parola chiave
targetScope
per questo modulo. Non è necessario specificare un ambito di destinazione quando il file Bicep è destinato a un gruppo di risorse.Salvare le modifiche apportate al file.
Usare il modulo nella distribuzione della sottoscrizione
A questo punto è possibile indicare a Bicep di distribuire il modulo nel gruppo di risorse.
Nel file main.bicep in Visual Studio Code, sotto la riga
targetScope
, aggiungere le definizioni di parametri seguenti:param virtualNetworkName string param virtualNetworkAddressPrefix string
Questi parametri rendono riutilizzabile il modello. Ogni volta che il team di ricerca e sviluppo necessita di una nuova sottoscrizione, è possibile creare una rete virtuale con un nome e un intervallo di indirizzi IP univoci.
Alla fine del file aggiungere la definizione di modulo seguente:
module virtualNetwork 'modules/virtualNetwork.bicep' = { scope: resourceGroup name: 'virtualNetwork' params: { virtualNetworkName: virtualNetworkName virtualNetworkAddressPrefix: virtualNetworkAddressPrefix } }
Si noti che si specifica in modo esplicito
scope
per il modulo. Bicep riconosce che le risorse all'interno del modulo devono essere distribuite nel gruppo di risorse creato in precedenza nel file.
Verificare il modello
Il file main.bicep avrà un aspetto simile al seguente:
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
}
}
Il file modules/virtualNetwork.bicep avrà un aspetto simile al seguente:
param virtualNetworkName string
param virtualNetworkAddressPrefix string
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
name: virtualNetworkName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
virtualNetworkAddressPrefix
]
}
}
}
Se uno dei file non corrisponde all'esempio, copiare l'esempio oppure modificare il modello.
Distribuire il modello in Azure
Distribuire il modello usando i comandi dell'interfaccia della riga di comando di Azure seguenti nel terminale di Visual Studio Code:
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
Distribuire il modello usando i comandi di Azure PowerShell seguenti nel terminale di Visual Studio Code:
$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
Si noti che si passano valori per i parametri virtualNetworkName
e virtualNetworkAddressPrefix
. Quando un altro team di ricerca e sviluppo chiede di preparare una sottoscrizione, sarà possibile cambiare questi valori per assegnare al team una rete virtuale specifica.
La distribuzione può richiedere uno o due minuti e al termine verrà visualizzato un messaggio di operazione completata.
Verificare la distribuzione
A questo punto verificare il gruppo di risorse e la distribuzione creati dal modulo.
Vai al portale di Azure.
Nel riquadro sinistro selezionare Gruppi di risorse. Si noti che è stato creato il gruppo di risorse ToyNetworking.
Selezionare il gruppo di risorse ToyNetworking. Si noti che il modulo è stato distribuito correttamente nel gruppo di risorse e che la rete virtuale è stata creata:
Pulire le risorse
Le risorse con ambito sottoscrizione sono state distribuite correttamente, incluso un gruppo di risorse, ed è stato usato un modulo per distribuire la risorsa nel gruppo di risorse creato. È possibile rimuovere le risorse dei criteri e il gruppo di risorse creati.
Attenzione
Questo comando eliminerà definitivamente il gruppo di risorse denominato ToyNetworking e tutte le relative risorse. Se sono state distribuite altre risorse in questo gruppo di risorse, ignorare questo passaggio.
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