Klauke Enterprises Blog

Proxmox mit Terraform: Infrastructure as Code leicht gemacht

Geschrieben von Felix Klauke | 15.08.2020

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. 

Proxmox für die Virtualisierung

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 als Infrastructure as Code Werkzeug

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:

Terraform und Proxmox

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.

  1. Erstelle eine neue Datei namens "main.tf" mit folgendem Inhalt
    provider "proxmox" {
      pm_api_url = "https://my.proxmox.host:8006/api2/json"
      pm_password = "myProxMoxPassword"
      pm_user = "myProxmoxUser"
    } 
  2. Konfiguriere eine Variable für deinen Public Key, mit ihm wirst du später Zugriff auf die VM haben
    variable "ssh_pub_key" {
      description = "The Public Key used for provisioned VMs using Cloud-Init"
      type = string
      default = "ssh-rsa ..."
    }  
  3. Konfiguriere deine VM Ressource mit den entsprechenden Parametern
    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.

 

 

Fazit

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!