Tutorial: Terraform zur Openstack-Verwaltung installieren & nutzen

Terraform zur Openstack-Verwaltung installieren & nutzen

Ähnlich zur Openstack-CLI (Tutorial) ist Terraform ein leistungsstarkes Tool zur Infrastrukturautomatisierung, das es ermöglicht, Ressourcen in der Cloud deklarativ zu erstellen, zu verwalten und zu organisieren. In Kombination mit OpenStack bietet Terraform eine Möglichkeit, eine eigene Cloud-Umgebung effizient zu verwalten. In diesem Artikel zeigen wir, wie Sie Terraform mit OpenStack konfigurieren und nutzen können.

Alternativ zur Terraform gibt es Tools wie die Openstack-CLI (Tutorial), OpenTofu und Ansible, die eine effiziente Verwaltung und Automatisierung von OpenStack-Ressourcen ermöglichen. Diese Tools können beispielsweise dazu verwendet werden, wiederholbare Deployments zu erstellen und den gesamten Prozess zu vereinfachen.


Voraussetzungen

Um Terraform in Verbindung mit OpenStack zu nutzen, sollten folgende Voraussetzungen erfüllt sein:

  1. Zugriff auf die OpenStack-Umgebung über unsere API.
  2. Ein Server oder lokaler Rechner mit Linux, macOS oder Windows.
  3. Terraform installiert (mindestens Version 1.x).

Schritt 1: API Zugang aktivieren

Um den API Zugang zu aktivieren, müssen Sie ein Passwort für diesen anlegen.

Afstack api activate.png

  1. Ihr API-Username.
  2. Ihr API-Passwort.
  3. Ihre Konfigurationsdatei, um auf die API zuzugreifen.
  4. Hiermit aktivieren Sie den API-Zugang.

Schritt 2: Terraform konfigurieren

Hauptkonfigurationsdatei erstellen

Erstellen Sie eine Datei namens main.tf mit folgendem Inhalt:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "~> 1.53.0"
    }
  }
}

provider "openstack" {
  user_name = "API-Benutzername"
  password = "PasswortAPI-User"
  auth_url = "https://api.afstack.io:5000/v3"
  region = "RegionOne"
}

resource "openstack_compute_instance_v2" "Beispielname" {
  name            = "Beispielname"
  image_name      = "Ubuntu 20.04"
  flavor_name     = "a1.xs"
  key_pair        = "deinSSHKey"
  network {
    name = "Netzwerkname"
  }
}

Erläuterung der Konfiguration

  • terraform: Gibt die erforderliche Terraform-Version sowie das Provider-Plugin an.
  • provider "openstack": Hier werden die Verbindungsdetails für Ihre OpenStack-Umgebung angegeben:
    • auth_url: Die Authentifizierungs-URL Ihres OpenStack-Anbieters.
    • region: Region der Cloud-Ressourcen.
    • user_name, password: Ihre Zugangsdaten.
  • resource "openstack_compute_instance_v2": Definiert die zu erstellende Instanz:
    • name: Der Name der Instanz.
    • image_name: Das Betriebssystem-Image.
    • flavor_name: Das Flavor, welches die .
    • key_pair: Ein SSH-Schlüsselpaar für den Zugriff.
    • network: Das Netzwerk, mit dem die Instanz verbunden wird.

Das Anlegen von 2 Beispielinstanzen wird unten bei den Beispielen genauer erklärt.


Schritt 3: Terraform ausführen

  1. Initialisierung: Terraform muss das Provider-Plugin herunterladen. Führen Sie dazu den folgenden Befehl aus:
  terraform init
  1. Konfiguration validieren: Stellen Sie sicher, dass Ihre Konfiguration keine Fehler enthält:
  terraform validate
  1. Test: Testen Sie Ihre Konfig hiermit, um zu sehen, welche Ressourcen genau erstellt und/oder gelöscht werden. Hierbei wird noch nichts erstellt:
  terraform plan
  1. Ressourcen anwenden: Hiermit werden die Ressourcen in der Openstack-Umgebung verteilt:
  terraform apply
  1. Verifikation: Überprüfen Sie, ob die Ressourcen erfolgreich erstellt wurden. Sie können dazu entweder die OpenStack-CLI oder das OpenStack-Dashboard verwenden.

Schritt 4: Ressourcen verwalten und löschen

Terraform bietet Funktionen, um Ressourcen zu ändern oder zu löschen:

  • Änderungen anwenden: Passen Sie Ihre main.tf-Datei an und führen Sie erneut terraform apply aus.
  • Ressourcen löschen:
  terraform destroy
 Dieser Befehl entfernt alle Ressourcen, die in der Konfiguration definiert sind.

Beispiele für Terraform-Konfigurationen

Beispiel: Zwei Instanzen mit internen Subnetzen und Floating IPs

Die folgende Konfiguration erstellt zwei OpenStack-Instanzen, die jeweils mit einem internen Subnetz verbunden sind und eine eigene Floating IP erhalten:

terraform {
required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "~> 1.53.0"
    }
  }
}
# Configure the OpenStack Provider
provider "openstack" {
  user_name = "a35445"
  password = ""
  auth_url = "https://api.afstack.io:5000/v3"
  region = "RegionOne"
}

# ersteinstanz

resource "openstack_blockstorage_volume_v3" "example_volume" {
  name        = "example-volume"
  size        = 20
  image_id  = "331de7a6-d4fc-4df5-8650-966dde64dacc"
}

resource "openstack_networking_network_v2" "internal_network" {
  name           = "internal_network"
  admin_state_up = "true"
}

resource "openstack_compute_keypair_v2" "provisioning-key" {
  name = "provisioning-key"
}

resource "openstack_networking_subnet_v2" "internal_subnet" {
  network_id = "${openstack_networking_network_v2.internal_network.id}"
  cidr       = "192.168.0.0/24"
  enable_dhcp = "false"
  no_gateway = "true"
}

resource "openstack_compute_instance_v2" "my_instance" {
  name      = "my_instance"
  image_name = "Ubuntu 20.04 LTS (20240821)"
  flavor_name = "a1.xs"
  key_pair  = "provisioning-key"

  block_device {
    uuid = openstack_blockstorage_volume_v3.example_volume.id
    source_type = "volume"
    destination_type = "volume"
    boot_index = 0
    delete_on_termination = true
  }

  network {
    name = "shared-public-network"
  }

  network {
    name = "internal_network"
  }
}

resource "openstack_compute_floatingip_v2" "floatip_1" {
  pool = "af-external-customer"
}

resource "openstack_compute_floatingip_associate_v2" "floatip_1" {
  floating_ip = "${openstack_compute_floatingip_v2.floatip_1.address}"
  instance_id = "${openstack_compute_instance_v2.my_instance.id}"
}

# zweite Instanz
resource "openstack_blockstorage_volume_v3" "example_volume1" {
  name        = "example-volume1"
  size        = 20
  image_id  = "331de7a6-d4fc-4df5-8650-966dde64dacc"
}

resource "openstack_compute_keypair_v2" "provisioning-key1" {
  name = "provisioning-key1"
}

resource "openstack_compute_instance_v2" "my_instance1" {
  name      = "my_instance1"
  image_name = "Ubuntu 20.04 LTS (20240821)"
  flavor_name = "a1.xs"
  key_pair  = "provisioning-key1"

  block_device {
    uuid = openstack_blockstorage_volume_v3.example_volume1.id
    source_type = "volume"
    destination_type = "volume"
    boot_index = 0
    delete_on_termination = true
  }

  network {
    name = "shared-public-network"
  }
}

resource "openstack_compute_floatingip_v2" "floatip_11" {
  pool = "af-external-customer"
}

resource "openstack_compute_floatingip_associate_v2" "floatip_11" {
  floating_ip = "${openstack_compute_floatingip_v2.floatip_11.address}"
  instance_id = "${openstack_compute_instance_v2.my_instance1.id}"
}