Cvičení – převod a migrace prostředků

Dokončeno

Důležité

K provedení tohoto cvičení potřebujete vlastní předplatné Azure a mohou se vám účtovat poplatky. Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet, než začnete.

Vaše toy společnost získala konkurenta, který vytvořil populární toy truck. Hračky se připojují k virtuálnímu počítači hostovaným v Azure, aby dostávaly aktualizace firmwaru. Všechny prostředky pro virtuální počítač byly vytvořeny ručně pomocí webu Azure Portal. V této lekci zahájíte proces migrace prostředků do souboru Bicep.

Během tohoto procesu provedete následující úlohy:

  • Nasaďte nový virtuální počítač pomocí webu Azure Portal.
  • Exportujte prostředky virtuálního počítače do šablony JSON.
  • Dekompilujte šablonu JSON do Bicep.
  • Vytvořte nový soubor Bicep a přesuňte prostředky z dekompilované šablony.

V tomto cvičení se používá rozšíření Bicep pro Visual Studio Code. Nezapomeňte toto rozšíření do Visual Studio Codu nainstalovat.

Vytvoření virtuálního počítače pomocí webu Azure Portal

K simulaci situace v ukázkovém scénáři nejprve nasadíte virtuální počítač pomocí webu Azure Portal.

  1. Přihlaste se k portálu Azure.

  2. Na domovské stránce Azure v části Služby Azure vyberte Vytvořit prostředek:

    Snímek obrazovky s webem Azure Portal Je zvýrazněná možnost Vytvořit prostředek.

    Azure Marketplace se zobrazí v podokně Vytvořit prostředek .

  3. V části Ubuntu Server 20.04 LTS vyberte Vytvořit:

    Snímek obrazovky znázorňující Azure Marketplace Odkaz Vytvořit v části Ubuntu Server 20.04 LTS je zvýrazněný.

    Důležité

    Pokud ubuntu Server 20.04 LTS nevidíte, přejděte přímo na Ubuntu Server 20.04 LTS na Azure Marketplace.

  4. Na kartě Základy zadejte pro každé nastavení následující hodnoty. Pro všechna ostatní nastavení použijte výchozí hodnoty.

    Nastavení Hodnota
    Podrobnosti projektu
    Skupina prostředků Vyberte Vytvořit nový a zadejte ToyTruck.
    Podrobnosti o instanci
    Virtual machine name ToyTruckServer
    Oblast (USA) USA – západ 3
    Možnosti dostupnosti Není potřeba žádná redundance infrastruktury.
    Image Ubuntu Server 20.04 LTS – x64 Gen2
    Velikost Standard_D2s_v3
    Účet správce
    Authentication type Heslo
    Username toytruckadmin
    Heslo Zadejte heslo.
    Pravidla portů pro příchozí spojení
    Veřejné příchozí porty Nic
  5. Na kartě Správa se ujistěte, že není zaškrtnuté políčko Povolit automatické vypnutí.

  6. Vyberte Zkontrolovat a vytvořit. Azure ověří vaše nastavení. V závislosti na požadavcích na image možná budete muset zadat nebo vybrat další informace.

  7. Vyberte Vytvořit , abyste nasadíte a vytvořili virtuální počítač.

    Na webu Azure Portal se během probíhajícího nasazení zobrazuje.

  8. Po dokončení nasazení otevřete skupinu prostředků výběrem názvu skupiny prostředků:

    Snímek obrazovky webu Azure Portal znázorňující nasazení Název skupiny prostředků je zvýrazněný.

    Skupina prostředků teď obsahuje virtuální počítač a jeho závislosti:

    Snímek obrazovky webu Azure Portal zobrazící skupinu prostředků

Export obsahu skupiny prostředků do šablony JSON

  1. V nabídce vlevo v části Automatizace vyberte Exportovat šablonu:

    Snímek obrazovky webu Azure Portal znázorňující položku nabídky Exportovat šablonu v podokně skupiny prostředků

    Vygeneruje se šablona JSON. Dokončení procesu může trvat minutu nebo dvě.

  2. Vyberte tlačítko Stáhnout:

    Snímek obrazovky webu Azure Portal znázorňující exportovanou šablonu JSON skupiny prostředků se zvýrazněným tlačítkem Stáhnout

    Šablona JSON a soubor parametrů se stáhnou do počítače jako soubor .zip .

  3. Rozbalte soubor do složky, ke které máte snadný přístup, jako je plocha.

  4. Otevřete Visual Studio Code.

Příprava místního prostředí

  1. V nabídce Terminal (Terminál) vyberte New Terminal (Nový terminál). Okno terminálu se obvykle otevře v dolní polovině obrazovky.

  2. Pokud se v okně terminálu zobrazí bash na pravé straně, znamená to, že správné prostředí je už otevřené. Pokud se na pravé straně zobrazí ikona prostředí Bash, můžete ho vybrat a spustit prostředí.

    Snímek obrazovky okna terminálu editoru Visual Studio Code se zobrazenou možností Bash

    Pokud se zobrazí jiné prostředí než Bash, vyberte šipku rozevíracího seznamu prostředí a pak vyberte Git Bash.

    Snímek obrazovky okna terminálu editoru Visual Studio Code s rozevíracím seznamem prostředí terminálu a vybranou možností Výchozí git Bash

  3. V terminálu přejděte do adresáře, do kterého jste šablonu uložili. Pokud jste například šablonu uložili do složky templates , můžete použít tento příkaz:

    cd templates
    

Instalace Bicep

Spuštěním následujícího příkazu se ujistěte, že máte nejnovější verzi Bicep:

az bicep install && az bicep upgrade
  1. V nabídce Terminal (Terminál) vyberte New Terminal (Nový terminál). Okno terminálu se obvykle otevře v dolní polovině obrazovky.

  2. Pokud se v okně terminálu na pravé straně zobrazí pwsh nebo PowerShell , znamená to, že správné prostředí je už otevřené. Pokud se na pravé straně zobrazí ikona prostředí PowerShell, můžete ho vybrat a spustit prostředí.

    Snímek obrazovky okna terminálu editoru Visual Studio Code s možností pwsh zobrazenou v rozevíracím seznamu prostředí

    Pokud se zobrazí jiné prostředí než pwsh nebo PowerShell, vyberte šipku rozevíracího seznamu prostředí a pak vyberte PowerShell.

    Snímek obrazovky okna terminálu editoru Visual Studio Code se zobrazeným rozevíracím seznamem prostředí terminálu a vybranou možností PowerShellu

  3. V terminálu přejděte do adresáře, do kterého jste šablonu uložili. Pokud jste například šablonu uložili do složky templates , můžete použít tento příkaz:

    Set-Location -Path templates
    

Instalace rozhraní příkazového řádku Bicep

Pokud chcete použít Bicep z Azure PowerShellu, nainstalujte rozhraní příkazového řádku Bicep.

Dekompilujte šablonu JSON do Bicep.

decompile Pomocí příkazu vytvořte ze šablony soubor Bicep:

az bicep decompile --file template.json

Operace dekompilu generuje upozornění podobné tomuto:

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.

decompile Pomocí příkazu vytvořte ze šablony soubor Bicep:

bicep decompile template.json

Operace dekompilu generuje upozornění podobné tomuto:

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.

Kontrola dekompilovaného souboru Bicep

Otevřete soubor template.bicep v editoru Visual Studio Code a přečtěte si ho. Všimněte si, že se jedná o platný soubor Bicep, ale má několik problémů, mezi které patří:

  • Symbolické názvy, které jsou dány parametrům a prostředkům, obsahují podtržítka a nejsou snadno pochopitelné.
  • Vlastnost location je pevně zakódovaná ve všech definicích prostředků.
  • Šablona obsahuje pevně zakódované hodnoty, které by měly být parametry nebo automaticky nastavené v Azure.

Tyto problémy vyřešíte ve zbytku tohoto modulu.

Vytvoření nového souboru Bicep

  1. V editoru Visual Studio Code vytvořte nový soubor s názvem main.bicep.

  2. Uložte prázdný soubor tak, aby Visual Studio Code načítal nástroje Bicep.

    Můžete vybrat možnost >Uložit soubor jako nebo vybrat Kombinaci kláves Ctrl+S ve Windows (⌘+S v macOS).

  3. Rozdělte editor tak, abyste viděli oba soubory současně ( soubor template.bicep v levém podokně a soubor main.bicep v pravém podokně).

    1. Vyberte kartu main.bicep.
    2. Výběrem možnosti Zobrazit>rozložení editoru>Rozdělit vpravo otevřete kartu main.bicep v pravém podokně.
    3. Zavřete kartu main.bicep v levém podokně.

    Snímek obrazovky s rozděleným editorem editoru Visual Studio Code, který zobrazuje soubor s tečkou bicep šablony v levém podokně a hlavním souborem bicep v pravém podokně

Zkopírování každého prvku do nového souboru Bicep

  1. Zkopírujte prostředek pojmenovaný ze souboru template.bicep do networkSecurityGroups_ToyTruckServer_nsg_name_resource.

    Při kopírování si všimněte, že securityRules vlastnost je prázdná. Později v tomto modulu refaktorujete soubor tak, aby odebral redundantní vlastnosti.

  2. Visual Studio Code označuje chybu, protože networkSecurityGroups_ToyTruckServer_nsg_name parametr chybí:

    Snímek obrazovky editoru Visual Studio Code, který zobrazuje migrovaný prostředek s popisem, který zobrazuje chybu kvůli chybějícímu parametru

    Zkopírujte parametr do souboru main.bicep .

  3. Opakujte proces s následujícími prostředky a jejich přidruženými parametry:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Poznámka:

    Názvy prostředků ve vašem nasazení se můžou lišit od zde uvedených prostředků. Vyhledejte prostředky, které mají názvy, které jsou blízko těmto názvům.

    Při kopírování jednotlivých prostředků zkontrolujte její vlastnosti. Později v tomto modulu aktualizujete vlastnosti a konfiguraci jednotlivých prostředků tak, aby odpovídaly osvědčeným postupům Bicep.

    Tip

    Při převodu nebo exportu vlastních šablon můžete aktualizovat prostředky tak, aby při kopírování dodržovaly osvědčené postupy. V tomto modulu aktualizujeme prostředky samostatně, abychom usnadnili pochopení jednotlivých fází procesu migrace.

Kontrola chybějících prostředků

  1. Na webu Azure Portal otevřete skupinu prostředků ToyTruck .

  2. Prohlédněte si seznam prostředků a porovnejte ho se seznamem prostředků v souboru Bicep. Všimněte si, že skupina prostředků obsahuje prostředek disku , který není definovaný jako resource v souboru Bicep:

    Snímek obrazovky webu Azure Portal zobrazící skupinu prostředků se zvýrazněným prostředkem disku

    Při práci s virtuálními počítači v Bicep nemusíte explicitně definovat prostředek spravovaného disku. Místo toho definujete vlastnosti virtuálního počítače a Azure automaticky vytvoří spravovaný disk. V tomto příkladu se nemusíte zabývat tím, že prostředek disku není definován v souboru Bicep.

Ověření šablony

Na konci fáze migrace by měl soubor main.bicep vypadat podobně jako v tomto příkladu:

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

Poznámka:

V šabloně se může lišit několik věcí, včetně některých symbolických názvů, verzí rozhraní API a IP adres. To je v pořádku. Některé z těchto nesrovnalostí vyřešíte později v modulu.

Vytvořili jste počáteční soubor Bicep, který bude představovat vaše prostředky. Soubor Bicep není dobře strukturovaný a nedodržuje osvědčené postupy. V další lekci se dozvíte, jak zlepšit kvalitu migrované šablony.

Tip

Pokud používáte systém správy verzí, jako je Git, je vhodná doba k potvrzení vaší práce.

Po ověření souboru main.bicep zavřete soubor template.bicep .