Oefening: Het Bicep-bestand herstructureren

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

  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.

    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.

  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:

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

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

  4. Ga naar de eigenschap van subnets de virtualNetwork resource en verwijder id: 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.

  1. Selecteer de symbolische naam voor de virtualNetworks_ToyTruck_vnet_name parameter. 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 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
  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 location parameter 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 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.

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

    Eigenschappen Parameter
    sku.name publicIPAddressSkuName
  5. 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 toe osProfile.adminUsername
    virtualMachineAdminPassword
  6. 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
  7. Werk de geneste resource van de virtualNetwork resource defaultSubnetbij:

    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.

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

  2. Verwijder in de publicIPAddress resource de volgende eigenschappen:

    • ipAddress eigenschap omdat deze automatisch wordt ingesteld door Azure
    • ipTags eigenschap omdat deze 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 omdat azure deze eigenschap automatisch instelt

  4. Verwijder in de virtualNetwork resource de volgende eigenschappen:

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

    • De kind eigenschap

    • VanipConfigurations: id, etag, typeenprivateIPAddress omdat deze automatisch wordt ingesteld door Azure en de toewijzingsmethode dynamisch is

    • Van ipConfigurations.properties:

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

    • dnsSettings omdat de dnsServers 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:

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

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.

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

Uw sjabloon controleren

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