Ćwiczenie — konwertowanie i migrowanie zasobów

Ukończone

Ważne

Do wykonania tego ćwiczenia potrzebna jest własna subskrypcja platformy Azure. Ponadto mogą zostać naliczone opłaty. Jeśli nie masz jeszcze subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Twoja firma toy nabyła konkurenta, który stworzył popularną ciężarówkę toy. Zabawki łączą się z maszyną wirtualną hostowaną na platformie Azure w celu otrzymywania aktualizacji oprogramowania układowego. Wszystkie zasoby maszyny wirtualnej zostały utworzone ręcznie przy użyciu witryny Azure Portal. W tej lekcji rozpoczniesz proces migrowania zasobów do pliku Bicep.

Podczas tego procesu wykonasz następujące zadania:

  • Wdróż nową maszynę wirtualną przy użyciu witryny Azure Portal.
  • Wyeksportuj zasoby maszyny wirtualnej do szablonu JSON.
  • Dekompiluj szablon JSON na wartość Bicep.
  • Utwórz nowy plik Bicep i przenieś zasoby z dekompilowanego szablonu.

W tym ćwiczeniu jest używane rozszerzenie Bicep dla programu Visual Studio Code. Pamiętaj, aby zainstalować to rozszerzenie w programie Visual Studio Code.

Tworzenie maszyny wirtualnej przy użyciu witryny Azure Portal

Aby zasymulować sytuację w przykładowym scenariuszu, najpierw wdrożysz maszynę wirtualną przy użyciu witryny Azure Portal.

  1. Zaloguj się w witrynie Azure Portal.

  2. Na stronie głównej platformy Azure w obszarze Usługi platformy Azure wybierz pozycję Utwórz zasób:

    Zrzut ekranu przedstawiający witrynę Azure Portal. Opcja Utwórz zasób jest wyróżniona.

    Witryna Azure Marketplace zostanie wyświetlona w okienku Tworzenie zasobu .

  3. W obszarze Ubuntu Server 20.04 LTS wybierz pozycję Utwórz:

    Zrzut ekranu przedstawiający witrynę Azure Marketplace. Link Utwórz w obszarze Ubuntu Server 20.04 LTS jest wyróżniony.

    Ważne

    Jeśli nie widzisz systemu Ubuntu Server 20.04 LTS, przejdź bezpośrednio do systemu Ubuntu Server 20.04 LTS w witrynie Azure Marketplace.

  4. Na karcie Podstawy wprowadź następujące wartości dla każdego ustawienia. Użyj wartości domyślnych dla wszystkich innych ustawień.

    Ustawienie Wartość
    Szczegóły projektu
    Grupa zasobów Wybierz pozycję Utwórz nowy i wprowadź ciąg ToyTruck
    Szczegóły wystąpienia
    Virtual machine name ToyTruckServer
    Region (Region) (STANY ZJEDNOCZONE) Zachodnie stany USA 3
    Opcje dostępności Nie jest wymagana nadmiarowość infrastruktury
    Obraz Ubuntu Server 20.04 LTS — x64 Gen2
    Rozmiar Standardowa_D2s_v3
    Konto administratora
    Typ uwierzytelniania Hasło
    Username toytruckadmin
    Hasło Wprowadź hasło
    Reguły portów przychodzących
    Publiczne porty ruchu przychodzącego Brak
  5. Na karcie Zarządzanie upewnij się, że opcja Włącz automatyczne zamykanie nie jest zaznaczona.

  6. Wybierz pozycję Przejrzyj i utwórz. Platforma Azure weryfikuje ustawienia. W zależności od wymagań dotyczących obrazu może być konieczne wprowadzenie lub wybranie większej liczby informacji.

  7. Wybierz pozycję Utwórz , aby wdrożyć i utworzyć maszynę wirtualną.

    W witrynie Azure Portal jest wyświetlane wdrożenie, gdy jest ono w toku.

  8. Po zakończeniu wdrażania wybierz nazwę grupy zasobów, aby otworzyć grupę zasobów:

    Zrzut ekranu witryny Azure Portal przedstawiający wdrożenie. Nazwa grupy zasobów jest wyróżniona.

    Grupa zasobów zawiera teraz maszynę wirtualną i jej zależności:

    Zrzut ekranu witryny Azure Portal przedstawiający grupę zasobów.

Eksportowanie zawartości grupy zasobów do szablonu JSON

  1. W menu po lewej stronie w obszarze Automatyzacja wybierz pozycję Eksportuj szablon:

    Zrzut ekranu witryny Azure Portal przedstawiający element menu Eksportuj szablon w okienku grupy zasobów.

    Zostanie wygenerowany szablon JSON. Ukończenie procesu może potrwać minutę lub dwie.

  2. Wybierz przycisk Pobierz:

    Zrzut ekranu witryny Azure Portal przedstawiający wyeksportowany szablon JSON grupy zasobów z wyróżnionym przyciskiem Pobierz.

    Plik szablonu i parametrów JSON jest pobierany na komputer jako plik .zip .

  3. Rozpakuj plik do folderu, do którego można łatwo uzyskać dostęp, na przykład na pulpicie.

  4. Otwórz Visual Studio Code.

Przygotowywanie środowiska lokalnego

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu jest powłoka bash, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Zrzut ekranu przedstawiający okno terminalu programu Visual Studio Code z wyświetloną opcją powłoki Bash.

  3. Jeśli zostanie wyświetlona powłoka inna niż powłoka bash , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję Azure Cloud Shell (Bash).

    Zrzut ekranu przedstawiający okno terminalu programu Visual Studio Code z wyświetloną listą rozwijaną powłoki terminalu i wybraną pozycją Domyślna powłoka Git Bash.

  4. Na liście powłok terminali wybierz pozycję bash.

    Zrzut ekranu przedstawiający okno terminalu programu Visual Studio Code z wybranym terminalem powłoki Bash.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć następującego polecenia:

    cd templates
    

Instalowanie aplikacji Bicep

Uruchom następujące polecenie, aby upewnić się, że masz najnowszą wersję aplikacji Bicep:

az bicep install && az bicep upgrade
  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu to powershell lub pwsh, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Zrzut ekranu przedstawiający okno terminalu programu Visual Studio Code z opcją pwsh wyświetlaną na liście rozwijanej powłoki.

  3. Jeśli zostanie wyświetlona powłoka inna niż powershell lub pwsh , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję PowerShell.

    Zrzut ekranu przedstawiający okno terminalu programu Visual Studio Code z wyświetloną listą rozwijaną powłoki terminalu i wybraną pozycją Programu PowerShell.

  4. Na liście powłok terminali wybierz pozycję powershell lub pwsh.

    Zrzut ekranu przedstawiający okno terminalu programu Visual Studio Code z wybranym terminalem programu PowerShell.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć tego polecenia:

    Set-Location -Path templates
    

Instalowanie interfejsu wiersza polecenia Bicep

Aby użyć aplikacji Bicep z poziomu programu Azure PowerShell, zainstaluj interfejs wiersza polecenia Bicep.

Dekompiluj szablon JSON na wartość Bicep

Użyj polecenia , decompile aby utworzyć plik Bicep na podstawie szablonu:

az bicep decompile --file template.json

Operacja dekompilowania generuje ostrzeżenie podobne do następującego:

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.

Użyj polecenia , decompile aby utworzyć plik Bicep na podstawie szablonu:

bicep decompile template.json

Operacja dekompilowania generuje ostrzeżenie podobne do następującego:

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.

Sprawdzanie dekompilowanego pliku Bicep

Otwórz plik template.bicep w programie Visual Studio Code i przeczytaj go. Zwróć uwagę, że jest to prawidłowy plik Bicep, ale ma kilka problemów, w tym:

  • Nazwy symboliczne, które są podane parametrom i zasobom, zawierają podkreślenia i nie są łatwe do zrozumienia.
  • Właściwość location jest trwale zakodowana we wszystkich definicjach zasobów.
  • Szablon zawiera zakodowane wartości, które powinny być parametrami lub ustawiane automatycznie przez platformę Azure.

Te problemy zostaną rozwiązane w pozostałej części tego modułu.

Tworzenie nowego pliku Bicep

  1. W programie Visual Studio Code utwórz nowy plik o nazwie main.bicep.

  2. Zapisz pusty plik, aby program Visual Studio Code ładował narzędzia Bicep.

    Możesz wybrać pozycję Plik>Zapisz jako lub wybrać Ctrl+S w systemie Windows (⌘+S w systemie macOS).

  3. Podziel edytor, aby zobaczyć oba pliki w tym samym czasie ( plik template.bicep w okienku po lewej stronie i plik main.bicep w okienku po prawej stronie).

    1. Wybierz kartę main.bicep .
    2. Wybierz pozycję Układ edytora widoków>>Podziel z prawej, aby otworzyć kartę main.bicep w okienku po prawej stronie.
    3. Zamknij kartę main.bicep w okienku po lewej stronie.

    Zrzut ekranu przedstawiający podzielony edytor programu Visual Studio Code przedstawiający plik kropki szablonu w okienku po lewej stronie oraz główny plik kropkowy w okienku po prawej stronie.

Skopiuj każdy element do nowego pliku Bicep

  1. Skopiuj zasób o nazwie networkSecurityGroups_ToyTruckServer_nsg_name_resource z pliku template.bicep do pliku main.bicep.

    Podczas kopiowania należy pamiętać, że właściwość jest pusta securityRules . W dalszej części tego modułu z refaktoryzujesz plik, aby usunąć nadmiarowe właściwości.

  2. Program Visual Studio Code wskazuje błąd, ponieważ brakuje parametru networkSecurityGroups_ToyTruckServer_nsg_name :

    Zrzut ekranu edytora programu Visual Studio Code przedstawiający zmigrowany zasób z etykietką narzędzia wyświetlającą błąd z powodu brakującego parametru.

    Skopiuj parametr do pliku main.bicep .

  3. Powtórz proces przy użyciu następujących zasobów i skojarzonych z nimi parametrów:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Uwaga

    Nazwy zasobów we wdrożeniu mogą różnić się od zasobów wymienionych tutaj. Znajdź zasoby, które mają nazwy zbliżone do tych nazw.

    Podczas kopiowania każdego zasobu sprawdź jego właściwości. W dalszej części tego modułu zaktualizujesz właściwości i konfigurację każdego zasobu w celu zachowania zgodności z najlepszymi rozwiązaniami dotyczącymi Bicep.

    Napiwek

    Podczas konwertowania lub eksportowania własnych szablonów możesz zaktualizować zasoby, aby postępować zgodnie z najlepszymi rozwiązaniami podczas ich kopiowania. W tym module zaktualizujemy zasoby oddzielnie, aby ułatwić zrozumienie każdej fazy procesu migracji.

Sprawdzanie brakujących zasobów

  1. W witrynie Azure Portal otwórz grupę zasobów ToyTruck .

  2. Przejrzyj listę zasobów i porównaj ją z listą zasobów w pliku Bicep. Zwróć uwagę, że grupa zasobów zawiera zasób dyskowy , który nie jest zdefiniowany jako element resource w pliku Bicep:

    Zrzut ekranu witryny Azure Portal przedstawiający grupę zasobów z wyróżnionym zasobem dysku.

    Podczas pracy z maszynami wirtualnymi w środowisku Bicep nie trzeba jawnie definiować zasobu dysku zarządzanego. Zamiast tego należy zdefiniować właściwości maszyny wirtualnej, a platforma Azure automatycznie utworzy dysk zarządzany. W tym przykładzie nie trzeba obawiać się, że zasób dysku nie jest zdefiniowany w pliku Bicep.

Weryfikowanie szablonu

Na końcu fazy migracji plik main.bicep powinien wyglądać podobnie do tego przykładu:

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@2022-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2022-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@2022-08-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@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
  }
}

resource virtualNetworks_ToyTruck_vnet_name_default 'Microsoft.Network/virtualNetworks/subnets@2022-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@2022-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'
  }
}

Uwaga

Kilka rzeczy może się różnić w szablonie, w tym niektóre nazwy symboliczne, wersje interfejsu API i adresy IP. Nie przejmuj się tym. Niektóre z tych rozbieżności zostaną rozwiązane w dalszej części modułu.

Utworzono początkowy plik Bicep reprezentujący zasoby. Plik Bicep nie jest dobrze ustrukturyzowany i nie stosuje najlepszych rozwiązań. W następnej lekcji dowiesz się, jak poprawić jakość zmigrowanego szablonu.

Napiwek

Jeśli używasz systemu kontroli wersji, takiego jak Git, dobrym momentem będzie zatwierdzenie pracy.

Po zweryfikowaniu pliku main.bicep zamknij plik template.bicep .