Tutorial: Terraform zur Openstack-Verwaltung installieren & nutzen

Version vom 5. Februar 2025, 22:11 Uhr von Rb (Diskussion | Beiträge) (→‎Beispiel: Datenbankserver & Webserver)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Diese Seite befindet sich derzeit in Bearbeitung.

Terraform zur Openstack-Verwaltung installieren & nutzen

Terraform ist 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.

Falls Sie zusätzlich die Openstack CLI verwenden möchten, haben wir hierzu auch ein Tutorial.


Voraussetzungen

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

  1. Zugriff auf unsere OpenStack-Umgebung (af.stack).
  2. Ein Server oder lokaler Rechner mit Linux, macOS oder Windows.
  3. Terraform installiert.

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

  • Initialisierung: Terraform muss das Provider-Plugin herunterladen. Führen Sie dazu den folgenden Befehl aus:
  terraform init
  • Konfiguration validieren: Stellen Sie sicher, dass Ihre Konfiguration keine Fehler enthält:
  terraform validate
  • Test: Testen Sie Ihre Konfig hiermit, um zu sehen, welche Ressourcen genau erstellt und/oder gelöscht werden. Hierbei wird noch nichts angewendet:
  terraform plan
  • Ressourcen anwenden: Hiermit werden die Ressourcen in der Openstack-Umgebung verteilt:
  terraform apply
  • 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: Der Befehl terraform destroy entfernt alle Ressourcen, die in der Konfiguration definiert sind.

Beispiele für Terraform-Konfigurationen

Beispiel: Datenbankserver & Webserver

Die folgende Konfiguration erstellt zwei OpenStack-Instanzen. Die erste Instanz ist ein Datenbankserver, der nur über das interne Netz erreichbar ist. Die zweite Instanz ist ein Webserver, der per HTTP/HTTPS erreichbar ist.

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

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

# Datenbankserver

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 = "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}"
}

# Webserver
 
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"
  }

  network {
    name = "internal_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}"
}