Oefening: resources converteren en migreren

Voltooid

Belangrijk

U hebt uw eigen Azure-abonnement nodig om deze oefening te kunnen uitvoeren. Dit kan kosten met zich meebrengen. Als u nog geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Uw speelgoedbedrijf heeft een concurrent overgenomen die een populaire speelgoedwagen heeft gemaakt. Het speelgoed maakt verbinding met een virtuele machine die wordt gehost in Azure om firmware-updates te ontvangen. Alle resources voor de virtuele machine zijn handmatig gemaakt met behulp van Azure Portal. In deze les begint u met het migreren van de resources naar een Bicep-bestand.

Tijdens het proces voert u de volgende taken uit:

  • Implementeer een nieuwe virtuele machine met behulp van Azure Portal.
  • Exporteer de resources van de virtuele machine naar een JSON-sjabloon.
  • Decompileren van de JSON-sjabloon naar Bicep.
  • Maak een nieuw Bicep-bestand en verplaats de resources van de gedecompileerde sjabloon.

In deze oefening wordt de Bicep-extensie voor Visual Studio Code gebruikt. Zorg ervoor dat u deze extensie installeert in Visual Studio Code.

Een virtuele machine maken met behulp van Azure Portal

Als u de situatie in het voorbeeldscenario wilt simuleren, implementeert u eerst een virtuele machine met behulp van Azure Portal.

  1. Meld u aan bij het Azure-portaal.

  2. Selecteer op de startpagina van Azure onder Azure-services de optie Een resource maken:

    Schermopname van Azure Portal. De optie Een resource maken is gemarkeerd.

    Azure Marketplace wordt weergegeven in het deelvenster Een resource maken.

  3. Selecteer Onder Ubuntu Server 20.04 LTS de optie Maken:

    Schermopname van Azure Marketplace. De koppeling Maken onder Ubuntu Server 20.04 LTS is gemarkeerd.

    Belangrijk

    Als u Ubuntu Server 20.04 LTS niet ziet, gaat u rechtstreeks naar Ubuntu Server 20.04 LTS in Azure Marketplace.

  4. Voer op het tabblad Basisinformatie de volgende waarden in voor elke instelling. Gebruik de standaardinstellingen voor alle andere instellingen.

    Instelling Weergegeven als
    Projectdetails
    Resourcegroep Selecteer Nieuwe maken en voer ToyTruck in
    Exemplaardetails
    Virtual machine name ToyTruckServer
    Regio (VS) VS - west 3
    Beschikbaarheidsopties Er is geen redundantie van de infrastructuur vereist
    Afbeelding Ubuntu Server 20.04 LTS - x64 Gen2
    Tekengrootte Standard_D2s_v3
    Beheerdersaccount
    Authentication type Wachtwoord
    Username toytruckadmin
    Wachtwoord Voer een wachtwoord in
    Regels voor binnenkomende poort
    Openbare poorten voor inkomend verkeer Geen
  5. Controleer op het tabblad Beheer of Automatisch afsluiten inschakelen niet is geselecteerd.

  6. Selecteer Controleren + maken. Azure valideert uw instellingen. Mogelijk moet u meer informatie invoeren of selecteren, afhankelijk van de vereisten voor de installatiekopieën.

  7. Selecteer Maken om de virtuele machine te implementeren en te maken.

    In Azure Portal wordt de implementatie weergegeven terwijl deze wordt uitgevoerd.

  8. Wanneer de implementatie is voltooid, selecteert u de naam van de resourcegroep om de resourcegroep te openen:

    Schermopname van Azure Portal waarin de implementatie wordt weergegeven. De naam van de resourcegroep is gemarkeerd.

    De resourcegroep bevat nu de virtuele machine en de bijbehorende afhankelijkheden:

    Schermopname van Azure Portal waarin de resourcegroep wordt weergegeven.

De inhoud van de resourcegroep exporteren naar een JSON-sjabloon

  1. Selecteer in het linkermenu onder Automation de optie Sjabloon Exporteren:

    Schermopname van Azure Portal met het menu-item Sjabloon exporteren in het deelvenster Resourcegroep.

    Er wordt een JSON-sjabloon gegenereerd. Het kan een paar minuten duren voordat het proces is voltooid.

  2. Selecteer de knop Downloaden :

    Schermopname van Azure Portal met de geëxporteerde JSON-sjabloon voor de resourcegroep, met de knop Downloaden gemarkeerd.

    De JSON-sjabloon en het parameterbestand worden als een .zip-bestand naar uw computer gedownload.

  3. Pak het bestand uit in een map waartoe u eenvoudig toegang hebt, zoals uw bureaublad.

  4. Open Visual Studio Code.

Uw lokale omgeving voorbereiden

  1. Selecteer Nieuwe terminal in het menu Terminal. Het terminalvenster wordt meestal geopend in de onderste helft van het scherm.

  2. Als in het terminalvenster bash aan de rechterkant wordt weergegeven, betekent dit dat de juiste shell al is geopend. Als u ook een bash-shellpictogram aan de rechterkant ziet, kunt u deze selecteren om de shell te starten.

    Schermopname van het Visual Studio Code-terminalvenster, met de bash-optie weergegeven.

    Als een andere shell dan bash wordt weergegeven, selecteert u de vervolgkeuzepijl van de shell en selecteert u Vervolgens Git Bash.

    Schermopname van het Visual Studio Code-terminalvenster, met de vervolgkeuzelijst terminalshell weergegeven en Git Bash Default geselecteerd.

  3. Ga in de terminal naar de map waarin u de sjabloon hebt opgeslagen. Als u de sjabloon bijvoorbeeld hebt opgeslagen in de map sjablonen , kunt u deze opdracht gebruiken:

    cd templates
    

Bicep installeren

Voer de volgende opdracht uit om te controleren of u de nieuwste versie van Bicep hebt:

az bicep install && az bicep upgrade
  1. Selecteer Nieuwe terminal in het menu Terminal. Het terminalvenster wordt meestal geopend in de onderste helft van het scherm.

  2. Als in het terminalvenster pwsh of powershell aan de rechterkant wordt weergegeven, betekent dit dat de juiste shell al is geopend. Als u aan de rechterkant een PowerShell-shellpictogram ziet, kunt u deze optie selecteren om de shell te starten.

    Schermopname van het Visual Studio Code-terminalvenster, met de optie pwsh weergegeven in de vervolgkeuzelijst shell.

    Als een andere shell dan pwsh of powershell wordt weergegeven, selecteert u de vervolgkeuzepijl van de shell en selecteert u Vervolgens PowerShell.

    Schermopname van het Visual Studio Code-terminalvenster, met de vervolgkeuzelijst terminalshell weergegeven en PowerShell geselecteerd.

  3. Ga in de terminal naar de map waarin u de sjabloon hebt opgeslagen. Als u uw sjabloon bijvoorbeeld hebt opgeslagen in de map sjablonen , kunt u deze opdracht gebruiken:

    Set-Location -Path templates
    

Bicep CLI installeren

Als u Bicep wilt gebruiken vanuit Azure PowerShell, installeert u de Bicep CLI.

De JSON-sjabloon decompileren naar Bicep

Gebruik de decompile opdracht om een Bicep-bestand te maken op basis van de sjabloon:

az bicep decompile --file template.json

De decompile-bewerking genereert een waarschuwing die vergelijkbaar is met deze:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Gebruik de decompile opdracht om een Bicep-bestand te maken op basis van de sjabloon:

bicep decompile template.json

De decompile-bewerking genereert een waarschuwing die vergelijkbaar is met deze:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Het ontcompileerde Bicep-bestand inspecteren

Open het bestand template.bicep in Visual Studio Code en lees het door. U ziet dat het een geldig Bicep-bestand is, maar er zijn enkele problemen, waaronder:

  • De symbolische namen die aan parameters en resources worden gegeven, bevatten onderstrepingstekens en zijn niet gemakkelijk te begrijpen.
  • De location eigenschap is vastgelegd in alle resourcedefinities.
  • De sjabloon bevat vastgelegde waarden die parameters moeten zijn of automatisch moeten worden ingesteld door Azure.

U lost deze problemen in de rest van deze module op.

Een nieuw Bicep-bestand maken

  1. Maak in Visual Studio Code een nieuw bestand met de naam main.bicep.

  2. Sla het lege bestand op zodat Visual Studio Code de Bicep-hulpprogramma's laadt.

    U kunt Bestand> selecteren of Ctrl+S selecteren in Windows (⌘+S in macOS).

  3. Splits de editor zodat u beide bestanden tegelijk kunt zien (het bestand template.bicep in het linkerdeelvenster en het bestand main.bicep in het rechterdeelvenster).

    1. Selecteer het tabblad main.bicep .
    2. Selecteer Indeling>splitsen rechts om het tabblad main.bicep in het rechterdeelvenster te openen.
    3. Sluit het tabblad main.bicep in het linkerdeelvenster.

    Schermopname van de gesplitste Visual Studio Code-editor met het bestand dot bicep in het linkerdeelvenster en het belangrijkste dot bicep-bestand in het rechterdeelvenster.

Kopieer elk element naar uw nieuwe Bicep-bestand

  1. Kopieer de resource met de naam networkSecurityGroups_ToyTruckServer_nsg_name_resource van het bestand template.bicep naar het bestand main.bicep .

    Wanneer u deze kopieert, moet u er rekening mee houden dat de securityRules eigenschap leeg is. Verderop in deze module herstructureer u het bestand om redundante eigenschappen te verwijderen.

  2. Visual Studio Code geeft een fout aan omdat de networkSecurityGroups_ToyTruckServer_nsg_name parameter ontbreekt:

    Schermopname van de Visual Studio Code-editor met de gemigreerde resource, met knopinfo die een fout weergeeft vanwege de ontbrekende parameter.

    Kopieer de parameter naar het bestand main.bicep .

  3. Herhaal het proces met de volgende resources en de bijbehorende parameters:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Notitie

    De namen van de resources in uw implementatie kunnen afwijken van de resources die hier worden vermeld. Zoek de resources met namen die zich dicht bij deze namen bevinden.

    Wanneer u elke resource kopieert, inspecteert u de eigenschappen ervan. Verderop in deze module werkt u de eigenschappen en configuratie van elke resource bij om te voldoen aan de best practices van Bicep.

    Tip

    Wanneer u uw eigen sjablonen converteert of exporteert, kunt u de resources bijwerken om de aanbevolen procedures te volgen terwijl u ze kopieert. In deze module werken we de resources afzonderlijk bij om het gemakkelijker te maken om elke fase van het migratieproces te begrijpen.

Controleren op ontbrekende resources

  1. Open in Azure Portal de ToyTruck-resourcegroep .

  2. Bekijk de lijst met resources en vergelijk deze met de lijst met resources in uw Bicep-bestand. U ziet dat de resourcegroep een schijfresource bevat die niet is gedefinieerd als een resource in uw Bicep-bestand:

    Schermopname van Azure Portal waarin de resourcegroep wordt weergegeven, met de schijfresource gemarkeerd.

    Wanneer u met virtuele machines in Bicep werkt, hoeft u de beheerde schijfresource niet expliciet te definiëren. In plaats daarvan definieert u de eigenschappen van de virtuele machine en maakt Azure automatisch de beheerde schijf voor u. In dit voorbeeld hoeft u zich geen zorgen te maken dat de schijfresource niet is gedefinieerd in het Bicep-bestand.

Uw sjabloon controleren

Aan het einde van de migratiefase moet het bestand main.bicep er ongeveer als volgt uitzien:

param virtualNetworks_ToyTruck_vnet_name string = 'ToyTruck-vnet'
param virtualMachines_ToyTruckServer_name string = 'ToyTruckServer'
param networkInterfaces_toytruckserver154_name string = 'toytruckserver154'
param publicIPAddresses_ToyTruckServer_ip_name string = 'ToyTruckServer-ip'
param networkSecurityGroups_ToyTruckServer_nsg_name string = 'ToyTruckServer-nsg'

resource networkSecurityGroups_ToyTruckServer_nsg_name_resource 'Microsoft.Network/networkSecurityGroups@2024-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2024-05-01' = {
  name: publicIPAddresses_ToyTruckServer_ip_name
  location: 'westus3'
  sku: {
    name: 'Standard'
    tier: 'Regional'
  }
  properties: {
    ipAddress: '1.2.3.4'
    publicIPAddressVersion: 'IPv4'
    publicIPAllocationMethod: 'Static'
    idleTimeoutInMinutes: 4
    ipTags: []
  }
}

resource virtualMachines_ToyTruckServer_name_resource 'Microsoft.Compute/virtualMachines@2024-07-01' = {
  name: virtualMachines_ToyTruckServer_name
  location: 'westus3'
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_D2s_v3'
    }
    storageProfile: {
      imageReference: {
        publisher: 'canonical'
        offer: '0001-com-ubuntu-server-focal'
        sku: '20_04-lts-gen2'
        version: 'latest'
      }
      osDisk: {
        osType: 'Linux'
        name: '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81'
        createOption: 'FromImage'
        caching: 'ReadWrite'
        managedDisk: {
          storageAccountType: 'Premium_LRS'
          id: resourceId('Microsoft.Compute/disks', '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81')
        }
        deleteOption: 'Delete'
        diskSizeGB: 30
      }
      dataDisks: []
    }
    osProfile: {
      computerName: virtualMachines_ToyTruckServer_name
      adminUsername: 'toytruckadmin'
      linuxConfiguration: {
        disablePasswordAuthentication: false
        provisionVMAgent: true
        patchSettings: {
          patchMode: 'ImageDefault'
          assessmentMode: 'ImageDefault'
        }
        enableVMAgentPlatformUpdates: false
      }
      secrets: []
      allowExtensionOperations: true
      requireGuestProvisionSignal: true
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterfaces_toytruckserver154_name_resource.id
          properties: {
            deleteOption: 'Detach'
          }
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
      }
    }
  }
}

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

resource virtualNetworks_ToyTruck_vnet_name_default 'Microsoft.Network/virtualNetworks/subnets@2024-05-01' = {
  name: '${virtualNetworks_ToyTruck_vnet_name}/default'
  properties: {
    addressPrefix: '10.0.0.0/24'
    delegations: []
    privateEndpointNetworkPolicies: 'Disabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
  dependsOn: [
    virtualNetworks_ToyTruck_vnet_name_resource
  ]
}

resource networkInterfaces_toytruckserver154_name_resource 'Microsoft.Network/networkInterfaces@2024-05-01' = {
  name: networkInterfaces_toytruckserver154_name
  location: 'westus3'
  kind: 'Regular'
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
        etag: 'W/"6a38849d-bd59-4eae-856e-4909f7ac1fac"'
        type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
        properties: {
          provisioningState: 'Succeeded'
          privateIPAddress: '10.0.0.4'
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            name: 'ToyTruckServer-ip'
            id: publicIPAddresses_ToyTruckServer_ip_name_resource.id
            properties: {
              provisioningState: 'Succeeded'
              resourceGuid: '07079685-0980-4ddf-acc3-3c8797c94b9a'
              publicIPAddressVersion: 'IPv4'
              publicIPAllocationMethod: 'Dynamic'
              idleTimeoutInMinutes: 4
              ipTags: []
              ipConfiguration: {
                id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
              }
              deleteOption: 'Detach'
            }
            type: 'Microsoft.Network/publicIPAddresses'
            sku: {
              name: 'Basic'
              tier: 'Regional'
            }
          }
          subnet: {
            id: virtualNetworks_ToyTruck_vnet_name_default.id
          }
          primary: true
          privateIPAddressVersion: 'IPv4'
        }
      }
    ]
    dnsSettings: {
      dnsServers: []
    }
    enableAcceleratedNetworking: true
    enableIPForwarding: false
    disableTcpStateTracking: false
    networkSecurityGroup: {
      id: networkSecurityGroups_ToyTruckServer_nsg_name_resource.id
    }
    nicType: 'Standard'
  }
}

Notitie

Een paar dingen kunnen verschillen in uw sjabloon, waaronder enkele symbolische namen, API-versies en de IP-adressen. Dat is niet erg. Later in de module lost u enkele van deze verschillen op.

U hebt een eerste Bicep-bestand gemaakt om uw resources weer te geven. Het Bicep-bestand is niet goed gestructureerd en volgt geen aanbevolen procedures. In de volgende les leert u hoe u de kwaliteit van de gemigreerde sjabloon kunt verbeteren.

Tip

Als u een versiebeheersysteem zoals Git gebruikt, is dit een goed moment om uw werk door te voeren.

Nadat u het bestand main.bicep hebt gecontroleerd, sluit u het bestand template.bicep .