Clouddiensten automatisch instellen met Terraform
Met Terraform kun je met een tekstdocument bepalen uit welke delen een cloudinfrastructuur moet bestaan. Je combineert makkelijk servers, opslagruimte en andere resources van verschillende clouds tot een eigen mix.
Voor systeembeheerders en ontwikkelaars zijn veel werkzaamheden een stuk eenvoudiger geworden. Code staat in Git-repository’s, software wordt automatisch in elkaar gezet en in containers gestopt en krijgt vanzelf updates. Op de achtergrond wordt de boel gerund door servers die door iemand ingesteld moeten worden. Ook die klus is dankzij cloudplatforms een stuk makkelijker geworden. Zonder bestelformulieren 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 deactiveren 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 clouddienst je gebruikt en wat ze precies doen.
Als je voor je werk of privé servers voor meerdere projecten beheert, klinkt een alternatief voor de webinterfaces van cloudaanbieders erg aanlokkelijk. Voor dat onderdeel heeft HashiCorp de opensourcetool Terraform in het leven geroepen.
INFRASTRUCTUUR ALS CODE
Als systeembeheerder stel je met behulp van een tekstdocument de infrastructuur samen. De syntaxis is makkelijk te begrijpen. Terraform maakt contact met de API’s van de cloudaanbieders en bestelt de resources. Als je de definities aanpast, berekent Terraform de verschillen en bestelt extra resources of laat onnodige resources vervallen. De definitie kan met versiebeheer
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 vertaalslag 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 cloudplatforms wordt er een enkele resource geregeld: een virtuele machine met Linux erop. Tegelijkertijd 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 bijpassende codevoorbeelden voor Azure, AWS en Hetzner. Voor de bijbehorende DNS-entry wordt de DNS- en DDoS-preventiedienst Cloudflare gebruikt. Een gratis account is voldoende voor eenvoudig DNS-beheer.
VOORBEREIDING
Het hart van Terraform wordt gevormd door een commandlinetool. Die zet de systeembeheerder op zijn eigen pc. Bij de link aan het eind van dit artikel staan downloads voor de uitvoerbare bestanden voor Windows, Linux, macOS, Solaris en BSD. Om die te installeren, hoef je alleen maar het bestand te downloaden en op de plek te zetten waar het besturingssysteem naar uitvoerbare bestanden zoekt, of de map waarin de tool staat toe te voegen aan de systeemvariabele PATH. Bij Unix-besturingssystemen moet je het bestand zelf nog uitvoerbaar maken.
Open de commandline en voer het commando terraform version uit. Zodra je een versienummer 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 Cloudflares nameserver bij je domeinregistrar negeren. De werking van Terraform leren kennen kan ook zonder die stap. In de webinterface moet je vervolgens de API-key uitlezen. Die zit verstopt bij je accountinstellingen. Die vind je via het menu rechtsboven onder ‘My Profile’. Scrol bij de instellingen 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 configuratie 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 commandline. De eerste stap is het voorbereiden 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 installeert 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 automatiseren. Dan geef je de parameter -auto-approve mee.
Terraform moet je een melding tonen dat alles succesvol is afgerond. Kijk daarna eens bij de webinterface 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 infrastructuur. Terraform gebruikt dat om de verschillen te berekenen. Ga daar zelf niets aan wijzigen en laat het beheer aan Terraform over. Wijzig het IP-adres bijvoorbeeld in het bestand dns.tf en voer terraform plan opnieuw uit. De tool herkent de wijziging en via terraform apply wordt dat dan geactiveerd.
DOE MIJ MAAR EEN SERVER
Om virtuele machines te bestellen, moet je eerst wat voorbereidingen treffen via de Google Cloud-console. Open de console via console.cloud.google.com en log in met je
accountgegevens. 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 cijferreeks, want die heb je nodig in het Terraform-bestand.
Dan is de volgende stap een dienstaccount dat de rechten heeft om virtuele machines aan te maken. Klik in het menu links op ‘IAM en beheer / Serviceaccounts’ en klik op het plusteken bij ‘SERVICEACCOUNT MAKEN’. Kies voor een duidelijke naam, bijvoorbeeld ‘terraformtest’ en daarna voor ‘Serviceaccount 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 onvoldoende 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 formaatkeuze voor JSON en sla het gedownloade 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 dialoogvenster kun je als spiekbriefje 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 voorbeelden). Het eerste deel maakt de provider aan. Vervang de project-ID door die uit de interface. De provider krijgt de toegangsdata 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 beschikbare 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 bijvoorbeeld Docker mee installeren. 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 beschikbaar IP-adres teruggestuurd. 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.serverstatic.address}".
ALLES SAMENVOEGEN
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 beschikbaar adres.
In het voorbeeld staan veel instellingen 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 bijvoorbeeld 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 placeholder in op: domain = "example.org"
Bestanden die eindigen op .tfvars worden automatisch 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 systeembeheerders 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ëxperimenteer niet alles handmatig op te hoeven ruimen, heeft Terraform een commando dat binnen een productiesysteem erg gevaarlijk kan zijn: terraform destroy. Met dat commando wis je alle door Terraform aangemaakte diensten zonder enig spoor achter te laten. Dan weet je in elk geval zeker dat je na het experimenteren niet op onverwachte kosten getrakteerd wordt.