Gyakorlat – A Bicep-fájl újrabontása

Befejeződött

Az előző gyakorlatban létrehozott egy kezdeti Bicep-fájlt, amely tartalmazza a toy truck virtuális gépet és a kapcsolódó erőforrásokat. A Bicep-sablon azonban nem követi az ajánlott eljárásokat, és egy kicsit nehéz elolvasni. Ebben a leckében újra kell majd átfésülni a fájlt.

Az újrabontási folyamat során a következőt fogja elvégezni:

  • Frissítse az erőforrások és paraméterek szimbolikus nevét.
  • Távolítsa el a redundáns paramétereket, erőforrásokat és tulajdonságokat.
  • Adjon hozzá változókat és paramétereket a Bicep-fájl újrafelhasználhatóvá tétele érdekében.

Az erőforrás szimbolikus nevének frissítése

  1. Nyissa meg a main.bicep fájlt a Visual Studio Code-ban.

  2. Válassza ki a hálózati biztonsági csoport erőforrásának szimbolikus nevét, amely networkSecurityGroups_ToyTruckServer_nsg_name_resource vagy hasonló név.

    Nevezze át a szimbolikus nevet. Válassza az F2 lehetőséget, vagy kattintson a jobb gombbal, majd válassza a Szimbólum átnevezése lehetőséget.

    Írja be a nevet networkSecurityGroup , és nyomja le az Enter billentyűt. A Visual Studio Code frissíti a fájl nevét és hivatkozásait.

  3. Ismételje meg ezt a folyamatot minden erőforrás esetében. Nevezze át az erőforrásokat az alábbi táblázatban látható módon.

    Feljegyzés

    Az üzemelő példány erőforrásainak neve kissé eltér a táblázatban szereplő nevektől. Keresse meg azokat az erőforrásokat, amelyek nevei közel állnak ezekhez a nevekhez.

    Erőforrás típusa Aktuális szimbolikus név Új szimbolikus név
    Nyilvános IP-cím publicIPAddresses_ToyTruckServer_ip_name_resource publicIPAddress
    Virtuális gép virtualMachines_ToyTruckServer_name_resource virtualMachine
    Virtuális hálózat virtualNetworks_ToyTruck_vnet_name_resource virtualNetwork
    Alhálózat virtualNetworks_ToyTruck_vnet_name_default defaultSubnet
    Hálózati adapter networkInterfaces_toytruckserver890_name_resource networkInterface

A redundáns alhálózati erőforrás eltávolítása

A virtuális hálózat alhálózata jelenleg kétszer van definiálva. Egyszer az erőforrásban virtualNetwork , majd a saját gyermekerőforrásaként van definiálva defaultSubnet. Nincs értelme kétszer meghatározni az alhálózatot.

  1. Törölje az erőforrást defaultSubnet .

    Figyelje meg, hogy az networkInterface erőforrás problémát jelenít meg, mert az az alapértelmezett alhálózat erőforrás-azonosítójára hivatkozik:

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

  2. Frissítse az erőforrást virtualNetwork , hogy hivatkozzon existing az alhálózatra. Ha hozzáadja a existing hivatkozást, újra hivatkozhat az alhálózatra a Bicep-kódban anélkül, hogy újra meghatározta volna:

    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. Frissítse az erőforrást networkInterface az alhálózat erőforrás-azonosítójára való hivatkozáshoz:

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

    Hibaüzenet jelenik meg arról, hogy a kifejezés egy ciklusban szerepel. Ezt a következő lépésben fogja kijavítani.

  4. Lépjen az virtualNetwork erőforrás tulajdonságára subnets , és távolítsa el id: defaultSubnet.id a hibát.

Paraméterek módosítása változókra

A sablon paramétereinek nem kell paramétereknek lenniük. Most átnevezi a paramétereket értelmesebb nevekre, és változókká konvertálja őket.

  1. Válassza ki a paraméter szimbolikus nevét virtualNetworks_ToyTruck_vnet_name . Nevezze át a névre virtualNetworkName.

  2. Módosítsa a paramétert változóra. Ne felejtse el eltávolítani a típust, mert a változódefiníciók nem tartalmaznak típusokat:

    var virtualNetworkName = 'ToyTruck-vnet'
    
  3. Ismételje meg a folyamatot az egyes paramétereknél. Nevezze át a paramétereket az alábbi táblázatban látható módon.

    Figyelje meg, hogy az érték networkInterfaceName háromjegyű számot tartalmaz. A szám eltérő a különböző üzemelő példányok esetében. Győződjön meg arról, hogy átmásolja a változó értékét a referenciasablonból.

    Aktuális paraméternév Új változó neve
    virtualMachines_ToyTruckServer_name virtualMachineName
    networkInterfaces_toytruckserver890_name networkInterfaceName
    publicIPAddresses_ToyTruckServer_ip_name publicIPAddressName
    networkSecurityGroups_ToyTruckServer_nsg_name networkSecurityGroupName
  4. Ellenőrizze, hogy a változódeklarációk a következő példához hasonlóan néznek-e ki:

    var virtualNetworkName = 'ToyTruck-vnet'
    var virtualMachineName = 'ToyTruckServer'
    var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME'
    var publicIPAddressName = 'ToyTruckServer-ip'
    var networkSecurityGroupName = 'ToyTruckServer-nsg'
    

Az erőforrás helyének frissítése

Az összes erőforrás jelenleg egy kódolt helyet használ. Most hozzáad egy paramétert, hogy a sablon újrafelhasználhatóbbá váljon.

  1. A fájl tetején adjon hozzá egy új paramétert és egy leírás-dekorátort a paraméter céljának tisztázásához:

    @description('The location where resources are deployed.')
    param location string = resourceGroup().location
    
  2. Frissítse az egyes erőforrásokat úgy, hogy a location paramétert használják westus3 a rögzített hely helyett.

Paramétereket és változók hozzáadása

A sablon tartalmaz néhány olyan rögzített értéket, ahol a paraméterek vagy változók megfelelőbbek lennének. Most olyan paramétereket fog hozzáadni a tulajdonságokhoz, amelyek változhatnak az üzemelő példányok és a nem kívánt értékek változói között.

  1. A main.bicep fájl tetején, a location paraméter alatt adja hozzá a következő paramétereket:

    @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
    

    Egyes paraméterek alapértelmezett értékekkel rendelkeznek, míg mások nem. Később létrehoz egy paraméterfájlt a legtöbb érték beállításához.

  2. Adja hozzá a következő új változódeklarációkat a networkSecurityGroupName változó alá:

    var virtualNetworkDefaultSubnetName = 'default'
    var virtualMachineImageReference = {
      publisher: 'canonical'
      offer: '0001-com-ubuntu-server-focal'
      sku: '20_04-lts-gen2'
      version: 'latest'
    }
    
  3. Adja hozzá a következő változódeklarációt. Cserélje le az értéket az operációsrendszer-lemez nevére a saját referenciasablonból.

    var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
    

    Az érték virtualMachineOSDiskName egyedi. Az érték az egyes üzemelő példányok esetében eltérő. Győződjön meg arról, hogy átmásolja a változó értékét a referenciasablonból.

    Figyelmeztetés

    Győződjön meg arról, hogy a megfelelő értékeket másolja a virtualMachineOSDiskName változókhoz.networkInterfaceName Ellenkező esetben az Azure nem észleli, hogy meglévő erőforrásokat deklarál, és megpróbál új erőforrásokat létrehozni.

    A változódeklarációknak most az alábbi példához hasonlóan kell kinéznie:

    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. Frissítse az erőforrást publicIPAddress egy paraméterre való hivatkozáshoz:

    Tulajdonság Paraméter
    sku.name publicIPAddressSkuName
  5. Frissítse az erőforrást virtualMachine a paraméterekre és változókra való hivatkozáshoz:

    Tulajdonság Paraméter vagy változó
    hardwareProfile.vmSize virtualMachineSizeName
    storageProfile.imageReference virtualMachineImageReference
    A változó nevével cserélje le az objektum értékeit, beleértve a kapcsos zárójeleket is.
    storageProfile.osDisk.name virtualMachineOSDiskName
    storageProfile.osDisk.managedDisk.storageAccountType virtualMachineManagedDiskStorageAccountType
    osProfile.adminUsername virtualMachineAdminUsername
    osProfile.adminPassword
    Adja hozzá ezt a tulajdonságot alább osProfile.adminUsername
    virtualMachineAdminPassword
  6. Frissítse az erőforrást virtualNetwork a paraméterekre és változókra való hivatkozáshoz:

    Tulajdonság Paraméter vagy változó
    addressSpace.addressPrefixes virtualNetworkAddressPrefix
    subnets.name virtualNetworkDefaultSubnetName
    subnets.addressPrefix virtualNetworkDefaultSubnetAddressPrefix
  7. virtualNetwork Az erőforrás beágyazott erőforrásának defaultSubnetfrissítése:

    Tulajdonság Változó
    name virtualNetworkDefaultSubnetName

Szükségtelen tulajdonságok eltávolítása

Az exportálási folyamat redundáns tulajdonságokat ad hozzá számos erőforráshoz. Az alábbi lépésekkel eltávolíthatja a szükségtelen tulajdonságokat.

  1. Távolítsa el properties az networkSecurityGroup erőforrást, mert a securityRules tulajdonság üres.

  2. Az erőforrásban publicIPAddress távolítsa el a következő tulajdonságokat:

    • ipAddress tulajdonságot, mert az Azure automatikusan be van állítva
    • ipTags tulajdonság, mert üres
  3. Az erőforrásban virtualMachine távolítsa el a következő tulajdonságokat:

    • storageProfile.osDisk.managedDisk.id tulajdonságot, mert az Azure automatikusan meghatározza ezt a tulajdonságot a virtuális gép üzembe helyezésekor

      Fontos

      Ha nem távolítja el ezt a tulajdonságot, a sablon nem fog megfelelően üzembe helyezni.

    • storageProfile.dataDisks tulajdonság, mert üres

    • osProfile.secrets tulajdonság, mert üres

    • osProfile.requireGuestProvisionSignal tulajdonságot, mert az Azure automatikusan beállítja ezt a tulajdonságot

  4. Az erőforrásban virtualNetwork távolítsa el a következő tulajdonságokat:

    • delegations és virtualNetworkPeerings tulajdonságokat, mert üresek.
    • A következő sor: type: 'Microsoft.Network/virtualNetworks/subnets'
  5. Az erőforrásban networkInterface távolítsa el a következő tulajdonságokat:

    • A kind tulajdonság

    • Feladó ipConfigurations: id, etag, type, ésprivateIPAddress mivel az Azure automatikusan be van állítva, és a foglalási módszer dinamikus

    • Feladó ipConfigurations.properties:

      • provisioningState
    • Feladó publicIPAddress, name, properties, typeés sku

    • dnsSettings mert a dnsServers tulajdonság üres

Tipp.

Ha saját sablonokkal dolgozik, meg kell határoznia, hogy vannak-e olyan tulajdonságok, amelyeket el kell távolítani, mint itt.

A Visual Studio Code-ban a Bicep-bővítmény segít az erőforrás minimális tulajdonságainak beállításában. Ha az erőforrásdefiníció egyenlőségjele után szóközt ad hozzá, a Visual Studio Code kéri a szükséges tulajdonságok kiválasztását:

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

A kötelező tulajdonságok kiválasztásakor a Visual Studio Code kitölti az erőforrásdefiníciót a kötelező tulajdonságokkal. A szükséges tulajdonságokra hivatkozva megállapíthatja, hogy a konvertált sablonban lévő tulajdonságoknak mindegyiknek jelen kell-e lenniük.

Az Azure Rövid útmutatósablonok adattára ebben a feladatban is hasznos. Keressen egy gyorsútmutató-sablont, amely nagyjából azt teszi, amit szeretne, és tekintse meg az erőforráson megadott tulajdonságokat.

Paraméterfájl létrehozása

A paraméterek jelenleg alapértelmezett értékekként vannak definiálva a sablonban. Ahhoz, hogy a sablon jól működjön a különböző környezetekben, érdemes létrehozni egy paraméterfájlt, és eltávolítani az egyes környezetekben módosítani kívánt paraméterek alapértelmezett értékeit.

  1. Hozzon létre egy main.parameters.production.json nevű új fájlt.

  2. Illessze be a következő JSON-t a main.parameters.production.json fájlba:

    {
      "$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. Frissítse a virtualNetworkAddressPrefix referenciasablon virtuális hálózati erőforrásában megadott IP-címtartományoknak megfelelő értékeket és virtualNetworkDefaultSubnetAddressPrefix paramétereket.

    Például az alábbi módon adhatja meg az értékeket egy referenciasablonban. Az IP-címek eltérhetnek a példában használt IP-címektől.

    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. Frissítse a main.bicep fájlt a paraméterfájlban megadott paraméterek alapértelmezett értékeinek eltávolításához.

    • virtualMachineSizeName
    • virtualMachineManagedDiskStorageAccountType
    • virtualMachineAdminUsername

Ne módosítsa az alapértelmezett értékeket és locationpublicIPAddressSkuName paramétereket, mert ezek az értékek valószínűleg megegyeznek az összes környezetében.

A sablon ellenőrzése

  1. Az újrabontási fázis végén a main.bicep fájlnak az alábbi példához hasonlóan kell kinéznie:

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

    A main.parameters.production.json fájlnak az alábbi fájlhoz hasonlóan kell kinéznie, bár előfordulhat, hogy különböző IP-címtartományok szerepelnek a listában:

    {
      "$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álassza a Problémák megtekintése lehetőséget>a problémák panel megjelenítéséhez.

    Nincs probléma jelezve.

Tipp.

Ha saját sablonokkal dolgozik, különböző döntéseket hozhat a paraméterezendő tulajdonságokról és más testreszabásokról. Ebben a modulban általános útmutatást nyújtunk az első lépésekhez, de figyelembe kell vennie a saját környezetét és azt, hogy miként szeretné újra felhasználni a sablonokat, amikor eldönti, hogyan kell újrabontást végeznie a Bicep-fájlokon.