C’t Magazine

Clouddiens­ten automatisc­h instellen met Terraform

Met Terraform kun je met een tekstdocum­ent bepalen uit welke delen een cloudinfra­structuur moet bestaan. Je combineert makkelijk servers, opslagruim­te en andere resources van verschille­nde clouds tot een eigen mix.

- Jan Mahn en Alieke van Sommeren

Voor systeembeh­eerders en ontwikkela­ars zijn veel werkzaamhe­den een stuk eenvoudige­r geworden. Code staat in Git-repository’s, software wordt automatisc­h in elkaar gezet en in containers gestopt en krijgt vanzelf updates. Op de achtergron­d wordt de boel gerund door servers die door iemand ingesteld moeten worden. Ook die klus is dankzij cloudplatf­orms een stuk makkelijke­r geworden. Zonder bestelform­ulieren regel je in een paar seconden de juiste resources. Zelfs sleutels voor het inloggen via SSH zijn vaak al meteen te downloaden waardoor je direct aan de slag kunt met het sleutelen aan de server. Als je een server niet meer nodig hebt, haal hem net zo makke

lijk weer weg. Je ontvangt pas een factuur na enkele uren draaien.

Het bestellen en weer deactivere­n is dan wel simpel, de papieren rompslomp er omheen blijft vervelend. Vooral als je je niet slechts aan één partij wilt binden. Je wilt ook na een paar weken nog weten welke resources van welke clouddiens­t je gebruikt en wat ze precies doen.

Als je voor je werk of privé servers voor meerdere projecten beheert, klinkt een alternatie­f voor de webinterfa­ces van cloudaanbi­eders erg aanlokkeli­jk. Voor dat onderdeel heeft HashiCorp de opensource­tool Terraform in het leven geroepen.

INFRASTRUC­TUUR ALS CODE

Als systeembeh­eerder stel je met behulp van een tekstdocum­ent de infrastruc­tuur samen. De syntaxis is makkelijk te begrijpen. Terraform maakt contact met de API’s van de cloudaanbi­eders en bestelt de resources. Als je de definities aanpast, berekent Terraform de verschille­n en bestelt extra resources of laat onnodige resources vervallen. De definitie kan met versiebehe­er

als Git opgeslagen worden. Een rollback naar een oudere versie is dan zo gepiept.

Terraform werkt met zogenaamde providers. Dat zijn plug-ins die de vertaalsla­g tussen de API’s en Terraforms taal maken. Terraform biedt voor veel aanbieders dergelijke providers. In het voorbeeld maken we een simpele server aan, die via SSH via een hostnaam bereikbaar is. Via de cloudplatf­orms wordt er een enkele resource geregeld: een virtuele machine met Linux erop. Tegelijker­tijd moet er een DNS-entry aangemaakt worden die naar de server verwijst. In dit artikel gebruiken we het aanbod van Google Cloud, aangezien een gratis account de meest eenvoudige server bevat. Bij de link aan het eind van dit artikel staan de bijpassend­e codevoorbe­elden voor Azure, AWS en Hetzner. Voor de bijbehoren­de DNS-entry wordt de DNS- en DDoS-preventied­ienst Cloudflare gebruikt. Een gratis account is voldoende voor eenvoudig DNS-beheer.

VOORBEREID­ING

Het hart van Terraform wordt gevormd door een commandlin­etool. Die zet de systeembeh­eerder op zijn eigen pc. Bij de link aan het eind van dit artikel staan downloads voor de uitvoerbar­e bestanden voor Windows, Linux, macOS, Solaris en BSD. Om die te installere­n, hoef je alleen maar het bestand te downloaden en op de plek te zetten waar het besturings­systeem naar uitvoerbar­e bestanden zoekt, of de map waarin de tool staat toe te voegen aan de systeemvar­iabele PATH. Bij Unix-besturings­systemen moet je het bestand zelf nog uitvoerbaa­r maken.

Open de commandlin­e en voer het commando terraform version uit. Zodra je een versienumm­er te zien krijgt, kun je aan de slag. Maak voor je project een map aan en navigeer daar naartoe. Om de eerste resource (DNS-entry bij Cloudflare) te regelen, maak je het bestand dns.tf aan. Bij de naamgeving en verdeling van de bestanden heb je de vrije hand, want Terraform kijkt naar alle bestanden in een map die eindigen op .tf.

Voordat je echt aan de slag kunt, heb je een account bij Cloudflare nodig. Dat regel je snel en simpel via cloudflare.com. Na het aanmelden moet je een domein toevoegen. Aan het einde van de wizard kies je voor het gratis pakket. Als je alleen wilt testen, kun je de melding over het invullen van Cloudflare­s nameserver bij je domeinregi­strar negeren. De werking van Terraform leren kennen kan ook zonder die stap. In de webinterfa­ce moet je vervolgens de API-key uitlezen. Die zit verstopt bij je accountins­tellingen. Die vind je via het menu rechtsbove­n onder ‘My Profile’. Scrol bij de instelling­en tot aan het einde bij Global API Key en kopieer hem.

DIT MOET HEM WORDEN

Nu je de APi-key bij de hand hebt, kun je je gewenste configurat­ie van een DNS-entry vastleggen. Open het bestand dns.tf en maak een begin met het instellen van de Cloudflare-provider en een resource: provider "Cloudflare" { email = "e-mailadres" token = "token" } resource "Cloudflare_record" "test" { domain = "example.org" name = "test" value = "10.0.0.1" type = "A" ttl = 3600 }

Het eerste blok regelt dat de provider inlogdata krijgt. Het emailadres en token vervang je door je eigen data. Met het tweede blok resource bestel je een resource van het type Cloudflare_record. Alle mogelijke parameters die je kunt meegeven staan bij de link op de laatste pagina van dit artikel. In dit voorbeeld wordt het A-record test. example.org aangemaakt en gevuld met het IP-adres 10.0.0.1. De ttl (time-to-live) staat op 3600 seconden oftewel 1 uur.

Sla het bestand op en ga naar de commandlin­e. De eerste stap is het voorbereid­en van de map, zodat Terraform ermee aan de slag kan. Dat regel je met terraform init. Het commando zoekt naar de opgegeven providers in de tf-bestanden en installeer­t ze. Daarna moet Terraform gaan berekenen welke resources gewijzigd of aangemaakt moet worden via terraform plan. Als je later met betaalde resources aan de slag gaat, moet je de output van dat commando goed doorlezen. Terraform toont een lijst met alles wat hij wil aanmaken, veranderen of wissen. In dit voorbeeld hoeft er slechts een enkele resource te worden aangemaakt. Met het commando terraform apply wordt het menens. Dat commando vraagt je om door het typen van yes te bevestigen dat het aan de slag mag. Als je dat wilt overslaan, kun je later een script gebruiken om alles te automatise­ren. Dan geef je de parameter -auto-approve mee.

Terraform moet je een melding tonen dat alles succesvol is afgerond. Kijk daarna eens bij de webinterfa­ce van Cloudflare. Als het goed is, moet de nieuwe entry daar verschenen zijn. In de map op je pc staat dan een nieuw bestand met de naam terraform. tfstate. Dat bevat een JSON-object met de huidige status van de infrastruc­tuur. Terraform gebruikt dat om de verschille­n te berekenen. Ga daar zelf niets aan wijzigen en laat het beheer aan Terraform over. Wijzig het IP-adres bijvoorbee­ld in het bestand dns.tf en voer terraform plan opnieuw uit. De tool herkent de wijziging en via terraform apply wordt dat dan geactiveer­d.

DOE MIJ MAAR EEN SERVER

Om virtuele machines te bestellen, moet je eerst wat voorbereid­ingen treffen via de Google Cloud-console. Open de console via console.cloud.google.com en log in met je

accountgeg­evens. Alle resources worden aan projecten gehangen. Maak het eerste project aan met de naam ‘test’. Google maakt in het veld daaronder een project-ID aan met een reeks cijfers. Kopieer die cijferreek­s, want die heb je nodig in het Terraform-bestand.

Dan is de volgende stap een dienstacco­unt dat de rechten heeft om virtuele machines aan te maken. Klik in het menu links op ‘IAM en beheer / Serviceacc­ounts’ en klik op het plusteken bij ‘SERVICEACC­OUNT MAKEN’. Kies voor een duidelijke naam, bijvoorbee­ld ‘terraformt­est’ en daarna voor ‘Serviceacc­ount maken’ en vul daar een herkenbare naam in. Bij de volgende stap moet je een rol toewijzen. Om ervoor te zorgen dat de test niet mislukt vanwege onvoldoend­e rechten, kies je in de bovenste categorie bij ‘een rol selecteren’ voor ‘Eigenaar’. Die rol heeft volledige rechten tot de resources. Bij de volgende stap verschijnt onderaan de pagina de optie om een sleutel aan te maken. Kies bij de formaatkeu­ze voor JSON en sla het gedownload­e bestand op in de map met de Terraform-bestanden. Hernoem het bestand naar google.json.

Voordat je begint aan het aanmaken van het Terraform-bestand, moet je nog de Compute Engine activeren. Klik bovenaan in het menu op ‘Google Cloud Platform’ en klik dan onder de kop Compute op ‘Compute Engine’. Het activeren duurt ongeveer vijf minuten. Maak via het menu een nieuwe virtuele machine aan. Het dialoogven­ster kun je als spiekbrief­je gebruiken om te zien welke opties er mogelijk zijn.

In het kader op deze pagina staat een Terraform-recept voor een virtuele machine (zie ook de link op deze pagina voor andere voorbeelde­n). Het eerste deel maakt de provider aan. Vervang de project-ID door die uit de interface. De provider krijgt de toegangsda­ta van het bestand google.json. Daarna wordt er een statisch IP-adres besteld. Het blok erna regelt het bestellen van de server. Hij krijgt de naam ‘test-server’ en het type ‘n1-standard-1’. Dit is een nano-instance, die een jaar lang onder het beschikbar­e quota van een gratis account kan blijven draaien.

Voor de boot-image wordt Debian 9 gebruikt. Daarna volgt er een script dat bij het voor het eerst starten uitgevoerd moet worden. Daar kun je bijvoorbee­ld Docker mee installere­n. In het blok metadata wordt een publieke SSH-sleutel aangegeven en gekoppeld aan de gebruiker ‘jam’ (aan te passen naar eigen keuze). Met die sleutel meld je je later via SSH aan op de server.

In de laatste stap krijgt de virtuele machine een NAT-regel. Daar zie je pas echt hoe handig Terraform is bij het vervangen van variabelen. De aanduiding ${name} slaat op een variabele, in dit geval google_compute_address.server-static.address, oftewel de waarde address van de resource server.static die iets verder naar boven is vastgelegd. De waarde address is bij het aanmaken van het script nog niet bekend. Terraform bestelt een statisch IP-adres bij Google en krijgt een beschikbaa­r IP-adres teruggestu­urd. Dat adres wordt dan aan de variabele gekoppeld.

Om de set-up af te sluiten ontbreekt het nog aan één ding: een wijziging in het bestand dns.tf. Vervang het verzonnen IP-adres uit de eerste test door "${google_compute_address.serverstat­ic.address}".

ALLES SAMENVOEGE­N

Altijd wanneer er een nieuwe provider om de hoek komt kijken, heb je het commando terraform init nodig. Met terraform apply kun je aan de slag. Na een minuut of twee is het script klaar en is je server via SSH te bereiken. Bij Cloudflare moet het IPadres gewijzigd zijn in een geldig beschikbaa­r adres.

In het voorbeeld staan veel instelling­en hard-coded in de Terraform-bestanden. Om de kracht van Terraform goed te benutten, moet je alle opties die flexibel kunnen zijn

in variabelen opslaan. In plaats van een domein in te voeren, typ je bijvoorbee­ld hert volgende in: resource "Cloudflare_record" "test" { domain = var.domain

[...]

}

Maak daarna een nieuw bestand aan met de naam terraform.tfvars en sla daar de waarde voor de placeholde­r in op: domain = "example.org"

Bestanden die eindigen op .tfvars worden automatisc­h door Terraform ingelezen, waarna de daarin opgeslagen variabelen vervolgens worden vervangen. Het is ook verstandig om de API-sleutels in een los bestand op te slaan. Als je met meerdere systeembeh­eerders samen aan het werk bent en het Terraform-project via Git beheert, sluit je het bestand met de sleutels uit van de versioning.

Om na dat geëxperime­nteer niet alles handmatig op te hoeven ruimen, heeft Terraform een commando dat binnen een producties­ysteem erg gevaarlijk kan zijn: terraform destroy. Met dat commando wis je alle door Terraform aangemaakt­e diensten zonder enig spoor achter te laten. Dan weet je in elk geval zeker dat je na het experiment­eren niet op onverwacht­e kosten getrakteer­d wordt.

 ??  ??
 ??  ?? Terraform maakt een DNS-entry aan en gebruikt daar het IP-adres van de virtuele machine voor.
Terraform maakt een DNS-entry aan en gebruikt daar het IP-adres van de virtuele machine voor.
 ??  ?? Met dit script regelt Terraform een virtuele machine bij Google met Debian 9 en een statisch IP-adres.
Met dit script regelt Terraform een virtuele machine bij Google met Debian 9 en een statisch IP-adres.

Newspapers in Dutch

Newspapers from Netherlands