Övning – Omstrukturera Bicep-filen

Slutförd

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

  1. Öppna filen main.bicep i Visual Studio Code.

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

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

  1. Ta bort den defaultSubnet resursen.

    Observera att networkInterface resursen nu visar ett problem eftersom den refererar till standardundernätets resurs-ID:

    Skärmbild av Visual Studio Code som visar resursdefinitionen för nätverksgränssnittet. Felet är markerat.

  2. Uppdatera virtualNetwork resursen så att den innehåller en existing referens till undernätet. Om du lägger till referensen för existing 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'
      }
    }
    
  3. 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.

  4. Gå till virtualNetwork resursens egenskap subnets och ta bort id: 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.

  1. Välj det symboliska namnet för parametern virtualNetworks_ToyTruck_vnet_name. Byt namn på den till virtualNetworkName.

  2. Ändra parametern till en variabel. Kom ihåg att ta bort typen eftersom variabeldefinitioner inte innehåller typer:

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

  1. Ö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
    
  2. Uppdatera varje resurs så att den använder parametern location i stället för den hårdkodade westus3 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.

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

  2. 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'
    }
    
  3. 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 och networkInterfaceName. 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'
    
  4. Uppdatera den publicIPAddress resursen så att den refererar till en parameter:

    Egenskap Parameter
    sku.name publicIPAddressSkuName
  5. 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 under osProfile.adminUsername
    virtualMachineAdminPassword
  6. Uppdatera virtualNetwork resursen så att den refererar till parametrarna och variablerna:

    Egenskap Parameter eller variabel
    addressSpace.addressPrefixes virtualNetworkAddressPrefix
    subnets.name virtualNetworkDefaultSubnetName
    subnets.addressPrefix virtualNetworkDefaultSubnetAddressPrefix
  7. Uppdatera virtualNetwork resursens kapslade resurs defaultSubnet:

    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.

  1. I resursen networkSecurityGroup tar du bort properties eftersom egenskapen securityRules är tom.

  2. Ta bort följande egenskaper i resursen publicIPAddress:

    • ipAddress, eftersom egenskapen ställs in automatiskt av Azure
    • ipTags egenskapen eftersom den är tom
  3. 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 distribueras

      Viktig

      Om du inte tar bort den här egenskapen distribueras inte mallen korrekt.

    • storageProfile.dataDisks egenskapen eftersom den är tom

    • osProfile.secrets egenskapen eftersom den är tom

    • osProfile.requireGuestProvisionSignal egenskapen eftersom Azure anger den här egenskapen automatiskt

  4. Ta bort följande egenskaper i resursen virtualNetwork:

    • delegations och virtualNetworkPeerings egenskaper eftersom de är tomma.
    • Raden för type: 'Microsoft.Network/virtualNetworks/subnets'
  5. Ta bort följande egenskaper i resursen networkInterface:

    • Egenskapen kind

    • Från ipConfigurations: id, etag, typeochprivateIPAddress eftersom den anges automatiskt av Azure och allokeringsmetoden Dynamisk

    • Från ipConfigurations.properties:

      • provisioningState
    • Från publicIPAddress, name, properties, typeoch sku

    • dnsSettings eftersom egenskapen dnsServers ä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:

Skärmbild av Visual Studio Code som visar alternativet för obligatoriska 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ö.

  1. Skapa en ny fil med namnet main.parameters.production.json.

  2. 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"
        }
      }
    }
    
  3. Uppdatera värdena för parametrarna virtualNetworkAddressPrefix och virtualNetworkDefaultSubnetAddressPrefix 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
      }
    }
    
  4. 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

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