Legacy-"Click-Ops"-Ansätze für den Umgang mit modernen SaaS-Apps und Enterprise-Services werden für viele Organisationen schnell zu veralteten Ansätzen. Teams, die ihre Setups zukunftssicher gestalten und kodifizieren möchten, haben begonnen, GitOps-freundliche Ansätze zur Verwaltung dieser Systeme zu erkunden.
Und das zu Recht.
Einführung in Infrastructure as Code ("IaC") und Continuous Integration / Continuous Deployment (CI/CD)
Eine wachsende Anzahl von Organisationen bevorzugt es, Änderungen über Code oder Konfigurationsdefinitionsdateien zu implementieren, anstatt sich auf Administratoren zu verlassen, die in einer Konsole herumklicken – gemeinhin als ClickOps bekannt. Bei einem CI/CD- (oder "GitOps"-) Ansatz wird ein Sollzustand definiert, typischerweise in einer YAML-Datei oder einem anderen gut strukturierten Format, und die Datei wird in einen Git-Branch committed. Ein Pull Request wird eingereicht, um einen Test-, Review- und Genehmigungsworkflow einzuleiten, gefolgt von einer Reihe von Merges in einen Branch, in dem eine automatisierte Aktion die Änderung in Jamf Pro über API implementiert. Diese Techniken können auch verwendet werden, um eine Änderung durch Test- und User-Acceptance-Phasen zu verschieben, bevor etwas in der Produktion passiert, wo es eine ganze Flotte beeinflussen würde.
Die Definition von Konfiguration als Code ermöglicht gut definierte Code-Review-, Genehmigungs- und Pull-Request-Workflows, ähnlich wie bei der professionellen Softwareentwicklung. Dies bedeutet, dass Ihre Umgebung testbar, wiederholbar und skalierbar wird und gleichzeitig einen Weg bietet, zu einer früheren Version zurückzurollen, wenn eine Änderung unerwartete Probleme verursacht.
Sie können schnell iterieren und schnell zurückfahren, ohne eine Benutzeroberfläche zusammen mit Dokumentation durchsuchen zu müssen, um zu verstehen, wo der Fehler aufgetreten ist.
Unser Team sprach auf der JNUC 2025 in Denver über diesen gesamten Ansatz. In diesem Beitrag möchten wir etwas weiter gehen und Ihnen hoffentlich eine klare Grundlage geben, um selbst damit zu beginnen.
Zuerst, warum haben wir uns für Terraform entschieden?
Terraform ist ein sehr mächtiges Werkzeug in der Infrastructure-as-Code-Welt – es ist wendig und kann so gestaltet werden, dass es jede API darstellt, mit der Sie kommunizieren möchten. Als wir diesen ganzen Ansatz untersuchten, verbanden wir uns mit Deployment Theory, die bereits einen Terraform Provider für Jamf Pro entwickelt hatte. Unser Team begann, mit ihnen die Anwendung zu verstehen, und hat seitdem viel zu diesem Projekt beigetragen. Zusätzlich haben wir sogar eigene Provider für Apple Business und Apple School Manager sowie einen neuen Provider für die Jamf Platform API entwickelt.
Wir haben diese Komponenten dokumentiert und werden dies in Zukunft auf unserer Developer-Website weiter aktualisieren: https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers
Bevor wir viel weiter gehen, bitte testen Sie dies nicht in einer Produktionsinstanz. Terraform ist ein mächtiges Werkzeug, daher empfehlen wir, eine Testinstanz zu verwenden. Sie können bei Jamf Account eine Beta-Jamf-Pro-Instanz für diesen Zweck anfordern, wenn Sie keine Sandbox- oder Testinstanz haben.
Jetzt lassen Sie uns Sie beim Einstieg mit Terraform unterstützen, um einige Ressourcen in Jamf Pro zu erstellen.
Hinweis: Um die Dinge einfach zu halten, verwenden wir Basic Auth, aber Sie können in Zukunft zu OAuth wechseln.
Terraform installieren
Wir werden Homebrew verwenden, um Terraform aus Gründen der Einfachheit zu installieren. Wenn Sie Homebrew nicht installiert haben, folgen Sie bitte den Schritten hier.
Öffnen Sie Terminal und führen Sie die folgenden Schritte durch:
Zuerst greifen wir auf das offizielle HashiCorp-Verzeichnis zu.
brew tap hashicorp/tap
Nächstes werden wir Terraform installieren.
brew install hashicorp/tap/terraform
Abschließend werden wir validieren, dass alles ordnungsgemäß funktioniert hat. Das Ausführen dieses Befehls sollte Ihnen die Version von Terraform anzeigen, die Sie installiert haben. Wenn nicht, wiederholen Sie die obigen Schritte.
terraform -version
Natürlich hat HashiCorp ihre Installationsschritte zum Nachschlagen hier dokumentiert.
Visual Studio Code installieren
Sie können wirklich jeden Text-Editor oder Integrated Development Environment (IDE) zum Schreiben von Terraform verwenden. Wir haben jedoch festgestellt, dass Visual Studio Code Terraform sehr gut mit leicht verfügbaren Extensions für Syntax-Highlighting unterstützt. Da VS Code auch ein kostenloses Werkzeug ist, ist es ideal für uns, es für dieses Testen zu empfehlen.
Sie können VS Code hier herunterladen und die Installation auf Ihrem System durchführen.
Nachdem Sie VS Code installiert haben, können Sie auf die Registerkarte Extensions auf der linken Seite klicken (oder Shift + Command + X auf Ihrer Tastatur drücken) und nach "HashiCorp Terraform" suchen. Installieren Sie diese Extension, um vollständiges Terraform-Syntax-Highlighting zu erhalten.
Ein Terraform-Projekt starten
Eine Terraform-Projektdatei wird viele spezifische Elemente enthalten, die erforderlich sind, um loszulegen und Ihr Projekt aufzubauen. Die meisten relevanten Dateien enden mit der Dateierweiterung .tf oder etwas Ähnlichem wie .tfvars.
Es gibt viele Komponenten, die die Funktionalität ausmachen, aber wir werden diese zu einem späteren Zeitpunkt behandeln.
Der Einstieg hier kann sich etwas entmutigend anfühlen – es gibt viel zum Aufbau. Deshalb wollten wir dies etwas einfacher machen.
Zuerst öffnen wir Terminal und erstellen einen Ordner, um unser Terraform-Projekt zu speichern. Wir werden diesen Ordner auf Ihrer Benutzerebene für einfachen Zugriff erstellen.
mkdir jamf-terraform
Dann wechseln wir das Verzeichnis im Terminal zum neu erstellten Ordner
cd ~/jamf-terraform
Jetzt klonen wir unseren Template-Branch aus unserem Haupt-Terraform-Modul-Repository.
git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform
Danach haben Sie ein vollständig funktionierendes Template-Terraform-Projekt, das bereit ist, mit Jamf Pro und Jamf Security Cloud zu arbeiten.
Eine Variablendatei hinzufügen
Etwas, das Sie nicht in Ihrem Github-Repository landen möchten – Ihre Anmeldedaten oder Client-Geheimnisse. Glücklicherweise hat Terraform einen Weg dafür.
Öffnen Sie Ihren Text-Editor Ihrer Wahl und kopieren Sie den folgenden Text ein:
jamfpro_auth_method = "basic" ## oauth2 or basic
jamfpro_instance_url = "https://<tenant-name>.jamfcloud.com"
jamfpro_username = ""
jamfpro_password = ""
jamfpro_client_id = ""
jamfpro_client_secret = ""
## Jamf Protect Account Details
jamfprotect_url = "https://<tenant-name>.protect.jamfcloud.com"
jamfprotect_clientid = ""
jamfprotect_client_password = ""
## (Jamf Pro) General Settings Knobs ##
include_categories = false
Sie werden diese Datei terraform.tfvars nennen und auf der obersten Ebene Ihres neu geklonten Template-Repositorys speichern.
Jetzt können Sie damit beginnen, die Informationen in Ihre neu erstellte terraform.tfvars-Datei einzufügen. Ich habe die Authentifizierungsmethode auf Basic eingestellt, um die Dinge für Sie zu vereinfachen, aber beachten Sie, dass Sie dies in Zukunft in oauth2 ändern können. Also fügen Sie vorerst einfach Ihren lokalen Benutzernamen und Ihr Passwort in die Felder jamfpro_username bzw. jamfpro_password ein. Sie können auch Ihre Jamf Protect-Informationen eingeben – Sie müssen nur einen API-Client in Ihrem Protect-Tenant erstellen.
Wir haben auch einen Knopf für das eine enthaltene Modul mit diesem Template-Repository enthalten. Dies ist effektiv eine einfache boolesche Variable, die es uns ermöglicht zu deklarieren, ob wir ein bestimmtes Modul anwenden werden. Sie können diese Art von Ansatz mit den zusätzlichen Modulen, die Sie in Zukunft erstellen, verwenden oder einfach alle booleschen Anforderungen entfernen und einfach alles jedes Mal ausführen lassen.
Terraform State-Datei
Da wir noch keine echten Ressourcen in unserer Instanz committed haben – jetzt ist die perfekte Zeit, um darüber zu sprechen, was die State-Datei in Terraform ist.
Jedes Mal, wenn Sie Ressourcen über Terraform hinzufügen, ändern oder zerstören, werden diese Aktualisierungen in einer Datei namens terraform.tfstate gespeichert und dann in einer Datei namens terraform.tfstate.backup gesichert.
Dies ist, wie Terraform sich daran erinnert, was es in Ihrer Instanz getan hat, und es ist kritisch für die zukünftige Funktionalität. Jedes Mal, wenn Sie Terraform gegen eine Instanz ausführen, wird diese State-Datei konsultiert, bevor etwas getan wird. Jede State-Datei muss ihrer eigenen Instanz zugeordnet sein, daher ist es wichtig, sie getrennt zu halten, um die Funktionalität zu erhalten und das Kreuzen der Streams zu vermeiden.
Terraform ausführen
Jetzt befinden Sie sich in einer guten Position – Sie haben Terraform installiert, ein Template-Repository und Ihre Anmeldedaten in einer Variablendatei definiert.
Jetzt sind Sie bereit, unser Template-Modul gegen Ihre Test- oder Beta-Jamf-Pro-Instanz auszuführen. Dazu öffnen Sie Terminal und führen die folgenden Befehle aus.
terraform init -upgrade
Dies wird Terraform initialisieren und alle erforderlichen Provider auf die neuesten Versionen aktualisieren, für diejenigen, die dies zuvor auf ihren Maschinen verwendet haben, aber es wird auch die anfängliche Installation für die erforderlichen Terraform-Provider durchführen, wenn Sie völlig neu in dem Thema sind.
terraform fmt -recursive
Dies wird rekursiv jeden Terraform-Code in Ihrem lokal geklonten Branch formatieren, um sicherzustellen, dass alles korrekt aussieht und ordnungsgemäß funktioniert.
terraform plan
Dies wird Ihre Test-Jamf-Pro-Instanz, Ihre Terraform-State-Datei und Ihren Terraform-Modul-Code auf alle Änderungen oder neue Dinge überprüfen, die auf Ihrer Instanz angewendet oder entfernt werden sollen, und gibt einen vollständigen Plan oder Überblick darüber zurück, was passieren wird, wenn Sie das Modul vollständig ausführen.
terraform apply
Dies wird zuerst den Plan ausführen und melden, was hinzugefügt, geändert oder zerstört wird. Es wird Sie dann auffordern, diese Aktion zu bestätigen. Das Feld akzeptiert nur 2 Eingaben: ja oder nein.
terraform apply -parallelism=1
Dies zwingt alle Ressourcen, die erstellt werden, ihre Reihe zu nehmen und einzeln zu gehen. Da viele SaaS-Apps Systeme haben, um potenzielle Angriffe zu erkennen, ist dies manchmal die beste Art, Terraform auszuführen.
terraform destroy -parallelism=1
Dies wird alle erstellten Ressourcen zerstören, die in Ihrer Terraform-State-Datei referenziert werden.
Jede nachfolgende Ausführung der Befehle plan, apply oder destroy konsultiert Ihre State-Datei, bewertet, was hinzugefügt, geändert oder zerstört werden muss, und führt dann die richtige Aktion aus.
Dieses spezielle Modul ausführen
Wenn Sie das Template-Modul ausführen, das wir enthalten haben, werden 7 Kategorien in Ihrem Jamf Pro benannt nach jeder Apollo-Mission von 11-17 als einfacher Test erstellt.
Sobald diese hinzugefügt sind, können Sie sie leicht mit den obigen Befehlen zerstören.
Das größere Ziel hier ist, Ihnen die Struktur von Terraform zu zeigen, damit Sie beginnen können, relevante Module für Ihre Umgebung zu erstellen, was mich zum nächsten Abschnitt dieses Beitrags bringt.
Die Anatomie von Terraform
Der Kern der Funktionalität hier ist die Hierarchie von .tf-Dateien. Die Root-Level-main.tf ruft die Kind-Modul-main.tf auf, die auf die .tfvars-Dateien und variables.tf-Dateien verweist. Hier ist eine vollständige Aufschlüsselung des Threads und der Kommunikationsreihenfolge:
Wenn Sie terraform apply ausführen:
State-Datei wird konsultiert.
Root main.tf wird auf Kind-Module bewertet, die angefordert werden.
Root variables.tf wird auf relevante Variablen für die angewendeten Kind-Module gescannt.
terraform.tfvars wird auf alle relevanten Variablen zum Ausführen jedes Kind-Moduls gescannt.
Kind-Modul-main.tf-Dateien werden dann aufgerufen und ausgeführt, wobei auf ihre eigenen lokalen variables.tf-Dateien für relevante lokale Kind-Modul-Variablen verwiesen wird.
Jede Ressource wird dann erstellt und Referenzen werden in terraform.tfstate gespeichert.
Terraform wird Erfolg oder Misserfolg zusammen mit relevanten Codes und Antwortnachrichten zurückmelden, die Sie zur Fehlerbehebung von Problemen verwenden können.
Dinge zum Beachten
Wenn Sie mit dem Erstellen Ihrer eigenen Module beginnen, können Sie das Template-Modul kopieren, das wir enthalten haben, und es nach Ihren Bedürfnissen ändern.
Jedes Kind-Modul muss seine eigenen main.tf- und variables.tf-Dateien haben.
Jedes Kind-Modul muss in der Root-Level-main.tf dargestellt sein.
Lesen Sie sorgfältig durch das Modul im Template-Repository und schauen Sie sich jeden Referenzpunkt an, damit Sie vollständig verstehen, wie jedes Stück zusammenarbeitet, um das Ziel zu erreichen.
Sie können boolesche Operationen (auch als Knöpfe bekannt) in Ihrer terraform.tfvars-Datei verwenden, um Kind-Module aufzurufen, oder einfach lassen Sie sie, um immer aufgerufen zu werden, wenn Sie terraform apply ausführen.
Sie können auch Module so gestalten, dass sie von einer Variablen abhängig sind, die ausgefüllt wird, oder Sie können sogar einfache Inklusions- oder Ausschlussanweisungen einrichten, um zu bestimmen, wann Module basierend auf Ihren eigenen Kriterien ausgeführt werden.
Terraform ist ein sehr mächtiges Werkzeug mit vielen eingebauten Funktionen, die Sie verwenden können. Einige davon werden notwendig sein, wenn Sie spezifische Funktionen erstellen, und einige werden Sie nie verwenden, aber sie sind alle sehr gut dokumentiert auf https://developer.hashicorp.com/terraform