Strona Główna / Blog

Przygotowanie infrastruktury pod szkolenia/hackathony

Michał Dzierżak

Michał Dzierżak

Senior Cloud Architect w Chmurowisko. 15 lat doświadczenia w IT, w tym m.in. w firmach takich jak Microsoft czy Siemens. Przez 2 lata Główny Architekt w jednej z największych spółek Skarbu Państwa, obecnie pomaga klientom implementować Azure zgodnie z najlepszymi praktykami.

W zeszłym roku zostaliśmy zaproszeni do udziału w ogólnopolskim hackatonie jako wsparcie techniczne. Naszym zadaniem było dostarczenie infrastruktury technicznej uruchomionej w Azure na każdy z 6 eventów. Gromadziły one 40-50 osób. Założenie było takie, że każdy z uczestników może sobie wybrać do pracy maszyną wirtualną według przygotowanego wzorca. Wyzwaniem było jak najsprawniejsze uruchomienie infrastruktury bez poświęcania zbytnio dużo czasu. Dodatkowo aby nie naliczać zbędnych kosztów musieliśmy szybko usuwać wszystkie zasoby po zakończonej imprezie.

Tak stworzona infrastruktura może być użyteczna też przy prowadzeniu szkoleń, gdzie każdy uczestnik potrzebuje własnego środowiska w chmurze Microsoft Azure.

Proces

Cały proces można opisać zgodnie z poniższym rysunkiem:

Jest użytkownik, który wnioskuje o zasoby za pomocą formularza osadzonego w aplikacji internetowej. Następnie dane z formularza służą do uruchomienia procesu wdrażania zasobów w Azure i po chwili użytkownik ma możliwość korzystania z przygotowanej według jednego wspólnego wzorca infrastruktury. 

Z pomocą przyszły dwie ciekawe technologie dostarczone przez firmę Microsoft:

1.      Microsoft Office Forms (https://forms.office.com/), za pomocą której opracujemy prosty formularz do wprowadzania danych

2.      Azure Logic Apps (https://azure.microsoft.com/pl-pl/services/logic-apps/), za pomocą której wdrożymy zasoby na podstawie podanych przez użytkownika danych oraz przygotowanych szablonów Azure Resource Manager

Microsoft Office Forms

Bardzo proste rozwiązanie umożliwiające tworzenie szybkich formularzy bez znajomości jakiegokolwiek języka programowania. Użytkownik za pomocą myszki po prostu projektuje formularz wskazując odpowiednie pola i właściwości.

W trakcie przygotowań do pierwszej z imprez wyszło nam, że użytkownik powinien podać cztery parametry, aby infrastruktura została automatycznie utworzona. Absolutne minimum, które trzeb uzyskać od użytkownika to:

1.      Nazwa konta administratora dla tworzonej maszyny wirtualnej.

2.      Hasło do konta.

3.      Rodzaj maszyny wirtualnej. Organizator przedstawił na 6 rodzajów maszyn do wyboru. Na potrzeby niniejszego artykułu ograniczymy się tylko do dwóch.

4.      Grupa zasobów w której maszyna wirtualna ma zostać wdrożona. Grupy odpowiadały grupom na jakiej byli podzieleni uczestnicy.

Tak jak wspomniałem na początku tworzenie formularzy jest bardzo proste. Zaczynamy od utworzenia nowego formularza:

Klikając na Nowy fomularz system przeniesie nas do widoku pustego formularza:

Pierwszy krok zmiana tytułu formularza na bardziej przyjazny dla potencjalnego użytkownika np.Tworzenie Maszyn Wirtualnych, można też dodać krótki opis do czego taki formularz ma służyć. Aby zmienić tytuł formularza należy kliknąć w pole Formularz bez tytułu:

Co jest ważne to, że wszystkie zmiany do fomularza, zapisywane są automatycznie.

Teraz dodać trzeba pola, które nasz użytkownik powinien wypełnić. Robi się to poprzez kliknięcie w przycisk Dodaj nowy, do wyboru będziemy mieli kilka typów:

Na nasze potrzeby skorzystamy z typu Wybór i Tekst.

Pierwszym polem jakie dodamy będzie pole Nazwa użytkownika, które będzie typu Tekst i będzie wymagane do podania przez użytkownika. Generalnie to wszystkie pola będą wymagane.

Kolejnym polem będzie Hasło użytkownika, które też będzie typu Tekst.

Pola Wybór użyjemy do wybrania przez użytkownika rodzaju maszyny wirtualnej oraz grupy zasobów.

Uwaga! Format wprowadzonych opcji jest bardzo ważny. Każda za podanych opcji powinna zaczynać się kolejnym numerem oddzielonym od reszty znakiem | (pipe). Jest to bardzo ważne aby później zadziałały nam odpowiednie mechanizmy w ramach usługi Logic Apps.

Uwaga! Nazwy grup mogą być dowolne. Należy jedynie zapewnić aby w ramach wirtualnej sieci Azure (VNet) były zdefiniowane podsieci o takich samych nazwach co nazwy grup. Pozostawiam to czytelnikowi do sprawdzenia i zrobienia.

Ostatnią ważną, rzeczą podczas projektowania formularza jest udostępnienie go wszystkim użytkownikom a nie tylko osobom z organizacji w ramach której tworzony jest ten formularz. Robi się to poprzez Ustawienia formularza.

To wszystko, formularz jest gotowy i wystarczy go udostępnić użytkownikom. Należy wybrać przycisk Udostępnij, dostaniemy wtedy możliwość skopiowania unikalnego linku, który następnie można rozesłać do użytkowników.

Azure Logic Apps

Następnym krokiem jest przygotowanie logiki, która umożliwi wykonanie następujących czynności:

1.      Odebranie danych z formularza

2.      Weryfikacja czy podano prawidłowe dane dla wnioskowanej maszyny wirtualnej

3.      Przygotowanie parametrów dla szablonu Azure Resource Manager

4.      Wywołanie funkcji wdrożenia szablonu we wskazanej grupie zasobów

5.      Aktualizacja w bazie danych informacji o wdrożonej maszynie wirtualnej lub zapisanie błędu jeżeli coś poszłoby nie tak.

Wyżej opisane kroki można zrealizować korzystając z usługi Azure Logic Apps. Zanim zaczniemy korzystać z usługi należy utworzyć wirtualną sieć (VNet), np. o nazwie Shared-Vnet, która będzie używana przez utworzone maszyny wirtualne. W ramach wirtualnej sieci powinny zostać utworzone podsieci o takich samych nazwach co grupy zasobów wybierane przez użytkowników. Dodatkowo należy utworzyć Azure Storage, który będzie używany do przechowywania szablonów Azure Resource Manager oraz informacji o utworzonych maszynach wirtualnych i błędach, które miały miejsce podczas ich tworzenia. W ramach usługi Azure Storage należy utworzyć następujące elementy:

1.      Blob Container o nazwie templates, z publicznym dostępem do poszczególnych Blob-ów pełniący funkcję kontenera szablonów

2.      Tabela o nazwie logs do zapisywania ewentualnych błędów

3.      Tabela o nazwie machines do zapisywania informacji o utworzonych maszynach wirtualnych

Po utworzeniu usługi Logic Apps i wyświetleniu jej w portalu Azure mamy możliwość rozpoczęcia pracy korzystając z popularnych szablonów lub wyzwalaczy. Na nasze potrzeby należy wybrać Blank Logic App. Umożliwi nam to utworzenie procesu od samego początku krok po kroku.

Po utworzeniu pustego procesu zostaniemy przekierowani do Logic app designer gdzie można za pomocą edytora graficznego zaprojektować cały proces. Ponieważ wybraliśmy utworzenie pustego procesu to na początku wybieramy wyzwalacz, za pomocą którego będziemy wywoływać proces automatycznego tworzenia zasobów. W naszym przypadku jest to łącznik (ang. Connector) o nazwie Microsoft Forms.

Łącznik Microsoft Forms dostarcza wyzwalacz When a new response is submitted, który jest wywoływany w momencie wysłania formularza przez użytkownika.

Łącznik wymaga uwierzytelnienia aby móc pobierać informacje z usługi Office Forms. W tym celu logujemy się za pomocą użytkownika, który ma uprawnienia do odczytywania informacji z wprowadzonych formularzy.

Następnie wskazujemy utworzony wcześniej formularz oraz zmieniamy ustawienia akcji

Ciekawą funkcją Logic App jest możliwość zdefiniowania parametrów, które można zmieniać bez konieczności modyfikowania procesu. Unikamy wtedy wpisywania „na sztywno” wartości, które są stałe, ale mogą się zmienić jeżeli zajdzie taka potrzeba. Na potrzeby procesu zdefiniujemy 5 parametrów:

ParametrOpisDomyślna wartość
azureLocationRegion w którym mają być tworzone zasobyWest Europe
azureSubscriptionIdentyfikator subskrypcji w której będą tworzone zasoby 
templatesUrlURL do kontenera szablonów templateshttps://<storage>.blob.core.windows.net/templates/
virtualNetworkNameNazwa wirtualnej sieci (VNet) używanej przez tworzone maszyny wirtualneShared-Vnet
virtualNetworkResourceGroupNazwa grupy zasobów, w której znajduje się wirtualna sieć zdefiniowana przez parametrvirtualNetworkNameResourceAutomation

W projektancie klikamy Parameters i pojawi się okno, w którym można wprowadzić wyżej wymienione parametry.

Kolejnym krokiem jest przygotowanie pliku konfiguracyjnego w formacie JSON, w którym będą zdefiniowane parametry maszyn wirtualnych. Plik ten należy wgrać do kontenera szablonów Templatespod dowolną nazwą np. machines.json. Poniżej przykładowa zawartość pliku machines.json:

Plik machine.json definiuje tablicę obiektów, każdy z obiektów określa definicję maszyny wirtualnej.

W poniższej tabeli przedstawiony jest opis poszczególnych pól:

PoleOpis
DescriptionOpis charakteryzujący daną maszynę wirtualną
OSGeneryczny typ systemu operacyjnego instalowanego na maszynie wirtualnej. Dopuszczalne wartości: windows / linux
TypeWartość opisująca instalowany system operacyjny w postaci jednego słowa np. WinOs – oznacza czysty system Windows, WinWithVsOs – oznacza Windows z preinstalowanym Visual Studio, LinuxOs – oznacza czysty system Linux
TemplateNazwa szablonu Azure Resource Manager użytego do utworzenia maszyny wirtualnej
VmSizeRozmiar maszyny wirtualnej np.. Standard_D4_v3
ImageReferenceObiekt opisujący obraz systemowego dysku użytego podczas tworzenia maszyny wirtualnej

Uwaga! Kolejność obiektów definiujących poszczególne maszyny wirtualne powinna być zgodna z kolejnością opisów podanych podczas tworzenia formularza w polu Wybierz rodzaj maszyny wirtualnej.

Po wgraniu pliku do kontenera szablonów templates możemy przejść do utworzenia dwóch akcji, które umożliwią nam pobranie pliku z kontenera i konwersję do obiektu JSON. W tym celu użyjemy akcji HTTP oraz Parse JSON.

Akcja HTTP umożliwia pobranie za pomocą protokołu HTTP wskazanego pliku i przekazanie go dalej do dalszej obróbki. Klikamy New step, w oknie Choose an action  wpisujemy HTTP i wybieramy ikonę

Następnie akcję HTTP 

Określamy parametry dla podanej akcji

ParametrWartość
MethodGET
URIconcat(parameters(‚templatesUrl’), ‚machines.json’)

Uwaga! Parametr URI należy wprowadzić za pomocą okna Dynamic content / Expression, w przeciwnym razie podana wyżej wartość będzie zwykłym tekstem potraktowanym jako adres a nie jako wyrażenie. Okno Dynamic content Expression wyświetla się poprzez ustawienie „focusu” na danym parametrze:

Następnie dodajemy akcję Parse JSON analogicznie jak dodaliśmy akcję HTTP i określamy parametry:

ParametrWartość
ContentOdwołanie do zawartości zwróconej przez akcję HTTP w polu Body. W oknie Dynamic content wybieramy:  
„Body”
SchemaSchemat pliku JSON, można go wygenerować automatycznie poprzez wybranie Use sample payload to generate schema i wklejenie pliku machines.json.

Kolejnym krokiem jest zainicjalizowanie zmiennych poprzez dodanie akcji Initialize variable analogicznie jak poprzednie akcje. Na potrzeby naszego procesu będzie potrzebna jedna zmienna VirtualMachineIndex w której będzie przechowywany indeks do definicji maszyny wirtualnej wyliczony na podstawie informacji podanej przez użytkownika w formularzu.

ParametrWartość
NameVirtualMachineIndex
TypeInteger
Value-1

Teraz pozostaje nam odczytać dane przesłane z formularza i uruchomienie procesu tworzenia maszyny wirtualnej. Ze względu na to, że dane z formularza przekazywane są w postaci listy a nie pojedynczego obiektu musimy użyć akcję For each, która umożliwia iterację po poszczególnych elementach listy.

Akcję For each dodajemy podobnie jak poprzednie i określamy wymagane parametry:

ParametrWartość
Select an output from previous steps When a new response is submitted
List of response notifications

W ramach akcji For each dodajemy akcje, które będą wykonywane w pętli dla każdego elementu z listy. Pierwszą akcją jaką dodamy jest akcja Get response details, która zwraca dane wprowadzone w formularzu przez użytkownika:

ParametrWartość
Form IdTworzenie Maszyn Wirtualnych
Response IdWhen a new response is submitted
List of response notifications Response Id

Następnie dodajemy akcję Set variable, która umożliwia ustawienie zmiennej VirtualMachineIndex na podstawie wartości pola formularza Wybierz rodzaj maszyny wirtualnej. W zmiennej przechowywany jest indeks do tablicy z pliku machines.json określający wybrany przez użytkownika rodzaj maszyny wirtualnej do utworzenia.

ParametrWartość
NameVirtualMachineIndex
Valuesub(int(trim(first(split( , ‚|’)))), 1)
Uwaga! Powyższe wyrażenie jest niepełne. Wklejamy je w powyższej postaci w polu Expression, ustawiamy kursor za ostatnim nawiasem otwierającym i wybieramy pole !!! Wybierz rodzaj maszyny wirtualnej z zakładki Dynamic content !!!

Mając indeks maszyny wirtualnej do utworzenia pobieramy z tablicy machines.json odpowiedni obiekt, który definiuje parametry z jakimi maszyna ma zostać utworzona. W tym celu korzystamy z akcji Compose

ParametrWartość
Inputscoalesce(body(‚Parse_JSON'[variables(‚VirtualMachineIndex’)])

Akcja Compose posłuży nam też do utworzenia parametrów potrzebnych do wywołania szablonu Azure Resource Manager i utworzenia maszyny wirtualnej.

Parametry AdminPassword, AdminUserName, Subnet, virtualNetworkName, virtualNetworkResourceGroup wybieramy bezpośrednio z okna Dynamic content. Natomiast parametry VmSize, VmType, virtualMachineImage wprowadzamy zgodnie z poniższą tabelą w oknie Dynamic content / Expression

ParametrWartość
VmSizeoutputs(‚Compose’)[‚VmSize’]
VmTypetoLower(outputs(‚Compose’)[‚Type’])
VirtualMachineImageoutputs(‚Compose’)[‚ImageReference’]

Praktycznie dotarliśmy prawie do końca zostało nam jeszcze wywołanie procesu wdrażania szablonu Azure Resource Manager i zapisanie w bazie danych informacji o utworzonej maszynie wirtualnej. W tym celu wykorzystamy akcje:

1.      Create or update a resource group – utworzenie lub aktualizacja wybranej przez użytkownika grupy zasobów

ParametrWartość
SubscriptionazureSubscription
Resource Group NameWybierz grupę zasobów
LocationazureLocation

2.      Create or update a template deployment – utworzenie wybranej maszyny wirtualnej na podstawie szablonu

3.      

ParametrWartość
SubscriptionazureSubscription
Resource GroupAtrybut Name zwrócony przez akcję Create or update a resource group
Deployment Nameconcat(‚deployment’, formatDateTime(utcNow(), ‚yyyyMMddTHHmmss’) )
Deployment ModeIncremental
Wait for DeploymentYes
Template URIconcat(parameters(‚templatesUrl’), outputs(‚Compose’)[‚Template’])
ParametersWyjście akcji Parameters

4.      Parse JSON – do pobrania publicznego numeru IP na podstawie informacji zwróconych przez Azure Resource Manager

ParametrWartość
ContentAtrybut outputs zwrócony przez akcję Create or update a template deployment
Schema Schemat danych w postaci:{„properties”: {„adminPublicIpName”: {„properties”: {„type”: {„type”: „string”},”value”: {„type”: „string”}},”type”: „object”}},”type”: „object”} 

5.      Insert or Replace Entity – zapisanie informacji o utworzonej maszynie wirtualnej w tabeli machines

ParametrWartość
TableMachines
Partition KeyNazwa użytkownika
Row KeyWybierz grupę zasobów
EntityZawartość zapisywanego rekordu. Jest to obiekt JSON, w którym oprócz atrybutów Machine i VmPublicIP, pozostałe atrybuty są to standardowe atrybuty wybierane z okna Dynamic contentAtrybutWartośćMachineoutputs(‚Compose’)[‚Description’]VmPublicIPbody(‚Template_Output’)?[‚adminPublicIpName’]?[‚value’]

Zapisanie do tabeli machines było ostatnią akcją. Cały proces powinien wyglądać następująco:

Uwaga! Ze względu na czytelność artykułu w wyżej opisanym procesie nie uwzględniliśmy obsługi błędów poprzez zapisywanie zdarzeń do tabeli logs. Funkcjonalność tę pozostawiam do wykonania samodzielnie. 

Szablony Azure Resource Manager

Ostatnią rzeczą jaka nam została jest wgranie pliku machine.json, który definiuje szablon na podstawie , którego tworzone są maszyny wirtualne. Szablon musi obsługiwać poniższą listę parametrów, aby poprawnie współpracował ze zdefiniowanym wyżej procesem.

ParametrOpisDomyślna wartość
VmTypeTyp wirtualnej maszynywinos
VmSizeRozmiar maszyny wirtualnejStandard_D4_v3
AdminPasswordHasło administratora maszyny 
AdminUserNameIdentyfikator administratora maszyny 
virtualNetworkNameNazwa wirtualnej sieci z której korzystać będzie wirtualna maszynaShared-Vnet
virtualNetworkResourceGroupNazwa grupy zasobów w której znajduje się wirtualna siećResourceAutomation
SubnetNazwa podsieci do której przypięta będzie wirtualna maszyna 
virtualMachineImageParametry definiujące obraz maszyny wirtualnej{„publisher”:”MicrosoftWindowsServer”,”offer”: „WindowsServer”,”sku”: „2016-Datacenter”,”version”: „latest”}

Ze względu na swoją objętość plik machine.json dostępny jest w repozytorium GitHub – https://github.com/cloudstateu/AzureResourceAutomation

Plik machine.json wgrywamy do kontenera szablonów templates i możemy rozpocząć testować utworzony proces.

Finał

Testowanie rozpoczynamy od wyświetlenia naszego formularza i wprowadzenia danych, które przesyłamy za pomocą przycisku Prześlij

Po przesłaniu formularza przechodzimy do naszego procesu Logic App, przechodzimy na Overview gdzie powinna się pojawić informacja, że rozpoczęło się przetwarzanie otrzymanych danych.

Po około dwóch minutach działania proces powinien zakończyć się sukcesem.  W przypadku gdy coś pójdzie nie tak Status zmieni się na Failed. Klikając na błędnie przetworzony proces możemy przeprowadzić diagnostykę co poszło nie tak, ale to zostawiam na później.

Udanego szkolenia i/lub hackathonu!

Już wkrótce otwieramy nowe kursy

Zostań specjalistą chmury publicznej

Dołącz do listy mailingowej!

Dołącz do naszego newslettera

Staramy się wysyłać tylko wartościowe informacje, np. co miesiąc dostaniesz spis najważniejszych nowości z chmur Azure, AWS i GCP, z krótkimi opisami i linkami.