Hoe u Terraform gebruikt met uw team

De auteur heeft het Free and Open Source Fund geselecteerd om een donatie te ontvangen als onderdeel van het Write for DOnations-programma.

Introductie

Wanneer meerdere mensen tegelijkertijd vanuit verschillende locaties aan hetzelfde Terraform-project werken, is het belangrijk om de infrastructuurcode en projectstatus correct te beheren om overschrijffouten te voorkomen. De oplossing is om de status op afstand op te slaan in plaats van lokaal. Een extern systeem is beschikbaar voor alle leden van uw team, en het is mogelijk voor hen om de status te vergrendelen terwijl ze eraan werken.

Een dergelijke externe backend is pg, die de status opslaat in een PostgreSQL-database. Tijdens deze tutorial zul je het gebruiken met een DigitalOcean Managed Database om gegevensbeschikbaarheid te waarborgen.

Terraform ondersteunt ook de officiële, beheerde cloudaanbieding van Hashicorp genaamd Terraform Cloud – een eigen app die het werk van je team op één plek synchroniseert en een gebruikersinterface biedt voor configuratie en beheer.

In deze tutorial maak je een organisatie aan in Terraform Cloud waaraan je je project zult koppelen. Vervolgens gebruik je je organisatie om werkruimtes en resources op te zetten. Je zult je state opslaan in de beheerde cloud zodat deze altijd beschikbaar is. Je zult ook de pg backend opzetten met een bijbehorende beheerde PostgreSQL-database.

Vereisten

  • A DigitalOcean Personal Access Token, which you can create via the DigitalOcean Control Panel. You can find instructions in the DigitalOcean product documents, How to Create a Personal Access Token.
  • Terraform geïnstalleerd op je lokale machine. Voltooi Stap 1 van de How To Use Terraform with DigitalOcean tutorial.
  • Als je een pg backend wilt gebruiken, heb je een Beheerde PostgreSQL databasecluster nodig die is aangemaakt en toegankelijk is. Voor meer informatie kun je de Quickstart gids raadplegen. Je kunt voor deze tutorial een aparte database gebruiken.
  • Als je de beheerde cloud van Hashicorp wilt gebruiken, heb je een account nodig bij Terraform Cloud. Je kunt er een aanmaken op hun aanmeldingspagina.

Opmerking: We hebben deze tutorial specifiek getest met Terraform 1.1.3.

State opslaan in een beheerde PostgreSQL-database

In dit gedeelte zul je een project opzetten dat een Droplet implementeert en de status opslaat in een DigitalOcean Managed PostgreSQL-database met behulp van de pg-provider. Deze provider ondersteunt statusvergrendeling, zodat de status nooit zal worden overschreven door twee of meer wijzigingen die tegelijkertijd plaatsvinden.

Begin met het aanmaken van een map met de naam terraform-team-pg waarin je het project zult opslaan:

  1. mkdir ~/terraform-team-pg

Navigeer ernaar:

  1. cd ~/terraform-team-pg

Je zult eerst de provider definiëren en vervolgens de verbindingsreeks voor de database en de digitalocean-module doorgeven. Maak provider.tf aan en open het voor bewerking:

  1. nano provider.tf

Voeg de volgende regels toe:

~/terraform-team-pg/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Hier heb je de digitalocean-provider nodig en definieer je de pg-backend, die een verbindingsreeks accepteert. Vervolgens definieer je de do_token-variabele en geef je deze door aan de instantie van de digitalocean-provider.

Vergeet niet om your_db_connection_string te vervangen door de verbindingsreeks voor uw beheerde database vanuit uw DigitalOcean Control Panel, die u kunt vinden door op Acties te drukken, Verbindingsgegevens te selecteren en Verbindingsreeks uit het dropdownmenu te kiezen. Sla vervolgens het bestand op en sluit het

Waarschuwing: Om door te gaan, zorg ervoor dat in de Instellingen van uw database, het IP-adres van de machine waarvan u Terraform uitvoert, op een toegangslijst staat.

Initialiseer het project door het volgende uit te voeren:

  1. terraform init

De uitvoer zal vergelijkbaar zijn met het volgende:

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! ...

Terraform heeft de backend succesvol geïnitialiseerd, wat betekent dat het verbinding heeft gemaakt met de database.

Definieer vervolgens de Droplet in een bestand genaamd droplets.tf. Maak het aan en open het voor bewerking door het volgende uit te voeren:

  1. nano droplets.tf

Voeg de volgende regels toe:

~/terraform-team-pg/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Deze code zal een Droplet genaamd web-1 implementeren in de regio fra1, draaiend op Ubuntu 20.04 met 1 GB RAM en één CPU-kern. Dat is alles wat u hoeft te definiëren, dus sla het bestand op en sluit het.

U heeft uw DigitalOcean-token nodig in een omgevingsvariabele. Maak er een aan, waarbij u your_do_token vervangt door uw token:

  1. export DO_PAT="your_do_token"

Om te controleren of de verbinding met de database werkt, probeer de configuratie te plannen:

  1. terraform plan -var "do_token=${DO_PAT}"

De uitvoer zal vergelijkbaar zijn met het volgende:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web zal worden aangemaakt + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Terraform meldde geen fouten en plande de acties zoals gewoonlijk. Het maakte succesvol verbinding met uw PostgreSQL-database en bewaarde de status ervan. Meerdere mensen kunnen nu gelijktijdig aan dit project werken terwijl het gesynchroniseerd blijft.

Staat opslaan in Terraform Cloud

In deze stap maakt u een project aan dat een Droplet implementeert en Terraform Cloud als backend gebruikt met de cloud-provider. Dit omvat het creëren van de organisatie en werkruimte in Terraform Cloud, het schrijven van de infrastructuurcode en het plannen ervan.

Een organisatie aanmaken

Terraform Cloud staat u toe om meerdere organisaties te hebben, die uw werkruimtes en modules bevatten. Organisaties met een betaald abonnement kunnen meerdere teams hebben met toegangsniveaubeheer, terwijl het gratis abonnement dat u gebruikt slechts één team per organisatie biedt. U kunt teamleden uitnodigen om zich bij de organisatie aan te sluiten.

Ga eerst naar Terraform Cloud en log in. Als je nog geen organisatie hebt aangemaakt, wordt je gevraagd dit te doen.

Voer een organisatienaam naar keuze in en onthoud dat deze uniek moet zijn onder alle namen in Terraform Cloud. Je krijgt een foutmelding als de naam al bestaat. Het e-mailadres moet al ingevuld zijn met het adres van je account. Klik nadat je klaar bent op de Organisatie aanmaken-knop om door te gaan.

Je wordt vervolgens gevraagd om het type werkruimte te selecteren.

Aangezien je met Terraform Cloud gaat werken via de commandoregel, klik op de optie CLI-gestuurde workflow. Voer vervolgens een naam in voor je werkruimte en laat de beschrijving leeg.

Typ een werkruimtenaam naar keuze in (we noemen het sammy), klik dan op Werkruimte aanmaken om het proces van het aanmaken van de organisatie te voltooien. Je wordt dan doorgestuurd naar een pagina met werkruimte-instellingen.

Je hebt nu je werkruimte aangemaakt, die deel uitmaakt van je organisatie. Aangezien je deze zojuist hebt aangemaakt, bevat je werkruimte geen infrastructuurcode. In het centrale deel van de interface geeft Terraform Cloud je startinstructies voor het verbinden met deze werkruimte.

Voordat je verbinding maakt, moet je de versie van Terraform configureren die de cloud zal gebruiken om je opdrachten uit te voeren. Om dit in te stellen, klik op het Instellingen-dropdownmenu naast Overzicht en selecteer Algemeen uit de lijst. Wanneer de pagina opent, navigeer naar het Terraform Versie-dropdownmenu en selecteer 1.1.3 (voor deze tutorial).

Klik vervolgens op de Instellingen opslaan-knop om de wijzigingen op te slaan.

Om je project aan je organisatie en werkruimte te koppelen, moet je eerst inloggen via de opdrachtregel. Voordat je de opdracht uitvoert, ga je naar de tokenspagina om een nieuwe toegangstoken voor je server aan te maken, die toegang zal geven tot je account. Je ontvangt een prompt om een API-token aan te maken.

De standaardomschrijving is prima, dus klik op API-token aanmaken om het te maken.

Klik op de tokenwaarde of het pictogram ernaast om het API-token te kopiëren. Je zult dit token gebruiken om je project met je Terraform Cloud-account te verbinden.

Voer in de opdrachtregel de volgende opdracht uit om in te loggen:

  1. terraform login

Je ontvangt de volgende uitvoer:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

Terraform waarschuwt je dat het token lokaal zal worden opgeslagen. Voer ja in wanneer het je vraagt:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

Plak het token dat je hebt gekopieerd en bevestig met ENTER. Terraform zal een succesbericht tonen:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

Je hebt je lokale Terraform-installatie geconfigureerd om toegang te krijgen tot je Terraform Cloud-account. Je zult nu een project aanmaken dat een Droplet implementeert en het configureren om Terraform Cloud te gebruiken voor het opslaan van de status.

Project instellen

Maak eerst een map genaamd terraform-team-cloud aan waar je het project zult opslaan:

  1. mkdir ~/terraform-team-cloud

Navigeer ernaar:

  1. cd ~/terraform-team-cloud

Om je project in te stellen, moet je:

  • de cloud-provider definiëren en configureren, die communiceert met Terraform Cloud.
  • de digitalocean-provider vereisen om DigitalOcean-resources te kunnen implementeren.
  • variabelen definiëren en initialiseren die je zult gebruiken.

Je zult de specificaties van provider- en modulevereisten opslaan in een bestand genaamd provider.tf. Maak het aan en open het voor bewerking door het volgende uit te voeren:

  1. nano provider.tf

Voeg de volgende regels toe:

~/terraform-team-cloud/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Hier geef je eerst je Terraform-versie op. Vervolgens specificeer je de digitalocean-provider zoals vereist en stel je de backend in op cloud. Vervang voor de organization en workspaces.name de gemarkeerde waarden door de namen die je hebt opgegeven.

Vervolgens definieer je een variabele genaamd do_token, die je doorgeeft aan de digitalocean-provider die na deze wordt aangemaakt. Je hebt nu je project geconfigureerd om verbinding te maken met je organisatie, dus sla het bestand op en sluit het af.

Initialiseer je project met de volgende opdracht:

  1. terraform init

De uitvoer zal vergelijkbaar zijn met dit:

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform Cloud has been successfully initialized! ...

Aangezien de Droplet-definitie hetzelfde is als in het vorige project, kunt u deze kopiëren door het volgende uit te voeren:

  1. cp ../terraform-team-pg/droplets.tf .

Tenslotte zult u de variabele waarden definiëren. De cloud-provider ondersteunt het niet om waarden door te geven aan variabelen via de commandoregel, dus moet u ze doorgeven via variabele bestanden of instellen in Terraform Cloud. Terraform leest variabele waarden uit bestanden met een bestandsnaam eindigend op .auto.tfvars. Maak een bestand genaamd vars.auto.tfvars aan en open het voor bewerking, waarin u de variabele do_token zult definiëren:

  1. nano vars.auto.tfvars

Voeg de volgende regel toe, waarbij u uw_do_token vervangt door uw DigitalOcean API-token:

vars.auto.tfvars
do_token = "your_do_token"

Als u klaar bent, slaat u het bestand op en sluit u het. Terraform zal dit bestand automatisch lezen bij het plannen van acties.

Uw project is nu compleet en ingesteld om Terraform Cloud als backend te gebruiken. U zult nu de Droplet plannen en toepassen en bekijken hoe dit zich weerspiegelt in de Cloud-applicatie.

Het toepassen van de configuratie

In Stap 1 van deze handleiding hebt u een project gepland met behulp van het terraform plan-commando. Aangezien het Terraform Cloud-project dezelfde resources heeft gedefinieerd, kunt u de planning opnieuw overslaan en deze direct toepassen op Terraform Cloud.

U past het project toe door het volgende commando uit te voeren om het bij te werken:

  1. terraform apply

Je zult merken dat de output anders is wanneer je local als je backend gebruikt:

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web zal worden aangemaakt + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Bij gebruik van de cloud backend, plant of past Terraform de configuratie niet toe vanaf de lokale machine. In plaats daarvan delegeert het die taken naar Terraform Cloud, en streamt alleen de output naar de console in realtime.

Typ ja wanneer daarom wordt gevraagd. Terraform zal binnenkort klaar zijn met het toepassen van de configuratie, en je kunt naar de werkruimte op de Terraform Cloud-website navigeren om te zien dat er een nieuwe actie is toegepast.

Je kunt nu de gedeployde resources vernietigen door het volgende uit te voeren:

  1. terraform destroy

In deze sectie heb je je project verbonden met Terraform Cloud, waardoor de status van je project toegankelijk is voor je team op één centrale plek. Dit maakt het mogelijk om de status te delen en te synchroniseren voor iedereen met toegang tot het project, wat leidt tot een soepelere ervaring.

Conclusie

In deze zelfstudie heb je twee verschillende back-ends gebruikt: Terraform Cloud, de door Hashicorp beheerde cloudoplossing voor Terraform; en pg, waarmee je de status van het project kunt opslaan in een PostgreSQL-database. Je hebt een beheerde PostgreSQL-database van DigitalOcean gebruikt, die je binnen enkele minuten kunt inrichten en gebruiken met Terraform.

Voor meer informatie over de functies van Terraform Cloud, bezoek de officiële documentatie.

Deze tutorial is onderdeel van de Hoe Infrastructuur te Beheren met Terraform serie. De serie behandelt verschillende Terraform-onderwerpen, van het voor de eerste keer installeren van Terraform tot het beheren van complexe projecten.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team