Übung: Refactoring der Bicep-Datei
In der vorherigen Übung haben Sie eine erste Bicep-Datei erstellt, die den virtuellen Computer für den Spielzeug-LKW und zugehörige Ressourcen enthält. Die Bicep-Vorlage befolgt jedoch nicht die bewährten Methoden und ist etwas schwer zu lesen. In dieser Einheit werden Sie die Datei umgestalten.
Beim Umgestaltungsprozess gehen Sie wie folgt vor:
- Aktualisieren Sie die symbolischen Namen für Ihre Ressourcen und Parameter.
- Entfernen Sie redundante Parameter, Ressourcen und Eigenschaften.
- Fügen Sie Variablen und Parameter hinzu, damit die Bicep-Datei wiederverwendbar wird.
Aktualisieren der symbolischen Ressourcennamen
Öffnen Sie in Visual Studio Code die Datei main.bicep.
Wählen Sie den symbolischen Namen für die Netzwerksicherheitsgruppe
networkSecurityGroups_ToyTruckServer_nsg_name_resource
oder mit einem ähnlichen Namen aus.Benennen Sie den symbolischen Namen um. Sie können F2 drücken oder mit der rechten Maustaste klicken und dann Symbol umbenennen auswählen.
Geben Sie den Namen
networkSecurityGroup
ein, und drücken Sie die EINGABETASTE. Visual Studio Code aktualisiert den Namen und alle Verweise in der Datei.Wiederholen Sie diesen Vorgang für jede Ressource. Benennen Sie die Ressourcen wie in der folgenden Tabelle um.
Hinweis
Die Namen der Ressourcen in Ihrer Bereitstellung unterscheiden sich etwas von den Namen in der Tabelle. Suchen Sie nach Ressourcen mit Namen, die diesen hier ähnlich sind.
Ressourcentyp Aktueller symbolischer Name Neuer symbolischer Name Öffentliche IP-Adresse publicIPAddresses_ToyTruckServer_ip_name_resource
publicIPAddress
Virtueller Computer virtualMachines_ToyTruckServer_name_resource
virtualMachine
Virtuelles Netzwerk virtualNetworks_ToyTruck_vnet_name_resource
virtualNetwork
Subnet virtualNetworks_ToyTruck_vnet_name_default
defaultSubnet
Netzwerkschnittstelle networkInterfaces_toytruckserver890_name_resource
networkInterface
Entfernen der redundanten Subnetzressource
Das Subnetz des virtuellen Netzwerks ist derzeit zweimal definiert. Es wird einmal in der Ressource virtualNetwork
und erneut als eigene untergeordnete Ressource mit dem Namen defaultSubnet
definiert. Es ist nicht sinnvoll, es zwei Mal zu definieren.
Löschen Sie die
defaultSubnet
-Ressource.Beachten Sie, dass die
networkInterface
-Ressource jetzt ein Problem anzeigt, da sie auf die Ressourcen-ID des Standardsubnetzes verweist:Aktualisieren Sie die
virtualNetwork
-Ressource, um einenexisting
-Verweis auf die Ressourcen-ID des Subnetzes zu setzen. Indem Sie denexisting
-Verweis hinzufügen, können Sie in Ihrem Bicep-Code erneut auf das Subnetz verweisen, ohne es ein zweites Mal zu definieren: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' } }
Aktualisieren Sie die
networkInterface
-Ressource, um auf die Ressourcen-ID des Subnetzes zu verweisen: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' } }
Sie werden einen Fehler feststellen, dass der Ausdruck an einem Zyklus beteiligt ist. Dies werden Sie im nächsten Abschnitt korrigieren.
Wechseln Sie zur
subnets
-Eigenschaft der RessourcevirtualNetwork
, und entfernen Sieid: defaultSubnet.id
, um den Fehler zu beheben.
Ändern der Parameter in Variablen
Die Parameter in der Vorlage müssen keine Parameter sein. Nun geben Sie den Parametern aussagekräftigere Namen und konvertieren sie in Variablen.
Wählen Sie den symbolischen Namen für den
virtualNetworks_ToyTruck_vnet_name
-Parameter aus. Benennen Sie die Spalte invirtualNetworkName
um.Ändern Sie den Parameter in eine Variable. Denken Sie daran, den Typ zu entfernen, da Variablendefinitionen keine Typen enthalten:
var virtualNetworkName = 'ToyTruck-vnet'
Wiederholen Sie den Prozess für jeden Parameter. Benennen Sie die Parameter wie in der folgenden Tabelle um.
Beachten Sie, dass der Wert von
networkInterfaceName
eine dreistellige Zahl enthält. Die Zahl unterscheidet sich für unterschiedliche Bereitstellungen. Stellen Sie sicher, dass Sie den Wert der Variablen aus Ihrer Referenzvorlage kopieren.Aktueller Parametername Neuer Variablenname virtualMachines_ToyTruckServer_name
virtualMachineName
networkInterfaces_toytruckserver890_name
networkInterfaceName
publicIPAddresses_ToyTruckServer_ip_name
publicIPAddressName
networkSecurityGroups_ToyTruckServer_nsg_name
networkSecurityGroupName
Stellen Sie sicher, dass Ihre Variablendeklarationen in etwa wie im folgenden Beispiel aussehen:
var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg'
Aktualisieren der Ressourcenspeicherorte
Alle Ressourcen verwenden derzeit einen hartcodierten Speicherort. Sie fügen nun einen Parameter hinzu, damit die Vorlage besser wiederverwendet werden kann.
Fügen Sie am Anfang der Datei einen neuen Parameter und ein beschreibendes Decorator-Element hinzu, um den Zweck des Parameters deutlich zu machen:
@description('The location where resources are deployed.') param location string = resourceGroup().location
Aktualisieren Sie jede Ressource so, dass anstelle des hartcodierten Speicherorts „
westus3
“ derlocation
-Parameter verwendet wird.
Hinzufügen von Parametern und Variablen
Ihre Vorlage verfügt über einige hartcodierte Werte, für die Parameter oder Variablen besser geeignet sind. Nun fügen Sie Parameter für Eigenschaften hinzu, die sich zwischen Bereitstellungen ändern können, und Variablen für Werte, die sich nicht ändern.
Fügen Sie am Anfang der Datei main.bicep unter dem
location
-Parameter die folgenden Parameter hinzu:@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
Einige der Parameter weisen Standardwerte auf, andere hingegen nicht. Später erstellen Sie eine Parameterdatei, um die meisten dieser Werte festzulegen.
Fügen Sie unter der Variable
networkSecurityGroupName
die folgenden neuen Variablendeklarationen hinzu:var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' }
Fügen Sie die folgende Variablendeklaration hinzu. Ersetzen Sie dabei den Wert durch den Namen des Betriebssystemdatenträgers aus Ihrer eigenen Referenzvorlage.
var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
Der Wert von
virtualMachineOSDiskName
ist eindeutig. Der Wert ist für jede Bereitstellung unterschiedlich. Stellen Sie sicher, dass Sie den Wert der Variablen aus Ihrer Referenzvorlage kopieren.Warnung
Stellen Sie sicher, dass Sie die Werte für die Variablen
virtualMachineOSDiskName
undnetworkInterfaceName
richtig kopieren. Andernfalls erkennt Azure nicht, dass Sie vorhandene Ressourcen deklarieren und versucht möglicherweise, neue Ressourcen zu erstellen.Ihre Variablendeklarationen sollten wie das folgende Beispiel aussehen:
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'
Aktualisieren Sie die Ressource
publicIPAddress
so, dass sie auf einen Parameter verweist:Eigenschaft Parameter sku.name
publicIPAddressSkuName
Aktualisieren Sie die
virtualMachine
-Ressource so, dass sie auf die Parameter und Variablen verweist:Eigenschaft Parameter oder Variable hardwareProfile.vmSize
virtualMachineSizeName
storageProfile.imageReference
virtualMachineImageReference
Verwenden Sie den Variablennamen, um die Werte des Objekts zu ersetzen, einschließlich der geschweiften Klammern.storageProfile.osDisk.name
virtualMachineOSDiskName
storageProfile.osDisk.managedDisk.storageAccountType
virtualMachineManagedDiskStorageAccountType
osProfile.adminUsername
virtualMachineAdminUsername
osProfile.adminPassword
Fügen Sie diese Eigenschaft unterosProfile.adminUsername
hinzu.virtualMachineAdminPassword
Aktualisieren Sie die
virtualNetwork
-Ressource so, dass sie auf die Parameter und Variablen verweist:Eigenschaft Parameter oder Variable addressSpace.addressPrefixes
virtualNetworkAddressPrefix
subnets.name
virtualNetworkDefaultSubnetName
subnets.addressPrefix
virtualNetworkDefaultSubnetAddressPrefix
Aktualisieren Sie die geschachtelte Ressource
defaultSubnet
der RessourcevirtualNetwork
:Eigenschaft Variable name
virtualNetworkDefaultSubnetName
Entfernen unnötiger Eigenschaften
Der Exportprozess fügt vielen Ressourcen redundante Eigenschaften hinzu. Führen Sie die folgenden Schritte aus, um die nicht benötigten Eigenschaften zu entfernen.
Entfernen Sie in der Ressource
networkSecurityGroup
dieproperties
, da diesecurityRules
-Eigenschaft leer ist.Entfernen Sie in der Ressource
publicIPAddress
die folgenden Eigenschaften:- Die
ipAddress
-Eigenschaft, da sie automatisch von Azure festgelegt wird - Die
ipTags
-Eigenschaft, da sie leer ist
- Die
Entfernen Sie in der Ressource
virtualMachine
die folgenden Eigenschaften:Die
storageProfile.osDisk.managedDisk.id
-Eigenschaft, da Azure diese Eigenschaft automatisch bestimmt, wenn die VM bereitgestellt wirdWichtig
Wenn Sie diese Eigenschaft nicht entfernen, wird Ihre Vorlage nicht ordnungsgemäß bereitgestellt.
Die
storageProfile.dataDisks
-Eigenschaft, da sie leer istDie
osProfile.secrets
-Eigenschaft, da sie leer istDie
osProfile.requireGuestProvisionSignal
-Eigenschaft, da diese Eigenschaft automatisch von Azure festgelegt wird
Entfernen Sie in der Ressource
virtualNetwork
die folgenden Eigenschaften:- Die Eigenschaften
delegations
undvirtualNetworkPeerings
, da sie leer sind - Die Zeile für
type: 'Microsoft.Network/virtualNetworks/subnets'
- Die Eigenschaften
Entfernen Sie in der Ressource
networkInterface
die folgenden Eigenschaften:Die
kind
-Eigenschaft.In
ipConfigurations
:id
,etag
,type
undprivateIPAddress
, da sie automatisch von Azure festgelegt werden und die Zuordnungsmethode dynamisch istVon
ipConfigurations.properties
:provisioningState
In
publicIPAddress
,name
,properties
,type
undsku
dnsSettings
, da diednsServers
-Eigenschaft leer ist
Tipp
Wenn Sie mit eigenen Vorlagen arbeiten, müssen Sie bestimmen, ob Eigenschaften vorhanden sind, die wie hier gezeigt entfernt werden sollten.
In Visual Studio Code hilft Ihnen die Bicep-Erweiterung dabei, die Mindesteigenschaften für eine Ressource festzulegen. Wenn Sie nach dem Gleichheitszeichen in der Ressourcendefinition ein Leerzeichen hinzufügen, werden Sie von Visual Studio Code aufgefordert, erforderliche Eigenschaften auszuwählen:
Wenn Sie required-properties auswählen, füllt Visual Studio Code die Ressourcendefinition mit den obligatorischen Eigenschaften auf. Sie können auf required-properties zurückgreifen, um zu bestimmen, ob alle Eigenschaften in der konvertierten Vorlage vorhanden sein müssen.
Das Repository „Azure-Schnellstartvorlagen“ ist für diese Aufgabe ebenfalls hilfreich. Suchen Sie nach einer Schnellstartvorlage, die ungefähr das tut, was Sie implementieren möchten, und sehen Sie sich die Eigenschaften an, die sie für die Ressource festlegt.
Erstellen einer Parameterdatei
Ihre Parameter sind derzeit als Standardwerte in Ihrer Vorlage definiert. Damit Ihre Vorlage umgebungsübergreifend gut funktioniert, empfiehlt es sich, eine Parameterdatei zu erstellen und Standardwerte für Parameter zu entfernen, die für jede Umgebung geändert werden müssen.
Erstellen Sie eine neue Datei mit dem Namen main.parameters.production.json.
Fügen Sie den folgenden JSON-Code in die Datei main.parameters.production.json ein:
{ "$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" } } }
Aktualisieren Sie die Werte für die
virtualNetworkAddressPrefix
- undvirtualNetworkDefaultSubnetAddressPrefix
-Parameter so, dass sie den IP-Adressbereichen entsprechen, die in der virtuellen Netzwerkressource Ihrer Referenzvorlage angegeben werden.So werden die Werte beispielsweise in einer Referenzvorlage angegeben. Ihre IP-Adressen können sich von den IP-Adressen unterscheiden, die in diesem Beispiel verwendet werden.
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 } }
Aktualisieren Sie die Datei main.bicep, um die Standardwerte für die Parameter zu entfernen, die Sie in der Parameterdatei angegeben haben.
virtualMachineSizeName
virtualMachineManagedDiskStorageAccountType
virtualMachineAdminUsername
Behalten Sie die Standardwerte für die Parameter location
und publicIPAddressSkuName
bei, da sie wahrscheinlich für alle Ihre Umgebungen identisch sind.
Überprüfen der Vorlage
Am Ende der Umgestaltungsphase sollte die Datei main.bicep in etwa wie das folgende Beispiel aussehen:
@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' } }
Ihre Datei main.parameters.production.json sollte in etwa wie folgt aussehen, obwohl sie möglicherweise andere IP-Adressbereiche auflistet:
{ "$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" } } }
Wählen Sie Anzeigen>Probleme aus, um den Problembereich anzuzeigen.
Es werden keine Probleme angezeigt.
Tipp
Wenn Sie mit Ihren eigenen Vorlagen arbeiten, können Sie unterschiedliche Entscheidungen über die zu parametrisierenden Eigenschaften und andere Anpassungen treffen. In diesem Modul geben wir Ihnen allgemeine Anleitungen, die Ihnen den Einstieg erleichtern sollen. Sie müssen jedoch Ihre eigene Umgebung berücksichtigen und überlegen, wie Sie Ihre Vorlagen wiederverwenden möchten, wenn Sie entscheiden, wie Sie Ihre eigenen Bicep-Dateien umgestalten.