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:
Terraform Language: https://www.terraform.io/docs/language/index.html
Terraform Registry: https://registry.terraform.io/browse/providers
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:
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:
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 beiterraform 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:
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.
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 2024-11-18