Oefening: resources implementeren in meerdere bereiken met behulp van modules
Notitie
Voor deze oefening is een Azure-abonnement vereist. Als u nog geen abonnement hebt, kunt u een gratis abonnement krijgen.
Het R&D-team heeft u gevraagd om hulp bij het maken van een virtueel netwerk in het Project Teddybear-abonnement. U weet dat u het team in de toekomst helpt met meer abonnementen, dus besluit u uw herbruikbare Bicep-sjabloon uit te breiden om een virtueel netwerk te implementeren dat de teamleden kunnen gebruiken.
In deze oefening werkt u de sjabloon bij die u in de vorige oefening hebt gemaakt.
Tijdens het proces gaat u het volgende doen:
- Werk de sjabloon voor het abonnementsbereik bij om een nieuwe resourcegroep te maken.
- Maak een afzonderlijke Bicep-module met een virtueel netwerk en gebruik parameters om te bepalen hoe het virtuele netwerk is geconfigureerd.
- Werk de sjabloon bij om de module te implementeren in de resourcegroep.
- De sjabloon implementeren.
Voor deze oefening moet u gemachtigd zijn om resources binnen het abonnementsbereik te implementeren. Als u niet aan deze vereiste kunt voldoen met uw huidige Azure-account, kunt u een gratis proefversie krijgen en een nieuw Azure-abonnement en een nieuwe Azure-tenant maken. U kunt ook de implementatiestappen in deze oefening overslaan.
Een brongroep maken
Open in Visual Studio Code het bestand main.bicep dat u in de vorige oefening hebt gemaakt.
Voeg onder de huidige variabeledefinities de volgende variabeledefinitie toe:
var resourceGroupName = 'ToyNetworking'
Voeg onder aan het bestand de volgende resourcedefinitie toe:
resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = { name: resourceGroupName location: deployment().location }
U ziet dat u de resourcegroep definieert, net zoals u een andere resource zou definiëren. Een resourcegroep is een resource binnen abonnementsbereik die kan worden geïmplementeerd en beheerd in Bicep-bestanden met de
targetScope
set opsubscription
.Sla de wijzigingen in het bestand op.
Een module toevoegen om een virtueel netwerk te maken
Vervolgens maakt u een Bicep-module voor het virtuele netwerk van het R&D-team. Verderop in deze oefening implementeert u de resources in de module in de resourcegroep.
Maak in Visual Studio Code een nieuwe map met de naam modules in dezelfde map waarin u uw main.bicep-bestand hebt gemaakt.
Maak en sla in de map modules een bestand met de naam virtualNetwork.bicep op.
Voeg in het bestand virtualNetwork.bicep de volgende inhoud toe:
param virtualNetworkName string param virtualNetworkAddressPrefix string resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = { name: virtualNetworkName location: resourceGroup().location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } } }
U hebt geen opgegeven
targetScope
voor deze module. U hoeft geen doelbereik op te geven wanneer het Bicep-bestand gericht is op een resourcegroep.Sla de wijzigingen in het bestand op.
De module gebruiken in de implementatie van het abonnement
U bent nu klaar om Bicep te vertellen de module te implementeren in de resourcegroep.
Voeg in het bestand main.bicep in Visual Studio Code onder de
targetScope
regel de volgende parameterdefinities toe:param virtualNetworkName string param virtualNetworkAddressPrefix string
Met deze parameters kan de sjabloon opnieuw worden gebruikt. Wanneer het R&D-team een nieuw abonnement nodig heeft, kunt u een virtueel netwerk maken met een unieke naam en IP-adresbereik.
Voeg onder aan het bestand de volgende moduledefinitie toe:
module virtualNetwork 'modules/virtualNetwork.bicep' = { scope: resourceGroup name: 'virtualNetwork' params: { virtualNetworkName: virtualNetworkName virtualNetworkAddressPrefix: virtualNetworkAddressPrefix } }
U ziet dat u de
scope
module expliciet opgeeft. Bicep begrijpt dat de resources in de module moeten worden geïmplementeerd in de resourcegroep die u eerder in het bestand hebt gemaakt.
Uw sjabloon controleren
Het bestand main.bicep moet er als volgt uitzien:
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
}
}
Uw modules/virtualNetwork.bicep-bestand moet er als volgt uitzien:
param virtualNetworkName string
param virtualNetworkAddressPrefix string
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
name: virtualNetworkName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
virtualNetworkAddressPrefix
]
}
}
}
Als een van beide bestanden niet overeenkomt met het voorbeeld, kopieert u het voorbeeld of past u de sjabloon aan.
De sjabloon implementeren in Azure
Implementeer de sjabloon in de Visual Studio Code-terminal met behulp van de volgende Azure CLI-opdrachten:
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
Implementeer de sjabloon in de Visual Studio Code-terminal met behulp van de volgende Azure PowerShell-opdrachten:
$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
U ziet dat u waarden doorgeeft voor de virtualNetworkName
en virtualNetworkAddressPrefix
parameters. Wanneer een ander R&D-team u vraagt om een abonnement voor te bereiden, kunt u deze waarden wijzigen om dat team een eigen virtueel netwerk te geven.
Het kan een paar minuten duren voordat de implementatie is voltooid. Vervolgens ziet u een geslaagde implementatie.
De implementatie controleren
Nu controleert u de resourcegroep en de implementatie die de module heeft gemaakt.
Ga naar de Azure-portal.
Selecteer Resourcegroepen in het linkerdeelvenster. U ziet dat de Resourcegroep ToyNetworking is gemaakt.
Selecteer de resourcegroep ToyNetworking . U ziet dat de module is geïmplementeerd in de resourcegroep en dat het virtuele netwerk is gemaakt:
De resources opschonen
U hebt de resources binnen het abonnementsbereik geïmplementeerd, inclusief een resourcegroep, en u hebt een module gebruikt om de resource te implementeren in de resourcegroep die u hebt gemaakt. U kunt de beleidsresources en resourcegroep verwijderen die u hebt gemaakt.
Let op
Met deze opdracht wordt de resourcegroep met de naam ToyNetworking en alle bijbehorende resources definitief verwijderd. Als u iets anders hebt geïmplementeerd in deze resourcegroep, moet u deze stap overslaan.
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