Harmonogram pracy maszyn wirtualnych w Azure

4 Maj

Witam po długim majowym weekendzie 🙂

W chmurze obliczeniowej Azure dostępna jest usługa, która pozwala na automatyzację czynności związanych z administracją chmurą obliczeniową i jej zasobami, w szczególności maszynami wirtualnymi za pomocą skryptów Powershell. Najczęstszym wykorzystaniem możliwości automatyzacji jest włączanie i wyłączanie maszyn wirtualnych o konkretnych porach dnia, np. włączamy maszyny rano żeby móc na nich pracować i wyłączamy wieczorem kiedy nie będziemy ich już używać.

Aby móc korzystać z automatyzacji musimy najpierw stworzyć tzw. konto automatyzacji w portalu Azure. Z dostępnych usług należy wybrać Automation Accounts.

automation accounts

Następnie wybieramy Add i podajemy dane do utworzenia konta automatyzacji takie jak:

  • Unikatowa nazwa
  • Subskrypcja do której konto będzie przypisane
  • Grupa zasobów (nowa bądź już istniejąca – ja utworzyłem nową)
  • Lokację

Więcej informacji jak utworzyć konto znajduje się tutaj.

Teraz mając już utworzone konto możemy dodawać do niego skrypty. Po wejściu do ustawień konta wystarczy wybrać zakładkę Runbooks skąd mamy dostęp do całej galerii już gotowych skryptów – wystarczy kliknąć Browse gallery.

automation runbooks

Skryptów, które same włączają/wyłączają maszyny wirtualne jest co najmniej kilka. Opiszę tutaj dwa z których miałem okazję korzystać. Zacznę jednak nietypowo bo od swego rodzaju podsumowania żebyście nie musieli przewijać na sam dół strony by sprawdzić, który skrypt wybrać. W skrócie skrypt autorstwa Automys wymaga nieco więcej czynności konfiguracyjnych. Natomiast drugi opisany skrypt co prawda nie jest tak skomplikowany żeby go na początku ustawić, ale daje nam mniejszą elastyczność jeśli chodzi o harmonogram pracy maszyn wirtualnych. Różne harmonogramy pracy maszyn wirtualnych w przypadku Automys możemy załatwić jednym skryptem, natomiast aby w przypadku drugiego z opisanych skryptów ustawić różne harmonogramy pracy maszyn wirtualnych musimy dla każdego harmonogramu importować nowy skrypt. Osobiście wybrałem pierwszą opcję i od jej opisu zacznę.

1. Scheduled Virtual Machine Shutdown/Startup autorstwa Automys

Wydał mi się na miarę moich potrzeb a przy okazji dostępna była pełna dokumentacja. Wystarczy wybrać go z galerii a następnie kliknąć przycisk Import. Po chwili automatycznie otworzy się konfiguracja zaimportowanego skryptu gdzie musimy dokonać kilku czynności konfiguracyjnych.

Na początku wybieramy Edit z menu skryptu, następnie Publish. Dopiero po opublikowaniu skryptu możemy z niego korzystać.

publish-runbook

Teraz należy skonfigurować konto, którego będziemy używać do wykonywania skryptu, oczywiście zakładając że mamy je utworzone 🙂 Jeśli jeszcze nie to zapraszam do wpisu, w którym jest opisane jak to zrobić.

Mając już konto serwisowe wracamy do widoku kont automatyzacji, wybieramy konto w którym znajduje się zaimportowany skrypt i klikamy Assets, następnie Credentials i Add a credential.

automation credentials

Jako nazwę podajemy Default Automation Credential.
UWAGA tylko taka nazwa pozwoli na wykonywanie skryptu bez dodatkowych zmian w jego ustawieniach. Następnie podajemy nazwę i hasło użytkownika z Azure Active Directory.

new automation credential

Teraz w podobny sposób należy dodać zmienną, która będzie przechowywała nazwę subskrypcji w której znajdują się maszyny wirtualne mające być objęte harmonogramem. Ponownie wchodzimy w konto automatyzacji ze skryptem Automys, klikamy AssetsVariablesAdd a variable.

automation variable

Jako Variable name podajemy Default Azure Subscription.
UWAGA tylko taka nazwa pozwoli na wykonywanie skryptu bez dodatkowych zmian w jego ustawieniach. Type zostawiamy jako String, a w Value podajemy nazwę subskrypcji na której ma operować skrypt. Encrypted pozostawiamy ustawione na No. Klikamy Create.

new automation variable

I tu mała uwaga – jeśli chcemy aby skrypt działał na maszynach w kilku różnych subskrypcjach to w każdej subskrypcji tworzymy oddzielne Automation account z oddzielnymi zmiennymi przechowującymi nazwę subskrypcji, natomiast konto serwisowe może być jedno – i tak w każdym Automation account należy je podać oddzielnie jako Default Automation Credential. Mam nadzieję że za bardzo nie zagmatwałem 🙂

  • Subskrypcja z maszynami wirtualnymi
    • Automation account
      • Variable: Default Azure Subscription przechowująca nazwę subskrypcji, w której jest utworzone Automation Account
      • Credential: Default Automation Credential przechowujące dane konta z Azure Active Directory (wystarczy utworzyć jedno konto)

Wracając do konfiguracji skryptu, musimy jeszcze ustawić jak często skrypt będzie sprawdzał stan maszyn wirtualnych. To jak często ustawimy harmonogram uruchamiania skryptu będzie miało wpływ na to z jaką dokładnością będą one włączane/wyłączane. I znów uwaga – harmonogram uruchamiania skryptu to co innego niż harmonogram pracy maszyny wirtualnej. Harmonogram uruchamiania skryptu pozwala nam ustalić jak często skrypt będzie sprawdzał stan maszyny wirtualnej i dopiero jeśli okaże się że maszyna wirtualna łapie się w widełki zdefiniowanego dla niej harmonogramu pracy będzie ją włączał bądź wyłączał.

Uff, mam nadzieję że do tej pory wszystko jest jasne, a jeśli nie jest to za chwilę powinno się wyjaśnić 🙂 Przejdźmy więc do ustawienia harmonogramu wykonywania się skryptu. Można to zrobić na dwa sposoby:

  1. Dodać harmonogram w koncie automatyzacji co pozwoli na jego późniejsze wykorzystanie we wszystkich skryptach w tym koncie. W takim wypadku harmonogram tworzę raz i potem tylko podłączam go pod różne skrypty. Tak jak z poprzednimi konfiguracjami należy z poziomu konta automatyzacji wybrać Assets – Schedules – Add a schedule. Później z poziomu skryptu jak wybiorę Schedules to ten harmonogram będzie na liście do wybrania.
  2. Dodać harmonogram bezpośrednio do skryptu – tylko ten skrypt będzie mógł z niego korzystać.

Wybieram drugi sposób. Z konta automatyzacji wchodzę w Runbooks, następnie wybieram Assert-AutoShutdownSchedule i Schedules.

runbook schedule

Dalej wybieram Add a schedule Link a schedule to your runbookCreate a new schedule. Najważniejszym ustawieniem jest Recurrence czyli jak często skrypt ma się wykonywać. Ponieważ planuję ustawić harmonogram pracy maszyn wirtualnych od 8:00 do 18:00 czyli włącz/wyłącz o pełnej godzinie, ustawię harmonogram wykonywania skryptu w pętli co godzinę. Ustawiam Recurrence na Hourly i Runs every (number of hours) na 1 co spowoduje że skrypt będzie się wykonywał co godzinę. Klikam Create.

create runbook schedule

Zauważ że tutaj też można ustawić parametry skryptu, ale ponieważ wcześniej korzystaliśmy z domyślnych nazw (Default Azure Subscription, Default Automation Credential) to nic tu nie musimy zmieniać. Klikamy OK, harmonogram zostanie dodany, a my możemy zająć się najważniejszym czyli harmonogramem pracy maszyn wirtualnych 🙂

Sprawa jest rozwiązana dość ciekawie, autor skryptu wykorzystał znaczniki czyli „tagi” zasobów – w tym przypadku maszyn wirtualnych. Zanim zaczniemy ustawiać harmonogram należałoby wspomnieć że skrypt korzysta ze strefy czasowej UTC, więc przed ustawieniem skryptu trzeba przekonwertować harmonogram na czas UTC. Jeśli chcemy aby maszyna wirtualna działała od 8:00 do 18:00 to ustawiamy tag 16:00 -> 6:00 (w momencie pisania tego wpisu w Polsce jest czas letni). Jeśli chcemy by była dodatkowo wyłączona przez całą sobotę i niedzielę to tag będzie następujący 16:00 -> 6:00, Saturday, Sunday. Więcej przykładów i cała dokumentacja znajduje się tutaj.

Żeby ustawić tag przechodzimy do maszyny wirtualnej i klikamy ikonkę w prawym górnym rogu na karcie maszyny. W polu Key wpisujemy AutoShutdownSchedule a w polu Value podajemy harmonogram. Klikamy Save.

UWAGA – jeśli mamy więcej maszyn wirtualnych w grupie zasobów, a chcemy żeby wszystkie działały na tym samym harmonogramie to wystarczy dodać tag dla danej grupy zasobów.

Jak już poustawiamy wszystkie harmonogramy to możemy przetestować działanie skryptu – czyli czas na najciekawszą część 🙂 Wchodzimy w skrypt, klikamy Start i ustawiamy Simulate na True. Klikamy OK.

test automys runbook

Możemy podejrzeć co się dzieje z maszynami wirtualnymi wchodząc w nowo otwartej zakładce w Output. Powinno pojawić się okno z różnymi wpisami. Trzeba chwilę poczekać aż pojawią się informacje na temat maszyn wirtualnych i ewentualnie akcji jakie skrypt na nich wykona. Jak widać na poniższym obrazku skrypt przeszedł przez wszystkie maszyny w subskrypcji, znalazł jedną z tagiem ale nic z nią nie zrobił, ponieważ była godzina 22:58 (pamiętaj że skrypt bazuje na czasie UTC), a maszyna była wyłączona więc stan maszyny był zgodny z harmonogramem.

test output automys

Voila! Skoro już jesteśmy pewni że wszystko zadziała jak należy (dla super upewnienia się można maszynę włączyć i przetestować skrypt – powinny pojawić się komunikaty, że maszyna zostałaby wyłączona), nie pozostaje nic innego jak sprawdzić najbliższy wynik działania harmonogramu skryptu.

Jeśli chcemy zobaczyć logi z wykonywania się skryptu wystarczy wejść na jego kartę i kliknąć Jobs, następnie z listy wybrać interesującą nas pozycję. Szczegółowy opis znajduje się pod Outputs.

automys-jobs

2. Start Azure ARM VMs autorstwa Automation Product Team

Drugim ciekawym skryptem, a w zasadzie workflow’em jest Start Azure ARM VMs. Pozwala na uruchomienie wszystkich maszyn w obrębie subskrypcji bądź grupy zasobów jak i pojedynczych maszyn. Można go zaimportować z galerii, ja wykorzystam te same konto automatyzacji co w przypadku wcześniej opisywanego skryptu autorstwa Automys. I tak samo na początek musimy zdefiniować kilka zmiennych zanim będziemy mogli z niego korzystać.

Wchodzę w konto automatyzacji, następnie Assets – Variables – Add a variable. Jako nazwę podaję AzureSubscriptionId a wartością będzie id subskrypcji w obrębie której dokonujemy konfiguracji. Klikam Create.

subscription variable automation

Teraz jeszcze musimy podać konto serwisowe przy pomocy którego skrypt będzie uruchamiany. Jak utworzyć takie konto opisane jest w moim innym wpisie. W ramach konta automatyzacji klikamy kolejno Assets – Credentials – Add a credential. Ponieważ podawałem już konto automatyzacji przy okazji konfigurowania skryptu Automys’a to wykorzystam je również tutaj.

Jak na razie wszystko wygląda podobnie jak przy konfiguracji skryptu Automys 🙂

Teraz o ile jeszcze tego nie zrobiłeś trzeba opublikować skrypt. W koncie automatyzacji wchodzę po kolei w Runbooks – Edit – Publish. Potwierdzam Yes. Przy okazji mogę podejrzeć jak wygląda workflow skryptu.

publish-StartAzureRMVM

Tak naprawdę teraz już wystarczy dodać harmonogram i uruchomić skrypt. W skrypcie wybieram Schedules – Add a schedule – Link a schedule to your runbook i tu mogę wybrać już istniejący harmonogram lub stworzyć nowy. Ja stworzę nowy, ponieważ chcę żeby maszyny włączały się raz dziennie a nie co godzinę 🙂 Wybieram Create a new schedule. Po intuicyjnym ustawieniu harmonogramu klikam Create.

daily automation schedule

Następnie podaję parametry uruchomieniowe, a przynajmniej nazwę konta serwisowego, które zostanie wykorzystane do uruchomienia skryptu (w moim przypadku Default Automation Credential). Jeśli użyliśmy nazwy AzureCredential to nie musimy go wpisywać. Reszta jest opcjonalna jeśli chcemy by skrypt włączał wszystkie maszyny wirtualne w obrębie jednej subskrypcji. Możemy natomiast podać nazwę grupy zasobów do której skrypt ma się ograniczać bądź wręcz pojedynczą maszynę wirtualną. Ponieważ chcę aby skrypt włączał tylko jedną maszynę wirtualną o podanej porze podaję jej nazwę w polu VMNAME oraz nazwę grupy zasobów w której się znajduje w polu RESOURCEGROUPNAME. Następnie klikam  OK i zamykam okno edycji harmonogramu OK.

input parameters StartAzureRMVM

I to wszystko 🙂 Teraz należy poczekać aż nadejdzie czas kiedy harmonogram ma uruchomić skrypt i sprawdzić log działania. Ewentualnie można najpierw wykonać jego test wchodząc w Edit – Test Pane.

StartAzureRMVM output

Dla tego przypadku powinniśmy też dodać do konta automatyzacji skrypt Stop Azure ARM VMs, który będzie wyłączał maszyny. Chyba że będziemy to robić na żądanie i nie chcemy automatyzować tej akcji.

To wszystko na dziś, miłej zabawy z automatyzacją 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *