Övning – Omstrukturera Bicep-filen
I föregående övning skapade du en första Bicep-fil som innehåller den virtuella datorn för leksaksbilen och associerade resurser. Bicep-mallen följer dock inte bästa praxis och det är lite svårläst. I den här lektionen omstrukturerar du filen.
Under refaktoriseringsprocessen gör du följande:
- Uppdatera de symboliska namnen för dina resurser och parametrar.
- Ta bort redundanta parametrar, resurser och egenskaper.
- Lägg till variabler och parametrar för att göra Bicep-filen återanvändbar.
Uppdatera resursens symboliska namn
Öppna filen main.bicep i Visual Studio Code.
Välj det symboliska namnet på nätverkssäkerhetsgruppens resurs, som är
networkSecurityGroups_ToyTruckServer_nsg_name_resource
eller ett liknande namn.Byt namn på det symboliska namnet. Du kan välja F2 eller högerklicka och sedan välja Byt namn på symbol.
Ange namnet
networkSecurityGroup
och tryck på Enter. Visual Studio Code uppdaterar namnet och alla referenser i filen.Upprepa den här processen för varje resurs. Byt namn på resurserna enligt följande tabell.
Not
Namnen på resurserna i distributionen skiljer sig lite från namnen i tabellen. Leta reda på de resurser som har namn som ligger nära dessa namn.
Resurstyp Aktuellt symboliskt namn Nytt symboliskt namn Offentlig IP-adress publicIPAddresses_ToyTruckServer_ip_name_resource
publicIPAddress
Virtuell dator virtualMachines_ToyTruckServer_name_resource
virtualMachine
Virtuellt nätverk virtualNetworks_ToyTruck_vnet_name_resource
virtualNetwork
Undernät virtualNetworks_ToyTruck_vnet_name_default
defaultSubnet
Nätverksgränssnitt networkInterfaces_toytruckserver890_name_resource
networkInterface
Ta bort den redundanta undernätsresursen
Det virtuella nätverkets undernät har för närvarande definierats två gånger. Definieras en gång i virtualNetwork
-resursen och igen som en egen underordnad resurs med namnet defaultSubnet
. Det är inte meningsfullt att definiera undernätet två gånger.
Ta bort den
defaultSubnet
resursen.Observera att
networkInterface
resursen nu visar ett problem eftersom den refererar till standardundernätets resurs-ID:Uppdatera
virtualNetwork
resursen så att den innehåller enexisting
referens till undernätet. Om du lägger till referensen förexisting
kan du referera till undernätet igen i Bicep-koden utan att definiera den igen:resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-05-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' } }
Uppdatera
networkInterface
resursen så att den refererar till undernätets resurs-ID:resource networkInterface 'Microsoft.Network/networkInterfaces@2024-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' } }
Du ser ett felmeddelande som säger att uttrycket ingår i en cykel. Du kommer att åtgärda det i nästa steg.
Gå till
virtualNetwork
resursens egenskapsubnets
och ta bortid: defaultSubnet.id
för att lösa felet.
Ändra parametrarna till variabler
Parametrarna i mallen behöver inte vara parametrar. Nu byter du namn på parametrarna till mer meningsfulla namn och konverterar dem till variabler.
Välj det symboliska namnet för parametern
virtualNetworks_ToyTruck_vnet_name
. Byt namn på den tillvirtualNetworkName
.Ändra parametern till en variabel. Kom ihåg att ta bort typen eftersom variabeldefinitioner inte innehåller typer:
var virtualNetworkName = 'ToyTruck-vnet'
Upprepa processen för varje parameter. Byt namn på parametrarna enligt följande tabell.
Observera att värdet för
networkInterfaceName
innehåller ett tresiffrigt tal. Talet är annorlunda för olika distributioner. Se till att du kopierar variabelns värde från referensmallen.Aktuellt parameternamn Nytt variabelnamn virtualMachines_ToyTruckServer_name
virtualMachineName
networkInterfaces_toytruckserver890_name
networkInterfaceName
publicIPAddresses_ToyTruckServer_ip_name
publicIPAddressName
networkSecurityGroups_ToyTruckServer_nsg_name
networkSecurityGroupName
Kontrollera att dina variabeldeklarationer ser ut som i följande exempel:
var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg'
Uppdatera resursplatserna
Alla resurser använder för närvarande en hårdkodad plats. Nu ska du lägga till en parameter så att mallen blir mer återanvändbar.
Överst i filen lägger du till en ny parameter och en beskrivningsdekoratör för att klargöra parameterns syfte:
@description('The location where resources are deployed.') param location string = resourceGroup().location
Uppdatera varje resurs så att den använder parametern
location
i stället för den hårdkodadewestus3
platsen.
Lägga till parametrar och variabler
Mallen har vissa hårdkodade värden där parametrar eller variabler skulle vara lämpligare. Nu ska du lägga till parametrar för egenskaper som kan ändras mellan distributioner och variabler för värden som inte gör det.
Lägg till följande parametrar överst i filen main.bicep under parametern
location
:@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
Vissa av parametrarna har standardvärden och andra inte. Senare skapar du en parameterfil för att ange de flesta av dessa värden.
Lägg till följande nya variabeldeklarationer under variabeln
networkSecurityGroupName
:var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' }
Lägg till följande variabeldeklaration. Ersätt värdet med os-disknamnet från din egen referensmall.
var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
Värdet för
virtualMachineOSDiskName
är unikt. Värdet är olika för varje distribution. Se till att du kopierar variabelns värde från referensmallen.Varning
Se till att du kopierar rätt värden för variablerna
virtualMachineOSDiskName
ochnetworkInterfaceName
. Annars identifierar Azure inte att du deklarerar befintliga resurser och kan försöka skapa nya resurser.Dina variabeldeklarationer bör nu se ut så här:
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'
Uppdatera den
publicIPAddress
resursen så att den refererar till en parameter:Egenskap Parameter sku.name
publicIPAddressSkuName
Uppdatera
virtualMachine
resursen så att den refererar till parametrarna och variablerna:Egenskap Parameter eller variabel hardwareProfile.vmSize
virtualMachineSizeName
storageProfile.imageReference
virtualMachineImageReference
Använd variabelnamnet för att ersätta objektets värden, inklusive klammerparenteser.storageProfile.osDisk.name
virtualMachineOSDiskName
storageProfile.osDisk.managedDisk.storageAccountType
virtualMachineManagedDiskStorageAccountType
osProfile.adminUsername
virtualMachineAdminUsername
osProfile.adminPassword
Lägg till den här egenskapen underosProfile.adminUsername
virtualMachineAdminPassword
Uppdatera
virtualNetwork
resursen så att den refererar till parametrarna och variablerna:Egenskap Parameter eller variabel addressSpace.addressPrefixes
virtualNetworkAddressPrefix
subnets.name
virtualNetworkDefaultSubnetName
subnets.addressPrefix
virtualNetworkDefaultSubnetAddressPrefix
Uppdatera
virtualNetwork
resursens kapslade resursdefaultSubnet
:Egenskap Variabel name
virtualNetworkDefaultSubnetName
Ta bort onödiga egenskaper
Exportprocessen lägger till redundanta egenskaper för många resurser. Använd de här stegen för att ta bort de onödiga egenskaperna.
I resursen
networkSecurityGroup
tar du bortproperties
eftersom egenskapensecurityRules
är tom.Ta bort följande egenskaper i resursen
publicIPAddress
:-
ipAddress
, eftersom egenskapen ställs in automatiskt av Azure -
ipTags
egenskapen eftersom den är tom
-
Ta bort följande egenskaper i resursen
virtualMachine
:storageProfile.osDisk.managedDisk.id
egenskapen eftersom Azure automatiskt avgör den här egenskapen när den virtuella datorn distribuerasViktig
Om du inte tar bort den här egenskapen distribueras inte mallen korrekt.
storageProfile.dataDisks
egenskapen eftersom den är tomosProfile.secrets
egenskapen eftersom den är tomosProfile.requireGuestProvisionSignal
egenskapen eftersom Azure anger den här egenskapen automatiskt
Ta bort följande egenskaper i resursen
virtualNetwork
:-
delegations
ochvirtualNetworkPeerings
egenskaper eftersom de är tomma. - Raden för
type: 'Microsoft.Network/virtualNetworks/subnets'
-
Ta bort följande egenskaper i resursen
networkInterface
:Egenskapen
kind
Från
ipConfigurations
:id
,etag
,type
ochprivateIPAddress
eftersom den anges automatiskt av Azure och allokeringsmetoden DynamiskFrån
ipConfigurations.properties
:provisioningState
Från
publicIPAddress
,name
,properties
,type
ochsku
dnsSettings
eftersom egenskapendnsServers
är tom
Tips
När du arbetar med dina egna mallar måste du avgöra om det finns några egenskaper som ska tas bort som du gjorde här.
I Visual Studio Code hjälper Bicep-tillägget dig att ange minsta egenskaper för en resurs. När du lägger till ett blanksteg efter likhetstecknet i resursdefinitionen uppmanar Visual Studio Code dig att välja nödvändiga egenskaper:
När du väljer obligatoriska egenskaperfyller Visual Studio Code i resursdefinitionen med de egenskaper som är obligatoriska. Du kan hänvisa till nödvändiga egenskaper för att avgöra om alla egenskaper i den konverterade mallen behöver finnas.
Azure Quickstart Templates-arkivet är också användbart för den här uppgiften. Hitta en snabbstartsmall som gör ungefär det du försöker göra och titta på de egenskaper som anges för resursen.
Skapa en parameterfil
Parametrarna definieras för närvarande som standardvärden i mallen. För att mallen ska fungera bra i olika miljöer är det en bra idé att skapa en parameterfil och ta bort standardvärden för parametrar som behöver ändras för varje miljö.
Skapa en ny fil med namnet main.parameters.production.json.
Klistra in följande JSON i filen main.parameters.production.json:
{ "$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" } } }
Uppdatera värdena för parametrarna
virtualNetworkAddressPrefix
ochvirtualNetworkDefaultSubnetAddressPrefix
så att de matchar IP-adressintervallen som anges i referensmallens virtuella nätverksresurs.Här är till exempel hur värdena anges i en referensmall. Dina IP-adresser kan skilja sig från de IP-adresser som används i det här exemplet.
resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2024-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 } }
Uppdatera filen main.bicep för att ta bort standardvärdena för de parametrar som du angav i parameterfilen.
virtualMachineSizeName
virtualMachineManagedDiskStorageAccountType
virtualMachineAdminUsername
Ändra inte standardvärdena för parametrarna location
och publicIPAddressSkuName
eftersom dessa värden förmodligen är desamma för alla dina miljöer.
Verifiera mallen
I slutet av refaktorfasen bör din main.bicep- fil se ut ungefär som i följande exempel:
@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@2024-05-01' = { name: networkSecurityGroupName location: location } resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2024-05-01' = { name: publicIPAddressName location: location sku: { name: publicIPAddressSkuName tier: 'Regional' } properties: { publicIPAddressVersion: 'IPv4' publicIPAllocationMethod: 'Static' idleTimeoutInMinutes: 4 } } resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-07-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@2024-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@2024-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' } }
Din main.parameters.production.json-fil bör se ut ungefär som följande fil, även om du kan ha olika IP-adressintervall i listan:
{ "$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" } } }
Välj Visa>Problem för att visa problemfönstret.
Inga problem anges.
Tips
När du arbetar med dina egna mallar kan du göra olika val om egenskaperna för att parametrisera och andra anpassningar. I den här modulen ger vi allmän vägledning som hjälper dig att komma igång, men du måste tänka på din egen miljö och hur du vill återanvända mallarna när du bestämmer dig för hur du ska omstrukturera dina egna Bicep-filer.