Wprowadzenie
W poprzednim artykule wprowadziłem Cię w tematykę Infrastructure as Code. Pokazałem Ci, czym jest ten proces, jakie są jego plusy oraz minusy. Natomiast w tym wpisie skupimy się już na czymś bardziej praktycznym. Pokażę Ci, jak zacząć pracę z Terraform (Azure) i utworzymy pierwszy prosty zasób z wykorzystaniem kodu. W kolejnym wpisie natomiast stworzymy bardziej rozbudowany przykład.
Terraform
Terraform (https://www.terraform.io/) jest jednym z rozwiązań Infrastructure as Code. Jest tworzony przez firmę HashiCorp w języku GO jako oprogramowanie open source (https://github.com/hashicorp/terraform). Wykorzystuje język HCL (HashiCorp Configuration Language) do określenia docelowego kształtu infrastruktury (podejście deklaratywne). Na podstawie tego opisu oraz aktualnego stanu (trzymanego w pliku stanu) określa zmiany w infrastrukturze, które należy wprowadzić i je później nanosi.
Sam Terraform to pojedynczy wykonywalny plik, który trzeba pobrać (https://www.terraform.io/downloads.html). Po pobraniu i rozpakowaniu archiwum, folder, w którym znajduje się wypakowany plik, dodajemy do zmiennej środowiskowej PATH. Dzięki temu komendy Terraform będą dostępne w całym systemie.
Opis infrastruktury definiujemy w plikach *.tf. Przy czym głównym plikiem jest main.tf. Do edycji plików tf wykorzystuję głównie Visual Studio Code z zainstalowanym dodatkiem dla Terraforma (https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform).
Dostawcy (Providers)
Terraforma możemy wykorzystać do tworzenia infrastruktury w różnych środowiskach chmurowych, czy lokalnych. W tym celu wykorzystujemy różnych dostawców (providers). W przypadku Azure wykorzystamy hashicorp/azurerm (https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs). Na początku pliku main.tf określamy wykorzystywane providery:
terraform { | |
required_providers { | |
azurerm = { | |
source = "hashicorp/azurerm" | |
version = "=2.46.0" | |
} | |
} | |
required_version = ">= 0.14.9" | |
} | |
provider "azurerm" { | |
features {} | |
} |
Terraform wykorzystuje bloki do określenia poszczególnych sekcji konfiguracji. Pierwszym blokiem jest terraform (od 1 do 10 linijki), który służy do określenia konfiguracji samego Terraforma (np. w jego minimalnej wersji – tutaj 0.14.9). W bloku required_providers (od 2 do 7) znajdują się wykorzystywani dostawcy. Tutaj będzie to wcześniej wspomniany dostawca dla Azure.
W dalszej części pliku znajduje się konfiguracja samego providera azurerm. Początkowo jest ona pusta, ale później dodamy do niej konfigurację.
Zasoby (Resource)
Mając już skonfigurowanego dostawcę, możemy przejść do definicji poszczególnych zasobów w naszej infrastrukturze. W tym przykładzie utworzymy prosty zasób, którym będzie Resource Group. W kolejnym wpisie pokażę Ci bardziej rozbudowany przykład. Tutaj skupimy się bardziej na uruchomieniu naszego skryptu.
Blok definiujący zasób w pliku Terraform składa się z kilku elementów. Słowo kluczowe resource określa, że tworzymy zasób. Następnie określamy typ zasobu (np. azurerm_resource_group), który pochodzi z wykorzystywanego providera. W kolejnej części określamy nazwę zasobu (np. resource-group) w Terraform, nazwa ta będzie wykorzystywana w innych częściach pliku Terraforma. Co istotne, nie jest to nazwa samego zasobu w tym przypadku w Azure.
W samym bloku znajdują się poszczególne wartości ustawień zasobu. Poniżej, w bloku (od linijki 16), tworzącym grupę zasobów w Azure, określamy jej nazwę (name) oraz region (location):
terraform { | |
required_providers { | |
azurerm = { | |
source = "hashicorp/azurerm" | |
version = "=2.46.0" | |
} | |
} | |
required_version = ">= 0.14.9" | |
} | |
provider "azurerm" { | |
features {} | |
} | |
resource "azurerm_resource_group" "example" { | |
name = "demos-resource-group" | |
location = "West Europe" | |
} |
W zależności od typu zasobu możemy wprowadzić określone ustawienia. Szczegółowe informacje znajdują się w dokumentacji danego providera.
Konfiguracja środowiska
Zanim przejdziemy do wykonania skryptu, musimy jeszcze odpowiednio skonfigurować lokalne środowisko. Poza pobraniem Terraforma (patrz początek wpisu), musimy jeszcze zainstalować Azure CLI (https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) i je skonfigurować. Po pobraniu i instalacji musimy zalogować się w konsoli:
az login
Po wpisaniu komendy zostanie uruchomiona domyślna przeglądarka. Logujemy się tam na swoje konto, które ma dostęp do subskrypcji Azure, gdzie chcemy tworzyć zasoby z wykorzystaniem Terraforma. Po zalogowaniu w konsoli zobaczymy informacje, że się udało oraz listę subskrypcji:
A w przypadku gdy mamy więcej subskrypcji połączonych z naszym kontem, to musimy jeszcze wybrać odpowiednią subskrypcję. Do tego możemy użyć komendy:
az account set --subscription="SUBSCRIPTION_ID"
Natomiast z użyciem poniższej komendy możemy zobaczyć, która subskrypcja aktualnie jest aktywna:
az account show
Terraform będzie tworzyć wszystkie zasoby w wybranej subskrypcji.
Utworzenie zasobów
Mając już skonfigurowane środowisko, możemy przejść do utworzenie zasobów. Terraform udostępnia kilka podstawowych komend, które będziemy używali podczas codziennej pracy.
Tworzymy folder, do którego wrzucamy plik main.tf, a w nim zawartość z ostatniego listingu. Następnie w wybranej konsoli przechodzimy do tego folderu i możemy zacząć używać komend Terraforma.
Na początku musimy pobrać i skonfigurować wykorzystywane providery. Robimy to za pomocą komendy init:
terraform init
Efekt wykonania powyższej komendy w folderze z plikiem main.tf wygląda tak:
Następnie możemy przejść do próby postawienia infrastruktury. W tym celu możemy skorzystać z kilku komend:
- validate – walidacja poprawności plików Terraforma
- fmt – formatowanie plików Terraforma
- plan – przygotowanie planu zmian – tutaj widoczne będzie, co faktycznie zmieni się w infrastrukturze (dodaj, usuń, zmień)
- apply – przygotowanie zmian i faktyczne wykonanie – w trakcie potwierdzamy wykonanie operacji.
Najbardziej istotna jest ostatnia komenda. Ona wykona faktyczne zmiany. Poniżej widoczny jest zrzut konsoli właśnie z wykonania tej komendy na pliku Terraforma pokazanym wyżej.
Terraform po wykonaniu komendy apply w pierwszej kolejności pokazuje zmiany, jakie zostaną wykonane. W tym przypadku, z racji tego, że uruchomiliśmy nasz skrypt po raz pierwszy, zobaczymy, że Terraform chce utworzyć grupę zasobów.
Pod listą zmian do wykonania dostałem pytanie, czy chcę wykonać zmiany. Tutaj odpowiedziałem „yes” i Terraform po chwili naniósł wcześniej wyświetlone zmiany. W zależności od ilości zasobów i ich typu może to zająć chwilę.
Plik stanu Terraform
Po wykonaniu zmian w infrastrukturze (komenda apply) Terraform tworzy plik stanu, w którym jest zapisany aktualny stan infrastruktury. Plik ten później jest wykorzystywany przez Terraforma do analizy zmian, jakie należy wykonać podczas kolejnego wykonywania komendy apply.
W przykładzie plik stanu wygląda tak:
Usunięcie infrastruktury
Terraform poza samym tworzeniem infrastruktury umożliwia nam jeszcze jej usunięcie. Wykonuje się to bardzo rzadko, ale warto wiedzieć, że coś takiego można zrobić. Przydaje się to się głównie przy testach. Aby usunąć zasoby wystarczy wykonać komendę:
terraform destroy
Podobnie jak przy apply zobaczymy to, co ma zostać usunięte i ponownie, jak wcześniej, musimy to potwierdzić. Tutaj Terraform wykorzystuje plik stanu i na jego podstawie usunie wcześniej utworzoną infrastrukturę.
Efekty wykonania destroy w konsoli wyglądają tak:
Jest on bardzo podobny do wykonania komendy apply. Tylko, że tutaj Terraform usuwa zasoby, zamiast je tworzyć, tak jak to było wyżej.
Podsumowanie
W tym wpisie pokazałem Ci, w jaki sposób zacząć pracę z Terraform i Azure. Skonfigurowaliśmy środowisko oraz utworzyliśmy pierwszy prosty zasób w Azure, którym była grupa zasobów. Na razie nie jest to dużo, ale już w kolejnym wpisie pokażę Ci, jak utworzyć trochę bardziej rozbudowaną infrastrukturę.
Jak podoba Ci się Terraform?
2 thoughts on “Terraform i Azure”