Oefening - Het Bicep-bestand refacteren

Voltooid

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

  1. Open in Visual Studio Code het bestand main.bicep.

  2. Selecteer de symbolische naam voor de resource van de netwerkbeveiligingsgroep, die is networkSecurityGroups_ToyTruckServer_nsg_name_resource of een vergelijkbare naam.

    Wijzig de symbolische naam. U kunt F2 selecteren of met de rechtermuisknop klikken en vervolgens Hernoem Symboolselecteren.

    Voer de naam networkSecurityGroup in en druk op Enter-. Visual Studio Code werkt de naam en alle verwijzingen in het bestand bij.

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

    Middeltype 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 één keer gedefinieerd in de virtualNetwork-resource en opnieuw als een aparte kinderresource met de naam defaultSubnet. Het is niet zinvol om het subnet twee keer te definiëren.

  1. Verwijder de defaultSubnet resource.

    U ziet dat de networkInterface resource nu een probleem weergeeft, omdat deze verwijst naar de resource-id van het standaardsubnet:

    schermopname van Visual Studio Code met de definitie van de netwerkinterfaceresource. De fout is gemarkeerd.

  2. Werk de virtualNetwork-resource bij om een existing verwijzing naar het subnet op te nemen. Als u de existing verwijzing toevoegt, kunt u opnieuw verwijzen naar het subnet in uw Bicep-code zonder deze opnieuw te definiëren:

    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'
      }
    }
    
  3. Werk de networkInterface-resource bij om te verwijzen naar de resource-id van het subnet:

    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'
      }
    }
    

    U merkt een fout op dat de expressie betrokken is bij een cyclus. U lost dit in de volgende stap op.

  4. Ga naar de subnets eigenschap van de virtualNetwork resource en verwijder id: defaultSubnet.id om de fout op te lossen.

Verander de parameters 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.

  1. Selecteer de symbolische naam voor de parameter virtualNetworks_ToyTruck_vnet_name. Wijzig de naam in virtualNetworkName.

  2. Wijzig de parameter in een variabele. Vergeet niet om het type te verwijderen omdat variabeledefinities geen typen bevatten:

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

  1. 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
    
  2. Werk elke resource bij om de parameter location te gebruiken in plaats van de in code vastgelegde westus3 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.

  1. Voeg boven aan het bestand main.bicep, onder de parameter location, 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.

  2. 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'
    }
    
  3. 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 het virtualMachineOSDiskName 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 en networkInterfaceName 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'
    
  4. Werk de publicIPAddress-resource bij om te verwijzen naar een parameter:

    Eigenschap Parameter
    sku.name publicIPAddressSkuName
  5. Werk de virtualMachine-resource bij om te verwijzen naar de parameters en variabelen:

    Eigenschap Parameter of variabele
    hardwareProfile.vmSize virtualMachineSizeName
    storageProfile.imageReference virtualMachineImageReference
    Gebruik de variabelenaam om de waarden van het object inclusief de haakjes te vervangen.
    storageProfile.osDisk.name virtualMachineOSDiskName
    storageProfile.osDisk.managedDisk.storageAccountType virtualMachineManagedDiskStorageAccountType
    osProfile.adminUsername virtualMachineAdminUsername
    osProfile.adminPassword
    Voeg deze eigenschap toe onder osProfile.adminUsername
    virtualMachineAdminPassword
  6. Werk de virtualNetwork-resource bij om te verwijzen naar de parameters en variabelen:

    Eigendom Parameter of variabele
    addressSpace.addressPrefixes virtualNetworkAddressPrefix
    subnets.name virtualNetworkDefaultSubnetName
    subnets.addressPrefix virtualNetworkDefaultSubnetAddressPrefix
  7. Werk de geneste resource defaultSubnetvan de virtualNetwork-resource bij.

    Eigendom Veranderlijk
    name virtualNetworkDefaultSubnetName

Overbodige eigenschappen verwijderen

Het exportproces voegt redundante eigenschappen toe aan veel resources. Gebruik deze stappen om de overbodige eigenschappen te verwijderen.

  1. Verwijder properties in de networkSecurityGroup resource omdat de eigenschap securityRules leeg is.

  2. Verwijder in de publicIPAddress resource de volgende eigenschappen:

    • ipAddress eigenschap omdat deze automatisch wordt ingesteld door Azure
    • ipTags attribuut omdat het leeg is
  3. 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ïmplementeerd

      Belangrijk

      Als u deze eigenschap niet verwijdert, wordt de sjabloon niet correct geïmplementeerd.

    • storageProfile.dataDisks eigenschap omdat deze leeg is

    • osProfile.secrets eigenschap omdat deze leeg is

    • osProfile.requireGuestProvisionSignal eigenschap omdat Azure deze eigenschap automatisch instelt

  4. Verwijder in de virtualNetwork resource de volgende eigenschappen:

    • delegations en virtualNetworkPeerings eigenschappen omdat deze leeg zijn.
    • De regel voor type: 'Microsoft.Network/virtualNetworks/subnets'
  5. Verwijder in de networkInterface resource de volgende eigenschappen:

    • De eigenschap kind

    • Uit ipConfigurations: id, etag, typeenprivateIPAddress omdat deze automatisch wordt ingesteld door Azure en de toewijzingsmethode wordt Dynamische

    • Vanaf ipConfigurations.properties:

      • provisioningState
    • Vanuit publicIPAddress, name, properties, typeen sku

    • dnsSettings omdat de eigenschap dnsServers 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, vraagt Visual Studio Code u om vereiste eigenschappen te selecteren:

schermopname van Visual Studio Code met de optie Vereiste eigenschappen.

Wanneer u vereiste eigenschappenselecteert, 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 de geconverteerde sjabloon allemaal aanwezig moeten zijn.

De Azure Quickstart Templates repository is ook nuttig 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.

  1. Maak een nieuw bestand met de naam main.parameters.production.json.

  2. 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"
        }
      }
    }
    
  3. Werk de waarden voor de parameters virtualNetworkAddressPrefix en virtualNetworkDefaultSubnetAddressPrefix 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@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
      }
    }
    
  4. 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 parameters location en publicIPAddressSkuName niet, omdat deze waarden waarschijnlijk hetzelfde zijn voor al uw omgevingen.

Uw sjabloon controleren

  1. Aan het einde van de herfactorfase moet uw main.bicep-bestand 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@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'
      }
    }
    

    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"
        }
      }
    }
    
  2. Selecteer Weergave>Problemen 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.