Terraform – Server-Management leicht gemacht

„Wir brauchen schnell einen Server!“ – Diesen Satz kennt wohl jeder Mitarbeiter einer IT-Abteilung. Oft wird auch gleich eine ganze Reihe an Servern benötigt. Diese müssen zusätzlich noch zahlreiche Anforderungen erfüllen und in kürzester Zeit eingerichtet werden. Das das Ganze oft alles andere als schnell geht, wissen wir wohl alle…

Zur fixen und effizienten Bereitstellung von Servern gibt es verschiedene Lösungen: Sollten virtuelle Maschinen (VMs) mit einem entsprechenden VMware-Server im Hintergrund im Einsatz sein, sind vollumfängliche Automatisierungs-Lösungen wie orcharhino geeignet. Kompliziert wird es jedoch bei komplexeren Strukturen oder Container-Management. Hier kann das Tool Terraform Abhilfe schaffen.

Denn dieses setzt genau da an, wo andere Automatisierungs-Tools an ihre Grenzen stoßen. Durch das Prinzip „Infrastructure as a Code“ muss die gewünschte Konfiguration nicht mehr über die Nutzeroberfläche zusammengefügt werden, sondern wird einfach als Code definiert. Eine Kombination mit weiteren Code-Fragmenten ist möglich. Anstatt von enormen Code-Blöcken ist also die Verwendung von sogenannten Modulen nach dem Baukasten-Prinzip möglich. Der Vorteil besteht darin, dass sich somit Elemente wiederverwenden lassen und die Fehleranfälligkeit reduziert wird. Diese Module verwalten einzelne Aufgaben wie beispielsweise Netzwerkregeln und User-Management. In der Folge lassen sich dadurch personelle Ressourcen besser nutzen, da die verschiedenen Aufgaben besser aufgeteilt werden können. Ein weiterer Vorteil ist der Code selbst. Dadurch wird das Einpflegen in eine Versionskontrolle sehr einfach. Der Vorteil von Terraform gegenüber herkömmlichen Shellscripts, die ansonsten dafür verwendet werden, ist die Arbeitsweise. Die Kommunikation mit der Vielzahl verschiedener Provider läuft via API-Befehle. Darüber hinaus prüft Terraform automatisch Abhängigkeiten und setzt diese in der richtigen Reihenfolge um. Die User müssen sich somit keine Gedanken über die Reihenfolge machen. Terraform verfügt über Mechanismen, die diese Überprüfung vornehmen und arbeitet somit idempotent. Die Verwendung von Shellscripten ist dennoch nicht ausgeschlossen – sie können in Terraform integriert werden.

Terraform bietet die Möglichkeit zum Starten einer oder mehrerer VMs. Auch die Einrichtung einer kompletten Lösung bei einem Cloud-Provider ist möglich. Zudem ist die Verwaltung von Kubernetes oder ähnlichen Lösungen über Terraform möglich. Da es sich um ein Open-Source-Tool handelt, lassen sich Erweiterungen mit geringem Aufwand einpflegen.

Doch nun werfen wir mal einen Blick auf den Code von Terraform. Als Beispiel betrachten wir die Erstellung einer VM in AWS:

provider "aws" {
  region                  = "${var.region}"
  shared_credentials_file = "${var.creds}"
  profile                 = "${var.profile}"
}

resource "aws_instance" "web" {
  count = "${var.counts}"

  ami                    = "${var.ami}"
  instance_type          = "${var.ami_type}"
  key_name               = "${var.aws_keyname}"
  vpc_security_group_ids = ["${var.sg_id}"]

  provisioner "remote-exec" {
    inline = [
      "sleep 10",
      "sudo apt-get update && sudo apt -y install python",
    ]

    connection {
      type        = "ssh"
      user        = "ubuntu"
      private_key = "${file(var.pkey)}"
      agent       = false
    }
  }

  tags {
    Name = "${var.aws_tag}-${count.index}"
  }
}

Abhängig von der Anzahl der count-Variable N erstellt dieser Code EC2-VMs. Für Azure sowie andere Cloud-Anbieter oder Povider (z.B. Kubernetes) muss der Code entsprechend angepasst werden. Der Abschnitt über remote-exec zeigt die Möglichkeit der Nutzung von VM Shellbefehlen bzw. -Scripten. Zu  beachten ist jedoch, dass dieser Mechanismus eher rudimentär ist und nicht dieselbe Flexibilität wie beispielsweise Ansible bietet. 

Die Variablen sind in der Datei variables.tf hinterlegt. Der Eintrag „descripton“ ist optional und hilft die Variablen besser zuzuordnen.

variable "region" {
  description = "Region to be used"
}

Ist in der variables.tf kein Wert mit default = „abc“ gesetzt, muss dieser bei „terraform plan“ bzw. „terraform apply“ eingegeben werden. Hier wird der Wert der Variablen abgefragt.

Um diese Variablen an einen zentralem Ort zu hinterlegen, müssen diese in der Datei terraform.tfvars gespeichert werden. Diese Datei kann dann verschlüsselt oder von der Versionskontrolle ausgeschlossen werden. Die Variablen werden wie folgt definiert:

region = "eu-central-1"
}

Mit „terraform init“ definiert Terraform die zur Kommunikation mit dem Provider benötigten Plugins und lädt diese automatisch. Als nächstes kommt „terraform plan“ zum Einsatz: Dieses Feature erstellt eine Übersicht über die von Terraform geplanten Veränderungen unter Berücksichtigung des aktuellen Zustands und der Abhängigkeiten von Ressourcen. Für die Umsetzung wird der Befehl „terraform apply“ verwendet. Mit „terraform destroy“ werden alle mit diesem Code erstellten Ressourcen entfernt.

Doch die Möglichkeit zur deklarativen Definition, die Terraform ermöglicht, hat sowohl Vor- als auch Nachteile: Einerseits sind die übersichtliche Aufführung von vorzunehmenden Änderungen und die leichte Erstellung von komplexen Konstrukten Vorzüge des Tools. Andererseits ist beispielsweise die Provisionierung nicht die Kernfunktion von Terrafom und daher nur sehr rudimentär ausgeprägt. Bei der Erstellung einer VM mit Terraform wird in der Regel ein Image verwendet, das alle benötigten Elemente enthält. Sollte dies nicht der Fall sein, muss die VM bzw. die Ressource in einem separaten Schritt erstellt werden. Dies erfolgt mit Shell-Befehlen oder Scripten. Alternativ können aber auch Configuration-Management-Tools wie Ansible zum Einsatz kommen.

Eine native Ansible-Unterstützung bietet Terraform derzeit nicht. Eine Kombination der beiden Tools ist aber möglich. Ansible kann Terraform-Code ausführen und mittels dynamischen Inventory bzw. Output die Ressource einrichten.

Ansible-Code kann wie folgt aussehen:

---
- hosts: localhost
  connection: local
  gather_facts: False
  tasks:
  - name: Run terraform
    terraform:
      project_path: "{{ project_dir }}"
      state: present
      variables:
        counts : "{{ counts | default(1)}}"
    tags:
      - add
  - name: Remove terraform instance
    terraform:
      project_path: "{{ project_dir }}"
      state: absent
    tags:
      - remove
  - name: Reload inventory
    meta: refresh_inventory
    tags:
      - always
- hosts: "web"
remote_user: ubuntu
become: true
roles:
- role: nginx
tags:
- add
...

Der Umgang mit Terraform ist sehr einfach, sobald ein grundlegendes Verständnis für die genutzten Provider existiert. Dazu ist die offizielle Terraform-Dokumentation sehr hilfreich.

Sind Sie nun neugierig geworden? Probieren Sie Terraform gerne selbst aus, bei Fragen können Sie sich gerne jederzeit an uns und unsere Terraform-Experten wenden.

The following two tabs change content below.
Avatar

Sebastian Oehlke

I am working for more than 10 years with linux and I am especially interested in virtualization, storage solutions and datacenter automation.
Avatar

Neueste Artikel von Sebastian Oehlke (alle ansehen)