Oefening: Het Bicep-bestand herstructureren
In de vorige oefening hebt u een eerste Bicep-bestand gemaakt dat de virtuele machine van de speelgoedwagen en de bijbehorende resources bevat. De Bicep-sjabloon volgt echter geen aanbevolen procedures en het is een beetje moeilijk te lezen. In deze les gaat u het bestand herstructureren.
Tijdens het herstructureren gaat u het volgende doen:
- Werk de symbolische namen voor uw resources en parameters bij.
- Verwijder redundante parameters, resources en eigenschappen.
- Voeg variabelen en parameters toe om uw Bicep-bestand herbruikbaar te maken.
De symbolische namen van resources bijwerken
Open in Visual Studio Code het bestand main.bicep .
Selecteer de symbolische naam voor de resource van de netwerkbeveiligingsgroep. Dit is
networkSecurityGroups_ToyTruckServer_nsg_name_resource
of een vergelijkbare naam.Wijzig de naam van de symbolische naam. U kunt F2 selecteren of met de rechtermuisknop klikken en vervolgens Naam van symbool wijzigen selecteren.
Voer de naam
networkSecurityGroup
in en druk op Enter. Visual Studio Code werkt de naam en alle verwijzingen in het bestand bij.Herhaal dit proces voor elke resource. Wijzig de naam van de resources, zoals wordt weergegeven in de volgende tabel.
Notitie
De namen van de resources in uw implementatie verschillen enigszins van de namen in de tabel. Zoek de resources met namen die zich dicht bij deze namen bevinden.
Brontype Huidige symbolische naam Nieuwe symbolische naam Openbaar IP-adres publicIPAddresses_ToyTruckServer_ip_name_resource
publicIPAddress
Virtuele machine virtualMachines_ToyTruckServer_name_resource
virtualMachine
Virtueel netwerk virtualNetworks_ToyTruck_vnet_name_resource
virtualNetwork
Subnet virtualNetworks_ToyTruck_vnet_name_default
defaultSubnet
Netwerkinterface networkInterfaces_toytruckserver890_name_resource
networkInterface
De redundante subnetresource verwijderen
Het subnet van het virtuele netwerk is momenteel twee keer gedefinieerd. Deze wordt eenmaal gedefinieerd in de virtualNetwork
resource en opnieuw als een eigen onderliggende resource met de naam defaultSubnet
. Het is niet zinvol om het subnet twee keer te definiëren.
Verwijder de
defaultSubnet
resource.U ziet dat de
networkInterface
resource nu een probleem weergeeft, omdat deze verwijst naar de resource-id van het standaardsubnet:Werk de
virtualNetwork
resource bij om eenexisting
verwijzing naar het subnet op te nemen. Als u deexisting
verwijzing toevoegt, kunt u opnieuw verwijzen naar het subnet in uw Bicep-code zonder deze opnieuw te definiëren:resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-11-01' = { name: virtualNetworks_ToyTruck_vnet_name location: 'westus' properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } subnets: [ { name: 'default' properties: { addressPrefix: '10.0.0.0/24' delegations: [] privateEndpointNetworkPolicies: 'Enabled' privateLinkServiceNetworkPolicies: 'Enabled' } } ] virtualNetworkPeerings: [] enableDdosProtection: false } resource defaultSubnet 'subnets' existing = { name: 'default' } }
Werk de
networkInterface
resource bij om te verwijzen naar de resource-id van het subnet:resource networkInterface 'Microsoft.Network/networkInterfaces@2022-05-01' = { name: networkInterfaces_toytruckserver890_name location: 'westus3' properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { privateIPAddress: '10.0.0.4' privateIPAllocationMethod: 'Dynamic' publicIPAddress: { id: publicIPAddress.id } subnet: { id: virtualNetwork::defaultSubnet.id } primary: true privateIPAddressVersion: 'IPv4' } } ] dnsSettings: { dnsServers: [] } enableAcceleratedNetworking: true enableIPForwarding: false disableTcpStateTracking: false networkSecurityGroup: { id: networkSecurityGroup.id } nicType: 'Standard' } }
U ziet een fout over het feit dat de expressie betrokken is bij een cyclus. U lost dit in de volgende stap op.
Ga naar de eigenschap van
subnets
devirtualNetwork
resource en verwijderid: defaultSubnet.id
deze om de fout op te lossen.
De parameters wijzigen in variabelen
De parameters in de sjabloon hoeven geen parameters te zijn. U wijzigt nu de naam van de parameters in zinvollere namen en converteert ze naar variabelen.
Selecteer de symbolische naam voor de
virtualNetworks_ToyTruck_vnet_name
parameter. Wijzig de naam invirtualNetworkName
.Wijzig de parameter in een variabele. Vergeet niet om het type te verwijderen omdat variabeledefinities geen typen bevatten:
var virtualNetworkName = 'ToyTruck-vnet'
Herhaal het proces voor elke parameter. Wijzig de naam van de parameters, zoals wordt weergegeven in de volgende tabel.
U ziet dat de waarde van de
networkInterfaceName
waarde een getal van drie cijfers bevat. Het getal verschilt voor verschillende implementaties. Zorg ervoor dat u de waarde van de variabele kopieert uit uw referentiesjabloon.Naam van de huidige parameter Nieuwe variabelenaam virtualMachines_ToyTruckServer_name
virtualMachineName
networkInterfaces_toytruckserver890_name
networkInterfaceName
publicIPAddresses_ToyTruckServer_ip_name
publicIPAddressName
networkSecurityGroups_ToyTruckServer_nsg_name
networkSecurityGroupName
Controleer of uw variabeledeclaraties eruitzien als in het volgende voorbeeld:
var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg'
De resourcelocaties bijwerken
Alle resources gebruiken momenteel een in code vastgelegde locatie. U voegt nu een parameter toe, zodat de sjabloon herbruikbaarer wordt.
Voeg boven aan het bestand een nieuwe parameter en een beschrijvingsdecorator toe om het doel van de parameter te verduidelijken:
@description('The location where resources are deployed.') param location string = resourceGroup().location
Werk elke resource bij om de
location
parameter te gebruiken in plaats van de in code vastgelegdewestus3
locatie.
Parameters en variabelen toevoegen
Uw sjabloon bevat enkele in code vastgelegde waarden waarbij parameters of variabelen beter geschikt zijn. U voegt nu parameters toe voor eigenschappen die kunnen veranderen tussen implementaties en variabelen voor waarden die dat niet doen.
Voeg boven aan het bestand main.bicep , onder de
location
parameter, de volgende parameters toe:@description('The name of the size of the virtual machine to deploy.') param virtualMachineSizeName string = 'Standard_D2s_v3' @description('The name of the storage account SKU to use for the virtual machine\'s managed disk.') param virtualMachineManagedDiskStorageAccountType string = 'Premium_LRS' @description('The administrator username for the virtual machine.') param virtualMachineAdminUsername string = 'toytruckadmin' @description('The administrator password for the virtual machine.') @secure() param virtualMachineAdminPassword string @description('The name of the SKU of the public IP address to deploy.') param publicIPAddressSkuName string = 'Standard' @description('The virtual network address range.') param virtualNetworkAddressPrefix string @description('The default subnet address range within the virtual network') param virtualNetworkDefaultSubnetAddressPrefix string
Sommige parameters hebben standaardwaarden en andere niet. Later maakt u een parameterbestand om de meeste van deze waarden in te stellen.
Voeg de volgende nieuwe variabeledeclaraties toe onder de
networkSecurityGroupName
variabele:var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' }
Voeg de volgende variabeledeclaratie toe. Vervang de waarde door de naam van de besturingssysteemschijf uit uw eigen referentiesjabloon.
var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
De waarde van de
virtualMachineOSDiskName
waarde is uniek. De waarde verschilt voor elke implementatie. Zorg ervoor dat u de waarde van de variabele kopieert uit uw referentiesjabloon.Waarschuwing
Zorg ervoor dat u de juiste waarden voor de
virtualMachineOSDiskName
ennetworkInterfaceName
variabelen kopieert. Anders detecteert Azure niet dat u bestaande resources declareren en probeert mogelijk nieuwe resources te maken.Uw variabeledeclaraties moeten er nu als volgt uitzien:
var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg' var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' } var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
Werk de
publicIPAddress
resource bij om te verwijzen naar een parameter:Eigenschappen Parameter sku.name
publicIPAddressSkuName
Werk de
virtualMachine
resource bij om te verwijzen naar de parameters en variabelen:Eigenschappen Parameter of variabele hardwareProfile.vmSize
virtualMachineSizeName
storageProfile.imageReference
virtualMachineImageReference
Gebruik de naam van de variabele om de waarden van het object te vervangen, inclusief de accolades.storageProfile.osDisk.name
virtualMachineOSDiskName
storageProfile.osDisk.managedDisk.storageAccountType
virtualMachineManagedDiskStorageAccountType
osProfile.adminUsername
virtualMachineAdminUsername
osProfile.adminPassword
Voeg deze eigenschap hieronder toeosProfile.adminUsername
virtualMachineAdminPassword
Werk de
virtualNetwork
resource bij om te verwijzen naar de parameters en variabelen:Eigenschappen Parameter of variabele addressSpace.addressPrefixes
virtualNetworkAddressPrefix
subnets.name
virtualNetworkDefaultSubnetName
subnets.addressPrefix
virtualNetworkDefaultSubnetAddressPrefix
Werk de geneste resource van de
virtualNetwork
resourcedefaultSubnet
bij:Eigenschappen Variabel name
virtualNetworkDefaultSubnetName
Overbodige eigenschappen verwijderen
Het exportproces voegt redundante eigenschappen toe aan veel resources. Gebruik deze stappen om de overbodige eigenschappen te verwijderen.
Verwijder
properties
in denetworkSecurityGroup
resource omdat desecurityRules
eigenschap leeg is.Verwijder in de
publicIPAddress
resource de volgende eigenschappen:ipAddress
eigenschap omdat deze automatisch wordt ingesteld door AzureipTags
eigenschap omdat deze leeg is
Verwijder in de
virtualMachine
resource de volgende eigenschappen:storageProfile.osDisk.managedDisk.id
eigenschap omdat Azure deze eigenschap automatisch bepaalt wanneer de virtuele machine wordt geïmplementeerdBelangrijk
Als u deze eigenschap niet verwijdert, wordt de sjabloon niet correct geïmplementeerd.
storageProfile.dataDisks
eigenschap omdat deze leeg isosProfile.secrets
eigenschap omdat deze leeg isosProfile.requireGuestProvisionSignal
omdat azure deze eigenschap automatisch instelt
Verwijder in de
virtualNetwork
resource de volgende eigenschappen:delegations
envirtualNetworkPeerings
eigenschappen omdat ze leeg zijn.- De lijn voor
type: 'Microsoft.Network/virtualNetworks/subnets'
Verwijder in de
networkInterface
resource de volgende eigenschappen:De
kind
eigenschapVan
ipConfigurations
:id
,etag
,type
enprivateIPAddress
omdat deze automatisch wordt ingesteld door Azure en de toewijzingsmethode dynamisch isVan
ipConfigurations.properties
:provisioningState
Van
publicIPAddress
,name
,properties
, , ,type
ensku
dnsSettings
omdat dednsServers
eigenschap leeg is
Tip
Wanneer u met uw eigen sjablonen werkt, moet u bepalen of er eigenschappen zijn die moeten worden verwijderd zoals u hier hebt gedaan.
In Visual Studio Code kunt u met de Bicep-extensie de minimale eigenschappen voor een resource instellen. Wanneer u een spatie toevoegt na het gelijkteken in de resourcedefinitie, wordt u door Visual Studio Code gevraagd om vereiste eigenschappen te selecteren:
Wanneer u vereiste eigenschappen selecteert, wordt in Visual Studio Code de resourcedefinitie gevuld met de eigenschappen die verplicht zijn. U kunt verwijzen naar vereiste eigenschappen om te bepalen of de eigenschappen in uw geconverteerde sjabloon allemaal aanwezig moeten zijn.
De opslagplaats azure-quickstartsjablonen is ook handig voor deze taak. Zoek een quickstartsjabloon die ongeveer doet wat u probeert te doen en bekijk de eigenschappen die worden ingesteld voor de resource.
Een parameterbestand maken
Uw parameters zijn momenteel gedefinieerd als standaardwaarden in uw sjabloon. Om ervoor te zorgen dat uw sjabloon goed werkt in omgevingen, is het een goed idee om een parameterbestand te maken en standaardwaarden te verwijderen voor parameters die moeten worden gewijzigd voor elke omgeving.
Maak een nieuw bestand met de naam main.parameters.production.json.
Plak de volgende JSON in het main.parameters.production.json-bestand :
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "virtualMachineSizeName": { "value": "Standard_D2s_v3" }, "virtualMachineManagedDiskStorageAccountType": { "value": "Premium_LRS" }, "virtualMachineAdminUsername": { "value": "toytruckadmin" }, "virtualNetworkAddressPrefix": { "value": "YOUR-VIRTUAL-NETWORK-ADDRESS-PREFIX" }, "virtualNetworkDefaultSubnetAddressPrefix": { "value": "YOUR-SUBNET-ADDRESS-PREFIX" } } }
Werk de waarden voor de
virtualNetworkAddressPrefix
envirtualNetworkDefaultSubnetAddressPrefix
parameters bij zodat deze overeenkomen met de IP-adresbereiken die zijn opgegeven in de virtuele netwerkresource van uw referentiesjabloon.Hier ziet u bijvoorbeeld hoe de waarden worden opgegeven in een referentiesjabloon. Uw IP-adressen kunnen afwijken van de IP-adressen die in dit voorbeeld worden gebruikt.
resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2022-05-01' = { name: virtualNetworks_ToyTruck_vnet_name location: 'westus3' properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } subnets: [ { name: 'default' id: virtualNetworks_ToyTruck_vnet_name_default.id properties: { addressPrefix: '10.0.0.0/24' delegations: [] privateEndpointNetworkPolicies: 'Disabled' privateLinkServiceNetworkPolicies: 'Enabled' } type: 'Microsoft.Network/virtualNetworks/subnets' } ] virtualNetworkPeerings: [] enableDdosProtection: false } }
Werk het bestand main.bicep bij om de standaardwaarden te verwijderen voor de parameters die u hebt opgegeven in het parameterbestand.
virtualMachineSizeName
virtualMachineManagedDiskStorageAccountType
virtualMachineAdminUsername
Wijzig de standaardwaarden voor de location
en publicIPAddressSkuName
parameters niet, omdat deze waarden waarschijnlijk hetzelfde zijn voor al uw omgevingen.
Uw sjabloon controleren
Aan het einde van de herfactoringsfase moet uw bestand main.bicep er ongeveer uitzien als in het volgende voorbeeld:
@description('The location where resources are deployed.') param location string = resourceGroup().location @description('The name of the size of the virtual machine to deploy.') param virtualMachineSizeName string @description('The name of the storage account SKU to use for the virtual machine\'s managed disk.') param virtualMachineManagedDiskStorageAccountType string @description('The administrator username for the virtual machine.') param virtualMachineAdminUsername string @description('The administrator password for the virtual machine.') @secure() param virtualMachineAdminPassword string @description('The name of the SKU of the public IP address to deploy.') param publicIPAddressSkuName string = 'Standard' @description('The virtual network address range.') param virtualNetworkAddressPrefix string @description('The default subnet address range within the virtual network') param virtualNetworkDefaultSubnetAddressPrefix string var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg' var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' } var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME' resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2022-05-01' = { name: networkSecurityGroupName location: location } resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2022-05-01' = { name: publicIPAddressName location: location sku: { name: publicIPAddressSkuName tier: 'Regional' } properties: { publicIPAddressVersion: 'IPv4' publicIPAllocationMethod: 'Static' idleTimeoutInMinutes: 4 } } resource virtualMachine 'Microsoft.Compute/virtualMachines@2022-08-01' = { name: virtualMachineName location: location properties: { hardwareProfile: { vmSize: virtualMachineSizeName } storageProfile: { imageReference: virtualMachineImageReference osDisk: { osType: 'Linux' name: virtualMachineOSDiskName createOption: 'FromImage' caching: 'ReadWrite' managedDisk: { storageAccountType: virtualMachineManagedDiskStorageAccountType } deleteOption: 'Delete' diskSizeGB: 30 } } osProfile: { computerName: virtualMachineName adminUsername: virtualMachineAdminUsername adminPassword: virtualMachineAdminPassword linuxConfiguration: { disablePasswordAuthentication: false provisionVMAgent: true patchSettings: { patchMode: 'ImageDefault' assessmentMode: 'ImageDefault' } enableVMAgentPlatformUpdates: false } allowExtensionOperations: true } networkProfile: { networkInterfaces: [ { id: networkInterface.id properties: { deleteOption: 'Detach' } } ] } diagnosticsProfile: { bootDiagnostics: { enabled: true } } } } resource virtualNetwork 'Microsoft.Network/virtualNetworks@2022-05-01' = { name: virtualNetworkName location: location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } subnets: [ { name: virtualNetworkDefaultSubnetName properties: { addressPrefix: virtualNetworkDefaultSubnetAddressPrefix privateEndpointNetworkPolicies: 'Disabled' privateLinkServiceNetworkPolicies: 'Enabled' } } ] enableDdosProtection: false } resource defaultSubnet 'subnets' existing = { name: virtualNetworkDefaultSubnetName } } resource networkInterface 'Microsoft.Network/networkInterfaces@2022-05-01' = { name: networkInterfaceName location: location properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { privateIPAllocationMethod: 'Dynamic' publicIPAddress: { id: publicIPAddress.id } subnet: { id: virtualNetwork::defaultSubnet.id } primary: true privateIPAddressVersion: 'IPv4' } } ] enableAcceleratedNetworking: true enableIPForwarding: false disableTcpStateTracking: false networkSecurityGroup: { id: networkSecurityGroup.id } nicType: 'Standard' } }
Uw main.parameters.production.json-bestand moet er ongeveer als volgt uitzien, hoewel er mogelijk verschillende IP-adresbereiken worden vermeld:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "virtualMachineSizeName": { "value": "Standard_D2s_v3" }, "virtualMachineManagedDiskStorageAccountType": { "value": "Premium_LRS" }, "virtualMachineAdminUsername": { "value": "toytruckadmin" }, "virtualNetworkAddressPrefix": { "value": "10.0.0.0/16" }, "virtualNetworkDefaultSubnetAddressPrefix": { "value": "10.0.0.0/24" } } }
Selecteer Problemen weergeven>om het deelvenster Problemen weer te geven.
Er worden geen problemen aangegeven.
Tip
Wanneer u met uw eigen sjablonen werkt, kunt u verschillende keuzes maken over de eigenschappen die u wilt parameteriseren en andere aanpassingen. In deze module bieden we algemene richtlijnen om u op weg te helpen, maar u moet rekening houden met uw eigen omgeving en hoe u uw sjablonen opnieuw wilt gebruiken wanneer u besluit hoe u uw eigen Bicep-bestanden herstructureren.