Nachdem Infrastructure as Code nachweislich die Qualität deiner Infrastruktur erhöht, sollte man dieses Prinzip konsequent durchsetzen. Wer Proxmox, OpenStack oder OpenNebula als Virtualisierungsplattform für die eigene (Private) Cloud einsetzt, kann durch Terraform einfach und effizient seine Infrastruktur als Code abbilden und dadurch Qualität, Wartbarkeit und Konfiguration nachhaltig optimieren.
Die Private Cloud erfreut sich steigender Beliebtheit. Mit der eigenen Virtualisierungsumgebung ergeben sich weitreichende Möglichkeiten zur Bereitstellung, Konfiguration und Verwendung von Infrastruktur. Ob Webserver, Gameserver, Mailserver oder als Teil eines größeren Computing Clusters - Virtualisierung macht die flexible Isolierung und Verwaltung von Ressourcen für alle denkbaren Zwecke möglich.
Eine populäre Lösung dafür ist Proxmox. Man findet die schlanke Debian-basierte Software nicht nur in Enterprise Angeboten einer Private Cloud, sondern vermehrt auch im Privat- und Hobbysektor für Home- und Bastelserver.
In allen Fällen ist die Erstellung und Einrichtung neuer Virtueller Maschinen noch immer eine zeitaufwendige und manuelle Aufgabe, die durch Tools wie Cloud-Init schon deutlich vereinfacht wird. Mit dem modernen Infrastructure As Code (IaC) Ansatz wird dieser Prozess weiter optimiert, automatisiert und als Code abgebildet. Eines der bekanntesten Tools für diesen Ansatz ist Terraform.
Terraform macht seinem Namen alle Ehre - Ganze IT-Landschaften können mit dem von HashiCorp entwickelten Tool abgebildet werden. Dabei stehen verschiedene Provider zur Verfügung. Von Virtuellen Maschinen, über DNS Records bis hin zu Kubernetes Clustern kann Terraform Infrastrukturen abbilden, provisionieren und konfigurieren.
Administratoren, DevOps Ingenieure und Entwickler machen sich das Infrastructure as Code Prinzip zu Nutzen, um ihre Infrastruktur zu verwalten. Durch Terraform kann ein Projekt seine Infrastruktur genau spezifizieren und automatisiert zusammenbauen.
Terraform denkt dabei in Ressourcen. Ein DNS Record, eine Virtuelle Maschine - Am Ende nur Ressourcen mit bestimmten Eigenschaften. Terraform sorgt dafür, dass diese Ressourcen durch ihren Provider, sei es die Cloudflare DNS Verwaltung, ein Kubernetes Cluster oder die OpenStack Private Cloud, angelegt und in den gewünschten Soll-Zustand überführt werden:
Damit du mit Terraform dein Proxmox Cluster ansteuern kannst, brauchst du den entsprechenden Provider. Im Fall von Proxmox ist hier ein prominenter Provider aus der Community die beste Wahl. Die Installation ist recht einfach und schnell erledigt. Derzeit ist der Provider allerdings nur zur Terraform Version 0.12 kompatibel.
In den folgenden Schritten konfigurieren wir den Proxmox Provider und erstellen die erste VM auf Basis eines Cloud-Init Templates.
provider "proxmox" { pm_api_url = "https://my.proxmox.host:8006/api2/json" pm_password = "myProxMoxPassword" pm_user = "myProxmoxUser" }
variable "ssh_pub_key" { description = "The Public Key used for provisioned VMs using Cloud-Init" type = string default = "ssh-rsa ..." }
resource "proxmox_vm_qemu" "proxmox_vm" { count = 1 name = "tf-vm-01" target_node = "eva" clone = "ubuntu-20.10-groovy-gorilla" os_type = "cloud-init" cores = 4 sockets = "1" cpu = "kvm64" memory = 2048 scsihw = "virtio-scsi-pci" bootdisk = "scsi0" disk { id = 0 size = 20 type = "scsi" storage = "local-zfs" storage_type = "zfspool" iothread = true } network { id = 0 model = "virtio" bridge = "vmbr0" } ipconfig0 = "ip=37.114.59.201/24,gw=37.114.59.1" sshkeys = <<EOF ${var.ssh_pub_key} EOF }
Von oben an in natürlicher Sprache beschrieben erstellst du hiermit eine VM namens tf-vm-01 auf dem Cluster Node EVA. Als Cloud-Init Template wird ein Ubuntu Image verwendet. Der Server hat vier Kerne, nutzt die kvm64 Virtualisierung und wartet mit 2GB RAM auf. Es wird von der Hauptdisk gebooted, die die ID 0 hat, 20GB groß ist und in unserem lokalen zfspool provisioniert wird. Das Netzwerk zeigt auf die Standard Linux Bridge und wir kofnigurieren die IP 37.114.59.201 per Cloud Init. Als letztes wird dein zuvor konfigurierter SSH Key in die Config geschrieben.
Von nun an führt der gewohnte Terraform-Weg zum Ziel:
$ terraform init
$ terraform plan
$ terraform apply
Der Server sollte innerhalb der nächsten Sekunden in Proxmox erscheinen und ist nach weiteren wenigen Sekunden fertig eingerichtet. Den gesamten Source Code findest du auf GitHub.
Ich selbst möchte Terraform in der Planung und Installation meiner Infrastruktur nicht mehr missen. Zweifelsohne muss man durch gewisse Einschränkungen der Software auf ein paar Feature-Details verzichten, aber gerade dieser teilweise gelebte Minimalismus macht Terraform so reizvoll. Man bekommt durch Infrastructure as Code eine neue Sichtweise auf die eigenen Systeme.
Arbeitest du noch manuell? Wie installierst und konfigurierst du deine Infrastruktur? Lass es mich in den Kommentaren wissen!