Terraform
Was ist Terraform lauf ChatGPT:
Terraform ist ein “Infrastructure as Code” (IaC) Tool, das von HashiCorp entwickelt wurde. Es ermöglicht die Definition, Bereitstellung und Verwaltung von Infrastrukturressourcen auf deklarative Weise. Mit Terraform können Sie Ihre Infrastruktur als Code schreiben, was bedeutet, dass Sie die gesamte Struktur Ihrer IT-Infrastruktur in einer einzigen Konfigurationsdatei abbilden können. Durch die Verwendung von Terraform können Teams Infrastrukturänderungen versionieren, gemeinsam bearbeiten und auf kontrollierte und reproduzierbare Weise implementieren. Dies erleichtert die Automatisierung und Skalierung von Infrastrukturmanagementaufgaben.
Und was bedeutet das nun genau?
Infrastructure as Code (IaC) ist das Werkzeug, das meiner Meinung nach den Ops-Bereich näher an den Dev-Bereich gebracht hat.
Es wird nicht wie früher jeder Server einzeln von Hand aufgesetzt, sondern mit Code (Deklaration eines gewünschten Zustandes) beschrieben, wie der neue Server, die ganze Serverfarm aussehen soll.
Ich hätte gerne 10 Webserver, 2 DB-Server
und noch einen kleinen FTP-Server.
Und mit einem einzigen Befehl werden alle Server auf Basis des entsprechenden Basis-Images mit Terraforming in die Cloud oder auf die eigene Virtualisierungsumgebung ausgerollt.
Ach alle Server sollen nicht nur 8GB sondern 100GB RAM bekommen?
Kein Problem.
Die Config wird angepasst, gepusht und Terraform kümmert sich um die Aktualisierung aller virtuellen Umgebungen.
Alles nachvollziehbar in der Regel in GIT abgelegt, damit auch morgen noch jeder weiß, was wann geändert wurde.
Und wie sieht so eine Config aus?
Ein Beispiel aus meinem Homelab für ein Grafana sieht wie folgt aus:
provider "proxmox" {
pm_api_url = var.proxmox_host["pm_api_url"]
pm_user = var.proxmox_host["pm_user"]
pm_password = var.userpw
pm_tls_insecure = true
}
resource "proxmox_lxc" "ProxMox-Grafana" {
count = 1
target_node = "lpve"
hostname = "lxc-test"
ostemplate = "local:vztmpl/ubuntu-22.10-standard_22.10-1_amd64.tar.zst"
password = var.lxcpw
unprivileged = true
cores = 1
memory = 2048
start = "true"
ssh_public_keys = file(var.ssh_keys["pub"])
rootfs {
storage = "local-lvm"
size = "8G"
}
network {
ip = format("%s/24", var.ips[count.index])
name = "eth0"
bridge = "vmbr0"
gw = cidrhost(format("%s/24", var.ips[count.index]), 1)
}
#creates ssh connection to check when the CT is ready for ansible provisioning
connection {
host = var.ips[count.index]
user = "root"
agent = true
timeout = "5m"
}
}
Etwas zerlegt sieht die Datei wie folgt aus:
Der Provider definiert, wie Terraform mit wem sprechen soll. In diesem Fall sage ich ihm, dass ich mit meinem Proxmox sprechen möchte und gebe ihm die entsprechenden die entsprechenden Parameter mit, die dieser Provider braucht. Natürlich nicht im Klartext, sondern als Parameter in einer eigenen Datei oder als Übergabeparameter.
provider "proxmox" {
pm_api_url = var.proxmox_host["pm_api_url"]
pm_user = var.proxmox_host["pm_user"]
pm_password = var.userpw
pm_tls_insecure = true
}
Die “Ressource” definiert nun den eigentlichen Server. Also wie viel RAM, CPU und HDD soll der Server nun bekommen. Wichtig ist hier noch das Flag “count = 1” zu erwähnen. Hier könnte man auch 10 angeben, dann würden hier sofort 10 Instanzen des auf dem Proxmox starten. Und genau hier liegt einer der großen Vorteile. Man muss nur einmal sagen, wie der Web- oder DB-Server aufgebaut sein soll und kann diesen ohne großen Aufwand einfach X-Fach ausrollen.
resource "proxmox_lxc" "ProxMox-Grafana" {
count = 1
target_node = "lpve"
hostname = "lxc-test"
ostemplate = "local:vztmpl/ubuntu-22.10-standard_22.10-1_amd64.tar.zst"
password = var.lxcpw
unprivileged = true
cores = 1
memory = 2048
start = "true"
ssh_public_keys = file(var.ssh_keys["pub"])
rootfs {
storage = "local-lvm"
size = "8G"
}
network {
ip = format("%s/24", var.ips[count.index])
name = "eth0"
bridge = "vmbr0"
gw = cidrhost(format("%s/24", var.ips[count.index]), 1)
}
#creates ssh connection to check when the CT is ready for ansible provisioning
connection {
host = var.ips[count.index]
user = "root"
agent = true
timeout = "5m"
}
Am Ende können wir das noch mit dem Befehl
terraform plan
testen, um hier genau zu sehen was er ausführen (erstellen, updaten oder löschen) würde.
Wenn wir damit zufrieden sind, könnten wir das ganze ganz einfach mit
terraform apply
ausführen.
Fazit
Terraform ermöglicht es uns in der modernen IT-Welt sehr einfach und komfortabel virtuelle Server in vielfacher Anzahl einzusetzen und zu verwalten. Das Ganze nicht nur mit einer Person sondern auch über ein ganzes Team hinweg, denn Terraform merkt sich auch den Zustand des Systems, damit es für spätere Ausführungen auch weiß, ob eventuell ein Server, aus welchen Gründen auch immer, fehlt und neu erstellt werden muss oder ob eventuell die CPU Anzahl nicht passt und diese geändert werden muss. D.h. selbst wenn ein Admin auf die Idee käme den Arbeitsspeicher eines Servers zu verdoppeln, würde dies nach der Ausführung von Terraform angepasst werden.
Hier macht sich der deklarative Ansatz bemerkbar. Wir sagen hier nicht WIE der Server erstellt werden soll, sondern nur WIE er später aussehen soll. Alles andere ist dann Sache von Terraform und dem entsprechenden Provider.
Links
Image from www.freepik.com