Jamf Concepts

Handleidingen

Introductie tot het beheren van Jamf-configuraties met Terraform

~10 min read

Verouderde "Click-Ops"-benaderingen voor het omgaan met moderne SaaS-apps en Enterprise-services worden snel legacy-benaderingen voor veel organisaties. Teams die zich bezighouden met toekomstbestendigheid en het codificeren van hun setups zijn begonnen te kijken naar GitOps-vriendelijke benaderingen om deze systemen te beheren.

En terecht.

Introductie tot Infrastructure as Code ("IaC") en Continuous Integration / Continuous Deployment (CI/CD)

Een toenemend aantal organisaties geeft er de voorkeur aan wijzigingen te implementeren via code of configuratiedefinitiebestanden in plaats van te vertrouwen op beheerders die rondklikken in een console, ook wel bekend als ClickOps. In een CI/CD (of "GitOps") benadering wordt een gewenste staat gedefinieerd, typisch in een YAML-bestand of een ander goed gestructureerd formaat, en wordt het bestand gecommit naar een Git-branch. Een pull request wordt ingediend om een test-, review- en goedkeuringsworkflow te initiëren, gevolgd door een reeks merges naar een branch waar een geautomatiseerde actie de wijziging implementeert in Jamf Pro via API. Deze technieken kunnen ook worden gebruikt om een wijziging door test- en gebruikersacceptatiefasen te bewegen voordat er iets gebeurt in productie waar het een hele vloot zal beïnvloeden.

Configuratie als code definiëren maakt goed gedefinieerde code review, goedkeuring en pull request workflows mogelijk, vergelijkbaar met professionele softwareontwikkeling. Dit betekent dat uw omgeving testbaar, herhaalbaar en schaalbaar wordt, terwijl het ook een pad biedt om terug te draaien naar een vorige versie als een wijziging onverwachte problemen veroorzaakt.

U kunt snel itereren en snel terugdraaien zonder door een gebruikersinterface naast documentatie te hoeven kammen om te begrijpen waar de fout is opgetreden.

Ons team sprak over deze hele aanpak op JNUC 2025 in Denver. In dit artikel willen we wat verder gaan en u hopelijk een duidelijke aanloop geven om hier zelf in te duiken.

Ten eerste, waarom kozen we voor Terraform?

Terraform is een zeer krachtige tool in de Infrastructure as Code-wereld - het is wendbaar en kan worden gemaakt om met elke API te communiceren die u maar wilt. Toen we begonnen met deze hele aanpak, kwamen we in contact met Deployment Theory die al een Terraform Provider voor Jamf Pro had gebouwd. Ons team begon met hen samen te werken om de toepassing ervan te begrijpen en heeft sindsdien behoorlijk wat bijgedragen aan dat project. Daarnaast hebben we zelfs onze eigen providers gebouwd voor Apple Business en Apple School Manager en ook een nieuwe provider voor de Jamf Platform API gebouwd.

We hebben deze onderdelen gedocumenteerd en zullen dit in de toekomst blijven bijwerken op onze Developer-site hier: https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers

Voordat we verder gaan, test dit alstublieft niet in een productie-instantie. Terraform is een krachtige tool dus we raden aan een testinstantie te gebruiken. U kunt een beta Jamf Pro-instantie verkrijgen via Jamf Account om hiervoor te gebruiken als u geen sandbox of testinstantie heeft.

Nu, laten we u aan de slag krijgen met Terraform om wat resources te bouwen in Jamf Pro.

Let op: Om het eenvoudig te houden, gebruiken we basic auth maar u kunt in de toekomst overschakelen naar OAuth.

Terraform installeren

We gebruiken Homebrew om Terraform te installeren omwille van de eenvoud. Als u Homebrew niet heeft geïnstalleerd, volg dan de stappen hier.

Open Terminal en doorloop de volgende stappen:

Eerst openen we de officiële HashiCorp-directory.

brew tap hashicorp/tap

Vervolgens installeren we Terraform.

brew install hashicorp/tap/terraform

Tot slot valideren we dat alles correct heeft gewerkt. Het uitvoeren van dit commando zou u de versie van Terraform moeten tonen die u heeft geïnstalleerd. Als dat niet het geval is, probeer de bovenstaande stappen opnieuw.

terraform -version

Natuurlijk heeft HashiCorp hun installatiestappen gedocumenteerd ter referentie hier.

Visual Studio Code installeren

U kunt eigenlijk elke teksteditor of Integrated Development Environment (IDE) gebruiken voor het schrijven van Terraform. We hebben echter gemerkt dat Visual Studio Code Terraform zeer goed ondersteunt met extensies voor syntax highlighting die direct beschikbaar zijn. Aangezien VS Code ook een gratis tool is, is het ideaal voor ons om aan te bevelen voor deze test.

U kunt VS Code hier downloaden en de installatie op uw systeem doorlopen.

Zodra u VS Code heeft geïnstalleerd, kunt u op het Extensions-tabblad aan de linkerkant klikken (of Shift + Command + X op uw toetsenbord typen) en zoeken naar "HashiCorp Terraform." Ga verder en installeer deze extensie om volledige Terraform syntax highlighting te krijgen.

Een Terraform-project starten

Een Terraform Project-bestand bevat veel specifieke items die nodig zijn om aan de slag te gaan en uw project op te bouwen. De meeste relevante bestanden eindigen met de bestandsextensie .tf of iets vergelijkbaars zoals .tfvars.

Er zijn veel componenten die de functionaliteit hier maken, maar die behandelen we op een later moment.

Aan de slag gaan kan een beetje ontmoedigend aanvoelen - er is veel om op te zetten en te beginnen. Dus wilden we dit wat makkelijker maken.

Laten we eerst Terminal openen en een map maken zodat we ons Terraform-project kunnen opslaan. We maken deze map op uw gebruikersniveau voor gemakkelijke toegang.

mkdir jamf-terraform

Dan wisselen we van directory in Terminal naar de nieuw aangemaakte map

cd ~/jamf-terraform

Nu klonen we onze template-branch van onze hoofd Terraform-module-repo.

git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform

Nadat u dit heeft gedaan, heeft u een volledig functioneel template Terraform-project klaar voor Jamf Pro en Jamf Security Cloud.

Een variabelenbestand toevoegen

Iets dat u niet in uw Github-repo wilt laten belanden - uw inloggegevens of client secrets. Gelukkig heeft Terraform hier een pad voor.

Open uw teksteditor naar keuze en kopieer de volgende tekst erin:

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

U noemt dit bestand terraform.tfvars en slaat het op in het hoogste niveau van uw nieuw gekloonde template-repo.

Nu kunt u de informatie in uw nieuw aangemaakte terraform.tfvars-bestand invullen. Ik heb de authenticatiemethode op basic gezet om het voor u te vereenvoudigen, maar weet dat u in de toekomst kunt wijzigen naar oauth2. Dus voor nu voert u gewoon uw lokale gebruikersnaam en wachtwoord in in de jamfpro_username en jamfpro_password velden respectievelijk. U kunt ook uw Jamf Protect-informatie invoeren - u hoeft alleen een API Client in uw Protect-tenant aan te maken.

We hebben ook een knop toegevoegd voor de ene meegeleverde module met deze template-repo. Dit is effectief een eenvoudige booleaanse variabele waarmee we kunnen declareren of we een bepaalde module toepassen. U kunt ervoor kiezen dit soort aanpak te gebruiken met de extra modules die u in de toekomst bouwt of simpelweg alle booleaanse vereisten verwijderen en alles elke keer laten draaien.

Terraform State-bestand

Aangezien we nog geen echte resources naar onze instantie hebben gecommit - is nu het perfecte moment om te praten over wat het state-bestand is in Terraform.

Elke keer dat u resources toevoegt, wijzigt of vernietigt via Terraform, worden die updates opgeslagen in een bestand genaamd terraform.tfstate en vervolgens geback-upt naar een bestand genaamd terraform.tfstate.backup.

Dit is hoe Terraform onthoudt wat het in uw instantie heeft gedaan en het is cruciaal voor toekomstige functionaliteit. Elke keer dat u Terraform tegen een instantie uitvoert, wordt dit state-bestand geraadpleegd voordat er iets gebeurt. Elk state-bestand moet worden geassocieerd met zijn eigen instantie, dus het is belangrijk om ze gescheiden te houden om functionaliteit te behouden en te voorkomen dat de streams kruisen.

Terraform uitvoeren

Nu bent u in een goede positie - u heeft Terraform geïnstalleerd, een template-repo en uw credentials gedefinieerd in een variabelenbestand.

Nu bent u klaar om onze template-module uit te voeren tegen uw test- of beta Jamf Pro-instantie. Om dit te doen, opent u Terminal en voert u de volgende commando's uit.

terraform init -upgrade

Dit initialiseert Terraform en upgradet alle vereiste providers naar de nieuwste versies voor iedereen die dit eerder op hun machines heeft gebruikt, maar het zal ook de initiële installatie doen voor de vereiste Terraform-providers als u helemaal nieuw bent met het onderwerp.

terraform fmt -recursive

Dit formatteert recursief alle Terraform-code in uw lokale gekloonde branch om ervoor te zorgen dat alles er correct uitziet en goed functioneert.

terraform plan

Dit kijkt naar uw test Jamf Pro-instantie, uw Terraform state-bestand en uw Terraform-modulecode voor eventuele wijzigingen of nieuwe dingen om toe te passen of te verwijderen van uw instantie en geeft een volledig plan of overzicht van wat er zal gebeuren wanneer u de module volledig uitvoert.

terraform apply

Dit voert eerst het plan uit en rapporteert terug wat zal worden toegevoegd, gewijzigd of vernietigd. Het vraagt u vervolgens deze actie te bevestigen. Het veld accepteert slechts 2 invoeren: yes of no.

terraform apply -parallelism=1

Dit dwingt alle resources die worden aangemaakt om beurten te nemen en één voor één te gaan. Aangezien veel SaaS-apps systemen hebben om potentiële aanvallen te detecteren, is dit soms de beste manier om Terraform uit te voeren.

terraform destroy -parallelism=1

Dit vernietigt alle aangemaakte resources die worden gerefereerd in uw state-bestand in Terraform.

Elke volgende uitvoering van de plan, apply, of destroy commando's raadpleegt uw state-bestand, beoordeelt wat moet worden toegevoegd, gewijzigd of vernietigd en voert vervolgens de juiste actie uit.

Deze specifieke module uitvoeren

Wanneer u de template-module uitvoert die we hebben meegeleverd, maakt het 7 categorieën aan in uw Jamf Pro, genoemd naar elke Apollo-missie van 11-17 als een eenvoudige test.

Zodra deze zijn toegevoegd, kunt u ze gemakkelijk vernietigen met de bovenstaande commando's.

Het grotere doel hier is u de structuur van Terraform te tonen zodat u kunt beginnen met het bouwen van relevante modules voor uw omgeving, wat me brengt bij het volgende deel van dit artikel.

De anatomie van Terraform

De kern van de functionaliteit hier is de hiërarchie van .tf-bestanden. De root-level main.tf roept naar de child-module main.tf die verwijst naar de .tfvars-bestanden en variables.tf-bestanden. Hier is een volledige uiteenzetting van de thread en communicatievolgorde:

Wanneer u terraform apply uitvoert:

state-bestand wordt geraadpleegd.

Root main.tf wordt beoordeeld voor child-modules die worden aangevraagd.

Root variables.tf wordt gescand voor relevante variabelen voor de child-modules die worden toegepast.

terraform.tfvars wordt gescand voor alle relevante variabelen voor het uitvoeren van elke child-module.

Child-module main.tf-bestanden worden dan aangeroepen en uitgevoerd met verwijzing naar hun eigen lokale variables.tf-bestanden voor relevante lokale child-module-variabelen.

Elke resource wordt dan aangemaakt en referenties worden opgeslagen in terraform.tfstate.

Terraform rapporteert terug succes of falen samen met relevante codes en responsberichten die u kunt gebruiken bij het troubleshooten van problemen indien nodig.

Dingen om in gedachten te houden

Wanneer u begint met het bouwen van uw eigen modules, kunt u de template-module die we hebben meegeleverd kopiëren en aanpassen aan uw behoeften.

Elke child-module moet zijn eigen main.tf en variables.tf bestanden hebben.

Elke child-module moet worden gerepresenteerd in de root-level main.tf.

Lees zorgvuldig door de module in de template-repo en zoek naar elk referentiepunt zodat u volledig begrijpt hoe elk onderdeel samenwerkt om het doel te bereiken.

U kunt booleaanse operaties (ook wel knoppen genoemd) gebruiken in uw terraform.tfvars-bestand om child-modules aan te roepen of ze simpelweg laten als altijd aangeroepen wanneer u terraform apply uitvoert.

U kunt ook uw module-aanroepen afhankelijk maken van een variabele die wordt ingevuld of u kunt zelfs eenvoudige inclusie- of exclusieverklaringen opzetten om te bepalen wanneer modules draaien op basis van uw eigen criteria.

Terraform is een zeer krachtige tool met veel ingebouwde functies die u kunt gebruiken. Sommige hiervan zijn noodzakelijk wanneer u specifieke functies bouwt en sommige zult u nooit gebruiken, maar ze zijn allemaal zeer goed gedocumenteerd op https://developer.hashicorp.com/terraform

Referenties

Deployment Theory Jamf Pro Provider

Jamf Platform Provider

Jamf Security Provider

Jamf AutoUpdate Provider

Jamf Created Example and Reference Modules