Hej, hej... Programisto, to kolejny artykuł dla Ciebie! Druga część artykułu na temat wzorców projektowych. Poznaj Adapter oraz Memento.
Dzisiaj jako Innokrea zapraszamy do serii prezentującej podejście IaC (Infrastructure as a code) za pomocą narzędzia Terraform. Jeśli zastanawiasz się dlaczego przez ostatnie kilka lat to podejście stało się tak popularne, szczególnie w kulturze DevOps, to jesteś w dobrym miejscu. Postaramy się przekazać Ci tę wiedzę wykorzystując do tego Terraforma i przykłady z użyciem serwisów chmurowych AWS.
Czym jest Terraform?
Terraform to narzędzie open source’owe IAC, używane głównie przez zespoły DevOps do automatyzacji różnych zadań związanych z infrastrukturą. Jest niezależne od operatorów chmurowych, napisane w języku Go i stworzone przez HashiCorp. Warto wspomnieć, że takie narzędzia jak Ansible/Chef/Puppet służą do zarządzania i instalacji oprogramowania na istniejących serwerach. Terraform czy CloudFormation są narzędziami orkiestracji infrastruktury, co oznacza, że mogą dokonywać “provisioningu” serwerów i infrastruktury. Warto powiedzieć, że obie te kategorie są często używane przez zespoły DevOps do zarządzania infrastrukturą.
Provisioning, czyli tak właściwie to co?
W kontekście IaC, provisioning odnosi się do automatycznie wykonywanego procesu tworzenia i konfigurowania zasobów infrastruktury za pomocą kodu i plików konfiguracyjnych. Polega na określeniu za pomocą deklaracji pożądanego stanu infrastruktury a następnie wdrożeniu jej z użyciem narzędzi IaC, takich jak Terraform czy CloudFormation.
W praktyce używanie tego typu narzędzi polega na zdefiniowaniu takich zasobów jak serwery, sieci, dyski i polityki bezpieczeństwa w postaci kodu. Kod opisuje pożądany stan infrastruktury, w tym konkretne konfiguracje, zależności, a także może być wersjonowany i dzięki temu spójny. Zawsze uzyskujemy ten sam efekt i zawsze wiemy, a przynajmniej powinniśmy wiedzieć jaki jest stan infrastruktury, którą zarządzamy. Dzięki temu wprowadzamy wersjonowanie i kontrole do zarządzania serwerami. Zmiany stają się zarządzalne, systematyczne i sprawdzane przy code review, a także istnieje możliwość cofnięcia zmian bez manualnego wpisywania komend na wielu serwerach.
Rysunek 1: Różnica pomiędzy Terraform i Ansible w kontekście infrastrukutry AWS, źródło medium.com
Deklaratywność
Język oprogramowania Terraform jest deklaratywny, co oznacza, że z jego użyciem opisujemy zamierzony cel, a nie konkretne kroki jak w imperatywnym paradygmacie programowania.
Rysunek 2: Przykład kodu Terraform.
Instalacja oraz edytor
Aby zainstalować oprogramowanie Terraform należy wejść na stronę, a następnie pobrać plik odpowiedni do używanego systemu operacyjnego. Następnie należy dodać ścieżkę do zmiennej $PATH w systemie Windows.
Jeśli chodzi o wykorzystywany edytor, to możemy polecieć Visual Studio Code z odpowiednimi rozszerzeniami, które pomagają w składni Terraform’a.
Rysunek 3: Przykładowe rozszerzenia w VSC do Terraform.
Koncepcja provider’ów i plugin’ów
Terraform wspiera wielu dostawców usług serwerowych czy chmurowych, dzięki czemu używając kodu i dokumentacji Terraforma jesteśmy w stanie uruchomić daną usługę u danego dostawcy. Fragmenty oprogramowania dostarczane jako osobne pliki są zwane pluginami i powstają zarówno przy wsparciu Hashicorp jak i niezależnie od nich. Należy więc zawsze w środowisku produkcyjnym w kodzie podawać konkretne wersje plugin’ów których chcemy użyć, bo inaczej zostaną pobrane najnowsze, co może sprawić, że wszystko przestanie działać.
Aby użyć odpowiedniego plugin’u i tym samym skorzystać z API np. serwisu AWS należy wyspecyfikować w kodzie sekcję required_providers. Może istnieć tylko jedna taka sekcja w plikach konfiguracyjnych.
Rysunek 4: fragment kodu odpowiedzialny za pobranie pluginu i stworzenie połączenia z API AWS.
Podstawowy workflow
Aby móc zarządzać infrastrukturą z poziomu Terraform’a należy upewnić się, że istnieje plugin do danego provider’a. O ile oczywistym jest istnienie pluginu do np. AWS, o tyle mniejsi dostawcy mogą nie posiadać pluginu i nie będzie możliwe manipulowanie swoją infrastrukturą z poziomu Terraform’a. Jeśli wiemy już, że plugin istnieje, to należy wyszukać w dokumentacji lub w Internecie w jaki sposób skorzystać z API z poziomu terraform’a. Zwykle będzie wymagane użycie jakiegoś tokenu wygenerowanego w serwisie którym chcemy zarządzać.
Rysunek 5: Uzyskanie tokenu w serwisie AWS.
Następnie musimy wiedzieć co chcemy stworzyć. W przypadku AWS możemy np. stworzyć instancję serwera typu EC2. W tym celu musimy zadeklarować trzy rzeczy:
- pluginy (required_providers) – aby terraform był w stanie pobrać odpowiednie pluginy w odpowiednich wersjach na nasz komputer
- provider’a – zainicjować providera z uzyskanym tokenem
- resource – czyli to co właściwie chcemy utworzyć, w naszym przypadku instancję EC2
Rysunek 6: Deklarowanie zasobu serwera EC2 AWS. AMI to obraz serwera.
Wszelkie parametry, które należy podać w miejscu provider’a oraz zasobu są zależne od serwisu i dostawcy, więc informacji o nich należy szukać w danej dokumentacji.
Podstawowe polecenia
Jeśli mamy już gotowy plik z deklaracjami z rozszerzeniem .tf i wykonaliśmy poprzednie kroki, to należy wydać polecenie terraform init, którym zainstalujemy zadeklarowane plugin’y.
Rysunek 7: Deklarowanie zasobu serwera EC2 AWS. AMI to obraz serwera.
Następnie wykonujemy polecenie terraform plan które generuje plan wykonania. Pokazuje on zasoby, które Terraform stworzy, zmodyfikuje lub usunie. Zawiera podsumowanie zmian, w tym wyświetla w terminalu wszelkie potencjalne błędy lub konflikty, oraz daje możliwość przejrzenia zmian przed ich zastosowaniem.
Rysunek 8: Podejrzenie planowanych zmian, w tym przypadku zmiany nazwy serwera.
Na samym końcu korzystamy z polecenia terraform apply, aby zastosować zmiany do naszej infrastruktury. Terraform wtedy odczyta pliki konfiguracyjne i wypchnie zmiany na świat. Jeśli podczas procesu tworzenia wystąpią jakiekolwiek błędy, Terraform wyświetli komunikaty o błędach, a proces apply zostanie zatrzymany.
Rysunek 9: Zastosowanie zmian, w tym przypadku jest to zmiana nazwy serwera.
Kiedy chcemy zniszczyć infrastrukturę możemy to wykonać z pomocą polecenia terraform destroy.
Rysunek 10: Zniszczenie stworzonych zasobów z pomocą terraform destroy
Podsumowanie
Oprogramowanie Terraform używa deklaratywnego języka aby stworzyć infrastrukturę u wspieranych dostawców. Następnie korzystamy kolejno z poleceń terraform init, plan, apply.
Rysunek 11: Podsumowanie workflow, źródło brendanthompson.com.
To już wszystko co przygotowaliśmy dla Was na ten tydzień, ale spokojnie bo już za tydzień kolejny artykuł dotyczący oprogramowania Terraform. Jeśli jesteście zainteresowani poszerzeniem swojej wiedzy w zakresie zarządzania infrastrukturą, w tym jej bezpieczeństwem, to zapraszamy!
Źródła:
- https://www.redhat.com/en/topics/automation/what-is-provisioning
- https://medium.com/geekculture/the-most-simplified-integration-of-ansible-and-terraform-49f130b9fc8
- https://www.redhat.com/en/topics/automation/what-is-provisioning
- https://brendanthompson.com/posts/2021/11/my-terraform-development-workflow