Starsze podejścia "Click-Ops" do radzenia sobie z nowoczesnymi aplikacjami SaaS i usługami Enterprise szybko stają się podejściami starszymi dla wielu organizacji. Zespoły zajmujące się przyszłościowym zapewnieniem i kodowaniem swoich konfiguracji zaczęły szukać podejść przyjaznych GitOps do zarządzania tymi systemami.
Z dobrym powodem.
Wprowadzenie do Infrastructure as Code ("IaC") i Continuous Integration / Continuous Deployment (CI/CD)
Rosnąca liczba organizacji woli wdrażać zmiany za pośrednictwem kodu lub plików definicji konfiguracji, zamiast polegać na administratorach klikających wokół konsoli, inaczej zwykle znanego jako ClickOps. W podejściu CI/CD (lub "GitOps"), pożądany stan jest zdefiniowany, zazwyczaj w pliku YAML lub innym dobrze ustrukturowanym formacie, i plik jest zatwierdzony do gałęzi Git. Pull request jest przesłany w celu zainicjowania przepływu pracy testowania, przeglądu i zatwierdzenia, następnie sekwencja scalania się do gałęzi, w której zautomatyzowana akcja wdrażająca zmianę w Jamf Pro za pośrednictwem API. Te techniki mogą być również używane do przeniesienia zmiany przez etapy testowe i akceptacji użytkownika, zanim cokolwiek zdarzy się w produkcji, gdzie będzie to miało wpływ na całą flotę.
Definiowanie konfiguracji jako kodu pozwala na dobrze zdefiniowany kod przeglądowy, zatwierdzenie i przepływy pracy pull requesta w ten sam sposób, co w profesjonalnym tworzeniu oprogramowania. Oznacza to, że Twoje środowisko staje się testowalne, powtarzalne i skalowalne, jednocześnie zapewniając ścieżkę do wycofania się do poprzedniej wersji, jeśli zmiana powoduje nieoczekiwane problemy.
Możesz szybko iterować i szybko cofnąć, bez konieczności przeszukiwania interfejsu użytkownika obok dokumentacji, aby zrozumieć, gdzie doszło do błędu.
Nasz zespół mówił o tym całym podejściu na JNUC 2025 w Denver. W tym artykule zamierzamy pójść nieco dalej i mamy nadzieję, że da Ci jasną drogę, aby sam się w to zagłębiać.
Po pierwsze, dlaczego wybraliśmy Terraform?
Terraform to bardzo potężne narzędzie w świecie Infrastructure as Code — jest zwinne i może być wytworzone tak, aby mapować do każdego API, do którego chciałbyś rozmawiać. Gdy zaczęliśmy patrzeć na to całe podejście, połączyliśmy się z Deployment Theory, którzy już zbudowali dostawcę Terraform dla Jamf Pro. Nasz zespół zaczął pracować z nimi, aby zrozumieć zastosowanie, i od tego czasu wniósł wiele na ten projekt. Dodatkowo zbudowaliśmy nawet własnych dostawców dla Apple Business i Apple School Manager, a także zbudowaliśmy nowego dostawcę dla API platformy Jamf.
Udokumentowaliśmy te elementy i będziemy je aktualizować w przyszłości na naszej stronie deweloperów tutaj: https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers
Zanim pójdziemy dalej, prosimy nie testować tego w instancji produkcyjnej. Terraform to potężne narzędzie, więc zalecamy korzystanie z instancji testowej. Możesz uzyskać instancję beta Jamf Pro z Jamf Account, aby użyć jej do tego celu, jeśli nie masz instancji piaskownicy lub testowej.
Teraz gotowy, aby rozpocząć korzystanie z Terraform do budowania zasobów w Jamf Pro.
Uwaga: Aby utrzymać rzeczy proste, będziemy używać auth podstawowy, ale możesz przełączyć się na OAuth w przyszłości.
Instalacja Terraform
Będziemy używać Homebrew do zainstalowania Terraform dla prostoty. Jeśli nie masz zainstalowanego Homebrew, postępuj zgodnie z krokami tutaj.
Otwórz Terminal i przejdź przez następujące kroki:
Po pierwsze, uzyskamy dostęp do oficjalnego katalogu HashiCorp.
brew tap hashicorp/tap
Następnie zainstalujemy Terraform.
brew install hashicorp/tap/terraform
Na koniec zwalidujemy, że wszystko działało prawidłowo. Uruchomienie tego polecenia powinno wyświetlić wersję zainstalowanego Terraform. Jeśli to nie robi, ponów powyższe kroki.
terraform -version
Oczywiście HashiCorp ma swoje kroki instalacji udokumentowane jako odniesienie tutaj.
Instalacja Visual Studio Code
Możesz naprawdę użyć dowolnego edytora tekstowego lub Integrated Development Environment (IDE) do pisania Terraform. Jednak stwierdziliśmy, że Visual Studio Code bardzo dobrze obsługuje Terraform z rozszerzeniami do podświetlenia składni, które są łatwo dostępne. Ponieważ VS Code jest również bezpłatnym narzędziem, sprawia to idealne dla nas, aby polecić dla tego testowania.
Możesz pobrać VS Code tutaj i przejść przez instalację w systemie.
Po zainstalowaniu VS Code, możesz kliknąć na kartę Rozszerzenia po lewej stronie (lub wpisać Shift + Command + X na klawiaturze) i wyszukać "HashiCorp Terraform." Idź naprzód i zainstaluj to rozszerzenie, aby uzyskać pełne podświetlenie składni Terraform.
Uruchamianie projektu Terraform
Plik projektu Terraform będzie zawierać wiele konkretnych elementów, które są wymagane, aby ruszyć i zacząć budować projekt. Większość odpowiednich plików będzie kończyć się rozszerzeniem pliku .tf lub czymś podobnym jak .tfvars.
Istnieje wiele komponentów, które tworzą funkcjonalność tutaj, ale omówimy je w późniejszym czasie.
Rozpoczęcie tutaj może wydawać się dość zastraszające — jest wiele do ruszyć. Więc chcieliśmy to ułatwić.
Po pierwsze, otwórz Terminal i utwórz folder, abyśmy mogli przechowywać nasz projekt Terraform. Utworzymy ten folder na poziomie użytkownika, aby łatwo uzyskać dostęp.
mkdir jamf-terraform
Następnie, zmienimy katalog w Terminal do nowo utworzonego folderu
cd ~/jamf-terraform
Teraz sklonujemy naszą gałąź szablonu z naszego głównego repozytorium modułu Terraform.
git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform
Po zrobieniu tego będziesz mieć w pełni funkcjonalny szablon projektu Terraform gotowy do pracy dla Jamf Pro i Jamf Security Cloud.
Dodawanie pliku zmiennej
Coś, czego nie chcesz skończyć w repozytorium GitHub — poświadczenia logowania lub tajemnice klienta. Na szczęście Terraform ma dla tego ścieżkę.
Otwórz edytor tekstowy i wklej następujący tekst:
jamfpro_auth_method = "basic" ## oauth2 lub basic
jamfpro_instance_url = "https://<tenant-name>.jamfcloud.com"
jamfpro_username = ""
jamfpro_password = ""
jamfpro_client_id = ""
jamfpro_client_secret = ""
## Szczegóły konta Jamf Protect
jamfprotect_url = "https://<tenant-name>.protect.jamfcloud.com"
jamfprotect_clientid = ""
jamfprotect_client_password = ""
## (Jamf Pro) Gałązki ustawień ogólnych ##
include_categories = false
Nazwiesz ten plik terraform.tfvars i zapiszesz go na najwyższym poziomie nowo sklonowanego repozytorium szablonu.
Teraz możesz zacząć wypełniać informacje w nowo utworzonym pliku terraform.tfvars. Ustawiłem metodę uwierzytelniania na podstawową, aby uprościć dla Ciebie, ale wiesz, że możesz zmienić na oauth2 w przyszłości. Więc na razie po prostu wpiszesz lokalną nazwę użytkownika i hasło do pól jamfpro_username i jamfpro_password odpowiednio. Możesz również wpisać informacje Jamf Protect — będziesz musiał po prostu stworzyć klienta API w dzierżawie Protect.
Umieściliśmy również gałązkę dla jednego dołączonego modułu z tym repozytorium szablonu. To jest zasadniczo prostą zmienną boolowską, która pozwala nam zadeklarować, czy będziemy stosować konkretny moduł. Możesz wybrać użycie tego rodzaju podejścia z dodatkowymi modułami, które budujesz w przyszłości, lub po prostu usuń wszystkie wymagania boolowskie i po prostu pozwól wszystkiemu uruchamiać się za każdym razem.
Plik stanu Terraform
Ponieważ nie zatwierdziliśmy żadnych rzeczywistych zasobów do naszej instancji — teraz jest doskonały czas, aby poruszyć temat pliku stanu w Terraform.
Za każdym razem, gdy dodajesz, zmieniasz lub niszczysz zasoby za pośrednictwem Terraform, te aktualizacje są zapisywane w pliku zwanym terraform.tfstate i następnie kopia zapasowa do pliku zwanego terraform.tfstate.backup.
To jak Terraform pamięta, co zrobiło w twojej instancji i jest to krytyczne dla funkcjonalności przyszłości. Za każdym razem, gdy uruchomisz Terraform dla instancji, ten plik stanu jest konsultowany, zanim cokolwiek będzie zrobione. Każdy plik stanu musi być skojarzony ze swoją instancją, więc ważne jest, aby je oddzielić, aby utrzymać funkcjonalność i uniknąć przepuszczenia strumieni.
Uruchamianie Terraform
Teraz jesteś na dobrym miejscu — masz zainstalowany Terraform, szablon repozytorium i zdefiniowane poświadczenia w pliku zmiennych.
Teraz jesteś gotów do uruchomienia naszego modułu szablonu dla twojej instancji testowej lub beta Jamf Pro. Aby to zrobić, otwórz Terminal i uruchom następujące polecenia.
terraform init -upgrade
To zainicjalizuje Terraform i uaktualni wszelkie wymagane dostawcy do najnowszych wersji dla każdego, kto używał tego wcześniej na swoich maszynach, ale będzie to również robić instalację początkową dla wymaganych dostawców Terraform, jeśli jesteś zupełnie nowy w temacie.
terraform fmt -recursive
To będzie rekursywnie formatować wszelki kod Terraform w twoim lokalnym sklonowanym gałęzi, aby upewnić się, że to wszystko będzie wyglądać prawidłowo i będzie działać prawidłowo.
terraform plan
To będzie patrzeć na testową instancję Jamf Pro, plik stanu Terraform i kod modułu Terraform dla wszelkich zmian lub nowych rzeczy do zastosowania lub usunięcia z instancji i zwrócić pełny plan lub przegląd tego, co będzie się dziać, gdy pełni uruchomisz moduł.
terraform apply
To będzie pierwsze uruchomienie planu i raport z powrotem, co zostanie dodane, zmienione lub zniszczone. Następnie poprosi Cię o potwierdzenie tej akcji. Pole będzie akceptować tylko 2 dane wejściowe: tak lub nie.
terraform apply -parallelism=1
To zmusi wszystkie zasoby, które są tworzone, aby cierpliwie czekać i przejść jeden na raz. Ponieważ wiele aplikacji SaaS ma systemy na miejscu do wykrywania potencjalnych ataków, czasami jest to najlepszy sposób podejścia do uruchamiania Terraform.
terraform destroy -parallelism=1
To zniszczy wszelkie utworzone zasoby, które są przywoływane w pliku stanu Terraform.
Każde kolejne uruchomienie dowolnych poleceń plan, apply, or destroy będzie konsultować plik stanu, oceniać, co musi być dodane, zmienione lub zniszczone, a następnie wykonać właściwą akcję.
Uruchamianie tego konkretnego modułu
Gdy uruchomisz dołączony szablon modułu, utworzy 7 kategorii w Jamf Pro nazwanych dla każdej misji Apollo z 11-17 jako prosty test.
Po dodaniu ich, możesz łatwo je zniszczyć, korzystając z powyższych poleceń.
Większym celem tutaj jest pokazanie Ci struktury Terraform, abyś mógł zacząć budować istotne moduły do środowiska, które przenosi mnie do następnej sekcji tego artykułu.
Anatomia Terraform
Jądrem funkcjonalności tutaj jest hierarchia plików .tf. Plik main.tf na poziomie root wzywa main.tf modułu dziecka, który odnosi się do plików .tfvars i plików variables.tf. Oto pełny przegląd wątku i kolejności komunikacji:
Gdy uruchamiasz terraform apply:
plik stanu jest konsultowany.
Root main.tf jest oceniany dla modułów dziecka, które są wymagane.
Root variables.tf jest skanowany dla odpowiednich zmiennych dla wdrażanych modułów dziecka.
terraform.tfvars jest skanowany dla wszystkich odpowiednich zmiennych do uruchamiania każdego modułu dziecka.
Plik modułu dziecka main.tf jest następnie wywoływany i wykonywany, odwołując się do ich własnego lokalnego pliku variables.tf dla odpowiednich zmiennych lokalnego modułu dziecka.
Każdy zasób jest następnie utworzony i odniesienia są zapisywane do terraform.tfstate.
Terraform będzie raportować powodzenie lub niepowodzenie wraz z odpowiednimi kodami i wiadomościami odpowiedzi do wykorzystania w rozwiązywaniu problemów, jeśli to konieczne.
Rzeczy do pamiętania
Gdy zaczniesz budować swoje własne moduły, możesz skopiować dołączony moduł szablonu i zmienić go, aby odpowiadał Twoim potrzebom.
Każdy moduł dziecka musi mieć własny plik main.tf i variables.tf.
Każdy moduł dziecka musi być reprezentowany w main.tf na poziomie root.
Ostrożnie czytaj przez moduł w repozytorium szablonu i szukaj każdego punktu odniesienia, aby w pełni zrozumiał, jak każdy kawałek pracuje razem w celu osiągnięcia celu.
Możesz użyć operacji boolowskich (znane również jako gałęzki) w pliku terraform.tfvars, aby wezwać moduły dziecka lub po prostu pozostawić je, aby zawsze byli wywoływani za każdym razem, gdy uruchamiasz terraform apply.
Możesz również mieć moduł wzywa być zależnym od zmiennej, która jest zaludniona, lub możesz nawet ustawić proste instrukcje inkluzji lub wyłączenia, aby określić, kiedy moduły biegą na podstawie Twoich własnych kryteriów.
Terraform to bardzo potężne narzędzie z wiele wbudowanych funkcji, które możesz użyć. Niektóre z nich będą konieczne, gdy budujesz określone funkcje i niektóre nigdy nie będą używać, ale wszyscy są bardzo dobrze udokumentowani na https://developer.hashicorp.com/terraform