Hashicorp Terraform

Siehe auch

Terraform erschien 2014.

Begriffe:

  • HCL: Hashicorp Configuration Language. HCL ist keine Template-Sprache, sondern ein mit eigenen Elementen erweitertes JSON.

Links:

Installation

dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo

dnf -y install terraform
terraform -install-autocomplete

terraform version

Konfiguration am Beispiel DigitalOcean

Am Beispiel des Cloud-Providers DigitalOcean. In dessen Cloud-Portal sind folgende Konfigurationen vorzunehmen:

  • API-Key erstellt (wird in Terraform zum do_token)

  • SSH-Key mit Namen „John Doe“ ist konfiguriert

Doku zum DigitalOcean-Provider für Terraform: https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs

Variablen, die in den nachfolgenden Terraform HCL-Konfigurationsdateien verwendet werden, müssen wie in einer Programmiersprache zunächst deklariert werden:

variables.tf
variable "do_token" {
  type = string
}

variable "ssh_pub_key" {
  type = string
}

variable "ssh_priv_key" {
  type = string
}

Die Variablen in einer Datei mit Werten füllen, statt die Werte nachher interaktiv einen nach dem anderen auf der Kommandzeile zu übergeben. Der Default-Dateiname terraform.tfvars sorgt dafür, dass Terraform diese ohne weitere Parameter-Angaben automatisch ausliest:

terraform.tfvars
do_token = "4a3e67edddc049b0aadb55519598f02e"
ssh_pub_key = "John Doe"
ssh_priv_key = "/home/john.doe/.ssh/id_rsa"

Variablen können über vier verschiedene Wege mit Werten gefüllt werden:

  • Interaktiv bei Ausführung des Kommandos terraform plan; wenn kein Planning durchgeführt wird, interaktiv bei terraform apply

  • Per Kommandzeile: terraform apply -var 'key=value'

  • Per Umgebungsvariable: TF_VAR_key='value' terraform apply

  • In einer separaten Variablen-Datei (ausserhalb von VCS zu verwalten): terraform apply -var-file='secrets.tfvars' (Default: terraform.tfvars)

Zugang zu DigitalOcean konfigurieren:

provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.16.0"
    }
  }
}

provider "digitalocean" {
  # Configuration options
  token = var.do_token
}

data "digitalocean_ssh_key" "terraform" {
  name = var.ssh_pub_key
}

In Frankfurt soll nun eine kleine VM mit Rocky 8 erstellt und Apache installiert werden. Achtung: Hashicorp sieht den provisioner "remote-exec"-Abschnitt ausdrücklich als „Last Resort“ an, und höchstens dafür gedacht, ein cloud-init-Skript oder ähnliches auszuführen. Der Abschnitt dient hier deshalb auch nur der Anschauung, in der Regel kommen ab hier Tools wie Ansible zum Einsatz.

myvm.tf
resource "digitalocean_droplet" "myvm" {

  image = "rockylinux-8-x64"
  name = "myvm"
  region = "fra1"
  size = "s-1vcpu-1gb"

  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]

  connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.ssh_priv_key)
    timeout = "2m"
  }

  # Provisioners are a Last Resort. Normally use Ansible etc. for this.
  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # install httpd
      "sudo dnf -y update",
      "sudo dnf -y install httpd"
    ]
  }
}

Deployment durchführen

Arbeitsverzeichnis initialisieren, welches die Terraform-Konfigurationsdateien enthält. Dieser Schritt lädt beispielsweise die benötigten Terraform-Provider herunter, und ist später optional:

terraform init

Execution Plan erstellen, der eine Prüfung sowie Vorschau auf die Änderungen, die Terraform an der Infrastruktur vornehmen will, ermöglicht (dry-run):

terraform plan -out=infra.tfplan

Alles ok? Dann kann die VM erstellt werden:

terraform apply infra.tfplan

Wird ein Deployment mit Ctrl-C abgebrochen, fährt Terraform einen „Graceful Shutdown“, räumt in der Cloud allerdings nicht auf.

Wird im obigen Konfigurationsbeispiel die „size“-Definition geändert, hängt es davon ab, ob das Backend-API des Cloud-Provider die Änderung tatsächlich unterstützt: die Änderung einer Grösse wird kein Problem darstellen (1 vCPU > 2 vCPU), aber der Wechsel beispielsweise von s-1vcpu-1gb-amd auf s-1vcpu-1gb-intel wird fehlschlagen, da die CPUs inkompatibel zueinander sind.

Output

Letzten Output einsehen:

terraform output

Infrastruktur löschen

Sicherheitsabfrage muss mit „yes“ beantwortet werden:

terraform destroy

Providers

Hashicorp Terraform Provider werden in Go mit dem Terraform Plugin SDK geschrieben.

Provider auflisten:

terraform providers

Troubleshooting

Could not retrieve the list of available versions for provider hashicorp/…: provider registry registry.terraform.io does not have a provider named registry.terraform.io/hashicorp/…

Möglicherweise ein Tippfehler in einer resource-Bezeichnung.

Built on 2022-06-03