Migracja maszyn wirtualnych w Microsoft Azure między sieciami 1


W ostatnim czasie przyszło mi przenieść kilka maszyn wirtualnych w Microsoft Azure między dwiema sieciami wirtualnymi.
W chwili obecnej jedynym sposobem na wykonanie tej czynności jest usunięcie maszyny wirtualnej i jej ponowne utworzenie w docelowej sieci.
Sprawa wydaje się być prosta, jeśli jednak nasza maszyna wirtualna utworzona jest w ramach Azure Resource Manager (ARM) nie obędzie się bez edycji szablonów JSON opisujących konfigurację naszej maszyny.

Poniżej prezentuję mój sposób na przeprowadzenie tej operacji.

Środowisko testowe

Aby odwzorować przybliżone środowisko produkcyjne przygotowałem środowisko testowe.

Składa się ono z czterech grup zasobów (Resource Groups) zawierających następujące zasoby:

  • 1 maszyna wirtualna wraz z jej konfiguracją (karta sieciowa, publiczny adres IP, reguła NSG)
  • 2 sieci wirtualne
  • 1 konto storage

Grupy zasobów

W ramach środowiska testowego powstały 4 logiczne byty odpowiadające funkcjom zasobów w nich się znajdujących:

2016-07-24_20-55-04.png

NewNetwork oraz OldNetwork zawierają sieci wirtualne o nazwach odpowiednio NewNetwork i OldNetwork.

Storage – tu znajduje się konto storage o nazwie ewteststorage w którym znajdują się dyski maszyny wirtualnej.

W VirtualMachines znajduje się maszyna wirtualna z zainstalowanym Windows Server 2012 R2 o nazwie testvm.

Konfiguracja maszyny wirtualnej

Maszyna wirtualna została wdrożona ze standardowego szablonu Windows Server 2012 R2 w rozmiarze DS2 v2.

Dyski

Do maszyny dodałem 4 dyski danych o nazwach testvm-disk(01,02,03,04). A następnie z poziomu systemu operacyjnego skonfigurowałem z nich jeden dysk przy pomocy StorageSpaces.

2016-07-24_22-08-39

2016-07-24_22-12-36

Sieć

Maszyna wirtualna ma jedną kartę sieciową wpiętą do sieci OldNetwork.

2016-07-24_22-43-59

Konfiguracja docelowa

Przeniesienie maszyny wirtualnej (jej karty sieciowej) do sieci NewNetwork z zachowaniem dotychczasowej konfiguracji.

Eksport konfiguracji

Aby bezpiecznie odtworzyć maszynę wirtualną z taką samą konfiguracją jak przed usunięciem musimy wyeksportować jej konfigurację. Z poziomu portalu (portal.azure.com) wykonuje się to w następujących krokach:

1. Należy kliknąć na pożądaną grupę zasobów.
2. Następnie kliknąć na maszynę wirtualną, którą chcemy przenieść między sieciami.

2016-07-24_22-18-58

3. W Settings maszyny wirtualnej należy wybrać na samym dole Automation script.

2016-07-24_22-23-37

4. A następnie pobrać skrypt zapisując go w ulubionej lokalizacji klikając na Download.

2016-07-24_22-23-53

Przygotowanie szablonu

Następnym krokiem jest odpowiednie przygotowanie szablonu JSON do ponownego jego wykorzystania.

Budowa szablonu

Szablon JSON opisujących konfigurację Azure Resource Manager składa się z sześciu elementów: $schema, contentVersion arameters, Variables, Resources Outputs.

  • $schema – element wymagany. Zawiera opis schematu pliku JSON. Podaje się go w postaci adresu URL.
  • conventVersion – element wymagany. Podajemy w nim wersję szablonu na którym pracujemy.
  • Parameters – element niewymagany. Zawierajazmienne parametry wejściowe do konkretnego szablonu np. nazwa maszyny wirtualnej czy np. hasło administratora.
  • Variables – element niewymagany.  Zbiór statycznych zmiennych wykorzystywanych w ramach szablonu. Można w nich umieścić np. rozmiar maszyny wirtualnej jaka ma zostać utworzona.
  • Resources – element wymagany. Najbardziej rozbudowana przestrzeń szablonu JSON. Znajdują się w niej konfiguracje poszczególnych zasobów jak np. maszyny wirtualne, sieci wirtualne czy konta storage.
  • Outputs – element niewymagany. W tym obszarze zwracane są wyniki wdrożenia (jeśli je zdefiniujemy).

Programy do edycji szablonu

Po pobraniu pliku ZIP i jego rozpakowaniu w katalogu znajdziemy sześć plików. Do przeniesienia maszyny wirtualnej potrzebny nam będzie jeden o nazwie template.json.

Szablony JSON moim zdaniem najwygodniej edytować jest z poziomu programu Visual Studio. Do prywatnego użytku wystarczy w zupełności wersja Community.

Innym bardzo wygodnym programem do edycji szablonów ARM jest Visual Studio Code z doinstalowanym rozszerzeniem o nazwie armsnippet.

Edycja szablonu

Przyszedł czas na właściwą edycję szablonu ARM.
Składa się on z etapów:

  1. Usunięcie zbędnych parametrów i odwołań do nich.
  2. Zamiana Parameters na Variables.
  3. Zmiana odwołań do Paramaters na Variables.
  4. Zmiana docelowej sieci.
  5. Zmiana konfiguracji maszyny wirtualnej.
  6. Zmiana konfiguracji interfejsu sieciowego.
1. Usunięcie zbędnych parametrów

Po otworzeniu pliku template.json po raz pierwszy plik w moim przypadku wygląda następująco:

Jako, że naszą maszynę wirtualną będziemy tworzyć na podstawie istniejącego już dysku systemowego, to nie potrzebujemy np. definiować ponownie hasła użytkownika (oczywiście jeśli chcemy wykorzystać to samo hasło). Zatem można spokojnie usunąć parametr virtualMachines_testvm_adminPassword.
Nie potrzebujemy również parametru virtualMachines_testvm_primary – nie jest on wymagany przy definiowaniu parametrów interfejsu sieciowego.

Zatem po usunięciu tychże parametrów pozostają nam parametry:

“virtualMachines_testvm_name”
“networkInterfaces_testvm33_name”
“networkSecurityGroups_testvm_name”
“publicIPAddresses_testvm_name”
“networkInterfaces_testvm33_id”

Zamiana Parameters na Variables

Gdy już oczyściliśmy szablon z niepotrzebnych parametrów należy je teraz zamienić na zmienne. Wycinamy więc Parameters i przenosimy je do Variables. Następnie trzeba nieco poprawić frazę, gdyż różni się ona nieznacznie od tej przy parametrach.
Dla przykładu zapis:

należy mienić na:

I tak należy poprawić wszystkie wpisy Variables.

Zmiana odwołań do Paramaters na Variables

Wyjściowo zasoby (Resources) w naszym szablonie mają odwołania do parametrów np. w przypadku karty sieciowej wygląda to następująco:

“type”: “Microsoft.Network/networkInterfaces”,
“name”: “[parameters(‘networkInterfaces_testvm33_name’)]”,

Co oznacza, że nazwa karty sieciowej będzie generowana na podstawie parametru wejściowego o nazwie networkInterfaces_testvm33_name. Musimy zatem zmienić słowo parameters na variables. Można użyć opcji “zamień wszytko” (Ctrl+h) a następnie zmienić pierwszy wyraz variables na parameters.

“zamień wszystko” zamieni również słowo definiujące blok parametrów, dlatego trzeba je ponownie zapisać jako Parameters.

Zmiana docelowej sieci

Przyszedł wreszcie czas na zmianę docelowej sieci naszej nowej maszyny wirtualnej. Zmiana jest niezwykle prosta i polega na zmianie (w tym przypadku) dwóch wyrazów.
Odszukujemy w zmiennych zmienną o nazwie networkInterfaces_testvm33_id i zamieniamy OldNetwork na NewNetwork. W mojej konfiguracji te dwie sieci znajdują się w różnych grupach zasobów dlatego należy pamiętać też o zmianie nazwy tej grupy.

Oryginalny zapis:

“networkInterfaces_testvm33_id”: “/subscriptions/ID-SUBSKRYPCJI-Azure/resourceGroups/OldNetwork/providers/Microsoft.Network/virtualNetworks/OldNetwork/subnets/default”

Zamieniamy na:

“networkInterfaces_testvm33_id”: “/subscriptions/ID-SUBSKRYPCJI-Azure/resourceGroups/NewNetwork/providers/Microsoft.Network/virtualNetworks/NewNetwork/subnets/default”

I to już prawie wszystko. Należy jeszcze tylko poprawić nieco konfigurację samej maszyny wirtualnej.

Zmiana konfiguracji maszyny wirtualnej

W pierwszej kolejności warto zmienić konfigurację dotyczącą dysków twardych.

Referencja do obrazu systemu nie będzie nam potrzebna (pkt. 1) ponieważ tworzyć maszynę będziemy z gotowego dysku. Usuwamy cały blok imageReference. Następnie w punktach 2 oraz 3 zmieniamy creationOption na Attach aby wskazać naszemu szablonowi aby podpiął odpowiednie dyski w odpowiedniej kolejności (wartość “lun”). W punkcie 4 musimy usunąć całą wartość diskSizeGB gdyż dyski są już gotowe w odpowiednim rozmiarze.

Dodatkowo musimy wskazać jaki system znajduje się na dysku systemowym który będziemy wykorzystywać. Robi się to poprzez wartość “osType”: “Windows”, w bloku osDisk:

Ostatnim etapem oczyszczania konfiguracji maszyny wirtualnej jest usunięcie bloku osProfile oraz odwołań do usuniętych Parameters. Na szczęście znajdują się one obok siebie:

Po oczyszczaniu:

Zmiana konfiguracji interfejsu sieciowego

Ostatnim etapem przygotowywania naszego szablonu jest jeszcze mała zmiana w konfiguracji interfejsu sieciowego. Przy eksporcie zapisywany jest prywatny adres IP maszyny wirtualnej. Musimy go usunąć gdyż w nowej sieci będzie inna adresacja. Możemy też ustawić nowy, docelowy adres IP właściwy dla nowej sieci. Ja wybiorę ten drugi sposób.

Przed zmianą:

Po zmianie:

Uff… to już koniec przygotowywania szablonu do wdrożenia.

Usunięcie maszyny wirtualnej

Teraz należy usunąć maszynę wirtualną pozostawiając pozostałe zasoby (domyślnie tak się dzieje).

Utworzenie nowej maszyny

Teraz pozostaje już tylko utworzyć nową maszynę wirtualną.

W tym celu należy:

  1. Kliknąć New.
  2. W polu wyszukiwania wpisać Template Deployment i nacisnąć ENTER.
  3. Wybrać odpowiednią pozycję z wyświetlonej listy.
  4. A następnie kliknąć Create.

W otwartym widoku klikamy na Edit template (1) i edytowalne okno wklejamy (2) nasz przygotowany kod szablonu ARM a następnie klikamy Save (3).

Następnie musimy wskazać istniejącą już grupę zasobów w której chcemy utworzyć naszą maszynę wirtualną a w dalszej kolejności zaakceptować Legal terms i ostatecznie kliknąć Create.

Po kilku minutach maszyna wirtualna zostanie utworzona.

A tak wygląda po zakończonym wdrożeniu:

Jak widać konfiguracja StorageSpaces nie uległa zmianie, dane zostały zachowane. Zmienił się jedynie prywatny oraz publiczny adres IP maszyny wirtualnej.

To tyle jeśli chodzi o przenoszenie maszyn wirtualnych w Microsoft Azure między sieciami. W razie pytań zachęcam do komentowania.

It's only fair to share...Share on Facebook11Share on Google+0Tweet about this on TwitterShare on LinkedIn2
  • atm23

    Hej,
    Fajny artykuł. Próbuję wejść w azure ale dopiero zaczynam. Stąd mam do Ciebie pytanie. Jeśli w złym miejscu to sorry. Próbuję wycenić koszt jednej VM z systemem Red Hat Enterprise 7.2. W kreatorze widzę cenę za maszynkę ale doczytałem, że płaci się także za obraz systemu. Dodatkowo muszę dodać opłaty za adresy IP jak rozumiem? Możesz mi podesłać jakiegoś linka albo w prostych słowach wytłumaczyć jakie są składowe ceny za taką konfigurację? Dodatkowo ta VM będzie mieć 4 interfejsy sieciowe, z tego co czytałem będę musiał zastosować jakiś duży (i drogi) rozmiar? Czy może da się to jakoś obejść? Wymagana wydajność to 8 core i ok. 10-14 GB RAM.
    będę wdzięczny za podpowiedź