Übung: Refactoring der Bicep-Datei

Abgeschlossen

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

  1. Öffnen Sie in Visual Studio Code die Datei main.bicep.

  2. 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.

  3. 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.

  1. 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:

    Screenshot of Visual Studio Code that shows the network interface resource definition. The error is highlighted.

  2. Aktualisieren Sie die virtualNetwork-Ressource, um einen existing-Verweis auf die Ressourcen-ID des Subnetzes zu setzen. Indem Sie den existing-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'
      }
    }
    
  3. 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.

  4. Wechseln Sie zur subnets-Eigenschaft der Ressource virtualNetwork, und entfernen Sie id: 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.

  1. Wählen Sie den symbolischen Namen für den virtualNetworks_ToyTruck_vnet_name-Parameter aus. Benennen Sie die Spalte in virtualNetworkName um.

  2. Ändern Sie den Parameter in eine Variable. Denken Sie daran, den Typ zu entfernen, da Variablendefinitionen keine Typen enthalten:

    var virtualNetworkName = 'ToyTruck-vnet'
    
  3. 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
  4. 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.

  1. 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
    
  2. Aktualisieren Sie jede Ressource so, dass anstelle des hartcodierten Speicherorts „westus3“ der location-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.

  1. 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.

  2. 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'
    }
    
  3. 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 und networkInterfaceName 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'
    
  4. Aktualisieren Sie die Ressource publicIPAddress so, dass sie auf einen Parameter verweist:

    Eigenschaft Parameter
    sku.name publicIPAddressSkuName
  5. 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 unter osProfile.adminUsername hinzu.
    virtualMachineAdminPassword
  6. 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
  7. Aktualisieren Sie die geschachtelte Ressource defaultSubnet der Ressource virtualNetwork:

    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.

  1. Entfernen Sie in der Ressource networkSecurityGroup die properties, da die securityRules-Eigenschaft leer ist.

  2. 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
  3. 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 wird

      Wichtig

      Wenn Sie diese Eigenschaft nicht entfernen, wird Ihre Vorlage nicht ordnungsgemäß bereitgestellt.

    • Die storageProfile.dataDisks-Eigenschaft, da sie leer ist

    • Die osProfile.secrets-Eigenschaft, da sie leer ist

    • Die osProfile.requireGuestProvisionSignal-Eigenschaft, da diese Eigenschaft automatisch von Azure festgelegt wird

  4. Entfernen Sie in der Ressource virtualNetwork die folgenden Eigenschaften:

    • Die Eigenschaften delegations und virtualNetworkPeerings, da sie leer sind
    • Die Zeile für type: 'Microsoft.Network/virtualNetworks/subnets'
  5. Entfernen Sie in der Ressource networkInterface die folgenden Eigenschaften:

    • Die kind-Eigenschaft.

    • In ipConfigurations: id, etag, type und privateIPAddress, da sie automatisch von Azure festgelegt werden und die Zuordnungsmethode dynamisch ist

    • Von ipConfigurations.properties:

      • provisioningState
    • In publicIPAddress, name, properties, type und sku

    • dnsSettings, da die dnsServers-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:

Screenshot of Visual Studio Code that shows the required-properties option.

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.

  1. Erstellen Sie eine neue Datei mit dem Namen main.parameters.production.json.

  2. 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"
        }
      }
    }
    
  3. Aktualisieren Sie die Werte für die virtualNetworkAddressPrefix- und virtualNetworkDefaultSubnetAddressPrefix-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
      }
    }
    
  4. 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

  1. 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"
        }
      }
    }
    
  2. 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.