Dzisiejszy świat IT coraz bardziej opiera się na automatyzacji, w sumie kierunek słuszny, pytanie tylko czego do niej użyć. Dlaczego mamy tracić czas na klikanie, skoro można przygotować bardzo uniwersalne skrypty, które w „chwilę” zrobią to samo automatycznie, stąd słów kilka o Terraform.
Na końcu tego wpisu link do krótkiego nagrania dotyczącego konfiguracji.
Czym jest Terraform?
Właśnie, na blogu pokazuję nieco pracy z Ansible, jednak poza nim są jeszcze takie narzędzia jak Chief, Puppet czy Saltstack. Warto również wspomnieć przy tej okazji o Terraform od firmy HashiCorp, które działa jako IaaC, czyli Infrastructure as a Code. Podejście takie powoduje, że infrastrukturę IT szczególnie w odniesieniu do chmury publicznej, buduje się nie tak jak wspomniałem na początku, poprzez klikanie opcji, a poprzez przygotowanie odpowiedniego oprogramowania – skryptu w Terraform. Skrypty takie są w stanie zbudować praktycznie każdą opcję dostępną w chmurze. Terraform posiada wsparcie dla największych dostawców chmury, czyli AWS, Azure czy GCP, poza tym min. dla Vmware oraz Kubernetesa.
Zbudowany w ten sposób skrypt/skrypty można przechowywać oraz udostępniać innym przy pomocy repozytorium Git. Dzięki takiemu podejściu można pomóc innym udostępniając swoje skrypty. Wiele skryptów staje się uniwersalnymi lub wymaga niewielu zmian, aby takimi się stały.
Działanie Terrraform opiera się na deklaratywnym modelu zarządzania. My jako administrator definiujemy jaki stan ma zostać osiągnięty i to od oprogramowania zależy, w jaki sposób cel zostanie osiągnięty. Nie musimy zatem martwić się jakie kolejne kroki musimy wykonać, aby osiągnąć zdefiniowany stan.
Instalacja Terraform
Terraform dostępny jest obecnie na 6 różnych platform, pobrać pakiety instalacyjne można ze strony Terraform.io. Sam proces instalacji opisany jest bardzo dobrze w dokumentacji Terraform.io.
Ważne jest, aby pobrać właściwą wersję w zależności od platformy systemowej.
Instalacji manualna w systemach GNU/Linux nie dokonamy poprzez uruchomienie instalatora, pliki muszą zostać przeniesione we wskazane miejsce, które znajduje się w zmiennej PATH.
Paczkę terraform można pobrać z repozytorium po jego wcześniejszym dodaniu do systemu lub skompilować ręcznie z repozytorium dostępnego na Git.
Użycie Terraform
Oczywiście przy budowie infrastruktury możesz użyć innych narzędzi, poczynając od ręcznego klikania, poprzez wsparcie PowerShell, CLI etc. Jednak prawdziwą siłą Terraform jest możliwość oddziaływania na środowisko na kilka sposobów. Poza instalacją możliwe są również zmiany oraz całkowite usunięcie wcześniejszej konfiguracji, dokładnie tej, która została utworzona przy pomocy konkretnego skryptu.
Terraform pozwala na współdziałanie z innymi narzędzie, poza wspomnianą chmurą publiczną mam tutaj na myśli Dockera, Kubernetesa czy Grafanę. Takie podejście daje znacznie większe możliwości konfiguracji środowiska, którego wymaga konkretna projekt.
Schemat infrastruktury, która ma zostać wdrożona zostaje zapisany w jednym lub (lepiej) w kilku plikach z rozszerzeniem .tf. Podział na kilka plików jest wygodniejszy. Takie podejście pozwala na rozdzielenie zmiennych, które tworzone są globalnie dla całego projektu. Możemy pójść dalej, jeżeli środowisko jest mocno skomplikowane każdy jego element można zapisać w oddzielnym pliku. Budując infrastrukturę w chmurze podział może być następujący:
- Przygotowanie kontenera do przetrzymywania infrastruktury wraz z wybraniem lokalizacji,
- Przygotowanie przestrzeni adresowej IP,
- Budowa maszyn wirtualnych,
- Dodanie do nich wymaganych komponentów, aplikacji, dodatkowych ustawień etc.
Tak przygotowane pliki możesz poddać krótkiej ścieżce sprawdzenia czy wszystko co zostało opisane działa poprawnie, ale bez konieczności wdrożenia. Gdy wszystkie pliki znajdują się we właściwych miejscach należy wydać kolejno polecenia:
- terraform init – tutaj z serwerów Terraform pobrane zostaną wtyki, które są niezbędne do startu wdrożenia projektu.
- terraform plan – sprawdzenie całego skryptu czy nie zawiera błędów
- terraform apply – na koniec jeżeli wszystko w poprzednim punkcie przebiegło pomyślnie, możliwe jest wdrożenie całej infrastruktury produkcyjnie.
Gdyby jakaś część skryptu została zmieniona warto w pierwszym kroku przetestować czyli wykonać terraform plan a następnie wdrożyć czyli uruchomić polecenie terraform apply, o czym nieco później.
Warto wiedzieć, że Terraform przy każdym wdrożeniu zmian w infrastrukturze tworzy swoisty log w postaci pliku terraform.tfstate. Tego pliku nie powinno się modyfikować ręcznie, chyba że jesteśmy w 101% pewni, że wiemy co robimy inaczej będą problemy w przyszłości. Dostęp do tego pliku jest potrzebny przy kolejnych modyfikacjach z raczej oczywistego względu.
Co w przypadku gdy projekt został zakończony i nie chcemy już płacić za infrastrukturę? Tutaj należy zaprzyjaźnić się z poleceniem terraform destroy. Tak jak budowa i modyfikacje są automatyczne, tak samo możemy zrobić przy „zniszczeniu” infrastruktury. Działanie Terraform destroy jest odwrotne do terraform apply, to co zostało wdrożone zostanie teraz usunięte do ostatniej części konfiguracji.
Wdrożenie pierwszego projektu Terraform
Projekt jak to dumnie brzmi, ale chcę pokazać, że szybciej niż klikając będzie napisać (przekleić) kilka linii i osiągnąć zamierzony efekt. Szczególnie jeżeli czynności są powtarzalne i różnią się drobiazgami. W tej części wpisu nie chodzi o wdawanie się w szczegóły, ale o proces.
Czym będzie ten projekt? Stworzymy ResourceGroup (RG) w Microsoft Azure. Ok, teraz pytanie czym jest RG?, jest to mówiąc najprościej katalog w którym możemy trzymać naszą konfiguracje, która będzie rozdzielna z pozostałymi RG, ale jednocześnie będzie można jej zasoby przenosić. Co może przechowywać RG? Praktycznie wszystko poczynając od konfiguracji sieci, dysków kończąc na maszynach wirtualnych.
Pierwszym krokiem jest instalacja CLI (lokalnej linii poleceń, która wykona polecenia na koncie) dla Azure, aby możliwe było wykonanie naszego skryptu we właściwy sposób. Instalacja dla Windows oraz GNU/Linux w zależności od dystrybucji została opisana w dokumentacji. Po instalacji w konsoli/terminalu należy wykonać polecenie
1 |
az login |
po podaniu loginu oraz hasła powinno pojawić się potwierdzenie uwierzytelnienia w subskrybcji dla konta w chmurze.
Kolejnym krokiem jest stworzenie miejsca, które będzie przechowywać konfigurację Terraform. Tym miejscem niech będzie najzwyklejszy katalog na lokalnej maszynie. Katalog można stworzyć ręcznie lub w przypadku pracy w środowisku GNU/Linux oraz Windows przy pomocy polecenia.
1 |
mkdir terraform-azure |
1 |
New-Item -Path "c:\" -Name "terraform-azure" -ItemType "directory" |
Powyższe polecenia tworzą taki katalog dla GNU/Linux przy pomocy Bash oraz przy pomocy PowerShell (PS) w środowisku Windows.
Mając zainstalowane narzędzie do podłączenia do Azure, możemy przejść do wdrożenia naszego projektu. Wewnątrz utworzonego katalogu tworzymy plik main.tf do niego dodajemy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#Configure the Azure provider terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 2.26" } } } provider "azurerm" { features {} } resource "azurerm_resource_group" "rg" { name = "myTFResourceGroup" location = "westus2" } |
Powyższy kod ustawi jako dostawcę usługi chmurowej, Microsoft Azure, pozwoli na korzystanie z metod azurerm. Jednak najważniejszą częścią dla nas jest „azurerm_resource_group” „rg”, te 3 linijki utworzą ResourceGroup (RG) w lokalizacji westus2 wraz z nazwą myTFResourceGroup. „RG” jest również nazwą tego przedmiotu (itemu), ale wyłącznie dla Terraform, jako referencji (odnośnika) przy rozbudowie skryptu o kolejne elementy.
Mając prosty kod możemy zająć się jego wdrożeniem. Będąc nadal wewnątrz katalogu musimy pobrać zależne pakiety dla Terraform, w tym przypadku hashicorp/azurerm, potrwa to kilka minut, więc nie zamykaj okna.
1 |
terraform init |
w odpowiedzi powinna pojawić odpowiedź podobna do tej.
Po pobraniu zależności czas na przetestowanie kodu, czyli
1 |
terraform plan |
Skrypt jest poprawny. Na tym etapie pominiemy ostrzeżenie o braku parametru -out.
Ostatnim krokiem będzie wdrożenie produkcyjne naszego skryptu, z pomocą przyjdzie
1 |
terraform apply |
W odpowiedzi pojawi się poniższy widok
Na samym końcu po frazie Enter a value należy wpisać yes. Dopiero wtedy zaplanowana infrastruktura czyli w tym przypadku RG zostanie dodana.
W tym samym czasie Terraform doda plik stanu (terraform.tfstate), w nim znajdą się informacje o utworzonym rozwiązaniu. Można się do niego dostać przy pomocy polecenia
1 |
terraform show |
W odpowiedzi powinien pojawić się „log” z dotychczasowych działań.
I gotowe, jednak okazuje się, że zapomnieliśmy dodać dodatkowych informacji, które na liście naszych RG pozwolą łatwiej znaleźć świeżo stworzoną grupę. Co zrobić? Usunąć i zaczynać od nowa, czy może… W łatwy sposób dokonać update naszej grupy.
1 2 3 4 5 6 7 8 |
resource "azurerm_resource_group" "rg" { name = "myTFResourceGroup" location = "westus2" tags = { Environment = "Terraform Getting Started" Team = "DevOps" } } |
Chcemy dodać opcjonalną rzecz jaką jest tag w konfiguracji ResourceGroup, pozwala on na filtrowanie naszych zasobów po dodatkowych opisach.
Jako że wykonujemy update naszej konfiguracji trzeba o tym poinformować Terraform. Pomijamy w tym przypadku init, ponieważ nie dodajemy nowych funkcjonalności z listy Terraform Azure, a jedynie rozszerzamy to co mamy już zrobione, dlatego utworzymy dodatkowy plik z aktualizacją przy pomocy -out.
1 |
terraform plan -out=newplan |
W odpowiedzi informacja co zostanie dodane do poprzedniej wersji.
Następnie musimy wdrożyć dodatkową konfigurację używając nowego planu (newplan).
1 |
terraform apply "newplan" |
Pojawi się potwierdzenie, że tym razem dokonane zostały zmiany w infrastrukturze.
Ponownie możliwe jest podejrzenie obecnego stanu przy pomocy
1 |
terraform show |
Na koniec możemy usunąć grupę, jeżeli nie jest potrzebna. W tym celu wykorzystamy
1 |
terraform destroy |
Terraform zaznaczy co zostanie usunięte poprzez znak „-” przy każdym wierszu naszego skryptu.
W wierszu Enter a value należy dodatkowo potwierdzić poprzez yes te kroki, jest to zabezpieczenie przed przypadkowym usunięciem działającej i potrzebnej infrastruktury.
Podsumowanie
W ten sposób można przyspieszyć sobie zarówno tworzenie, aktualizację jak i usunięcie infrastruktury IT w chmurze publicznej.
Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.
Link do formularza tutaj: https://beitadmin.pl/pomysly
Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).