Ćwiczenie — konwertowanie i migrowanie zasobów
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.
Zaloguj się w witrynie Azure Portal.
Na stronie głównej platformy Azure w obszarze Usługi platformy Azure wybierz pozycję Utwórz zasób:
Witryna Azure Marketplace zostanie wyświetlona w okienku Tworzenie zasobu .
W obszarze Ubuntu Server 20.04 LTS wybierz pozycję Utwórz:
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.
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 Na karcie Zarządzanie upewnij się, że opcja Włącz automatyczne zamykanie nie jest zaznaczona.
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.
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.
Po zakończeniu wdrażania wybierz nazwę grupy zasobów, aby otworzyć grupę zasobów:
Grupa zasobów zawiera teraz maszynę wirtualną i jej zależności:
Eksportowanie zawartości grupy zasobów do szablonu JSON
W menu po lewej stronie w obszarze Automatyzacja wybierz pozycję Eksportuj szablon:
Zostanie wygenerowany szablon JSON. Ukończenie procesu może potrwać minutę lub dwie.
Wybierz przycisk Pobierz:
Plik szablonu i parametrów JSON jest pobierany na komputer jako plik .zip .
Rozpakuj plik do folderu, do którego można łatwo uzyskać dostęp, na przykład na pulpicie.
Otwórz Visual Studio Code.
Przygotowywanie środowiska lokalnego
W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.
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.
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).
Na liście powłok terminali wybierz pozycję bash.
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
W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.
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.
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.
Na liście powłok terminali wybierz pozycję powershell lub pwsh.
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
W programie Visual Studio Code utwórz nowy plik o nazwie main.bicep.
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).
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).
- Wybierz kartę main.bicep .
- Wybierz pozycję Układ edytora widoków>>Podziel z prawej, aby otworzyć kartę main.bicep w okienku po prawej stronie.
- Zamknij kartę main.bicep w okienku po lewej stronie.
Skopiuj każdy element do nowego pliku Bicep
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.Program Visual Studio Code wskazuje błąd, ponieważ brakuje parametru
networkSecurityGroups_ToyTruckServer_nsg_name
:Skopiuj parametr do pliku main.bicep .
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
W witrynie Azure Portal otwórz grupę zasobów ToyTruck .
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: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 .