Terraform-Anbieter Selectel

Terraform-Anbieter Selectel

Wir haben einen offiziellen Terraform-Anbieter für die Zusammenarbeit mit Selectel gestartet. Mit diesem Produkt können Benutzer das Ressourcenmanagement mithilfe der Infrastructure-as-Code-Methodik vollständig implementieren.

Der Anbieter unterstützt derzeit die Verwaltung von Serviceressourcen „Virtuelle private Cloud“ (im Folgenden VPC genannt). In Zukunft planen wir, das Ressourcenmanagement für andere von Selectel bereitgestellte Dienste hinzuzufügen.

Wie Sie bereits wissen, basiert der VPC-Dienst auf OpenStack. Da OpenStack jedoch keine nativen Tools für die Bereitstellung der öffentlichen Cloud bereitstellt, haben wir die fehlende Funktionalität in eine Reihe zusätzlicher APIs implementiert, die die Verwaltung komplexer zusammengesetzter Objekte vereinfachen und die Arbeit komfortabler machen. Einige der in OpenStack verfügbaren Funktionen sind für die direkte Nutzung gesperrt, stehen aber über zur Verfügung unsere API.

Der Selectel Terraform-Anbieter bietet jetzt die Möglichkeit, die folgenden VPC-Ressourcen zu verwalten:

  • Projekte und ihre Quoten;
  • Benutzer, ihre Rollen und Token;
  • öffentliche Subnetze, einschließlich überregionaler und VRRP;
  • Softwarelizenzen.

Der Anbieter nutzt unsere öffentliche Go-Bibliothek, um mit der VPC-API zu arbeiten. Sowohl die Bibliothek als auch der Anbieter selbst sind Open Source, ihre Entwicklung erfolgt auf Github:

Um andere Cloud-Ressourcen wie virtuelle Maschinen, Festplatten und Kubernetes-Cluster zu verwalten, können Sie den OpenStack Terraform-Anbieter verwenden. Die offizielle Dokumentation beider Anbieter ist unter den folgenden Links verfügbar:

Erste Schritte

Um zu beginnen, müssen Sie Terraform installieren (Anweisungen und Links zu Installationspaketen finden Sie unter die offizielle Seite).

Zum Betrieb benötigt der Anbieter einen Selectel-API-Schlüssel, der in erstellt wird Kontokontrollfelder.

Manifeste für die Arbeit mit Selectel werden mit Terraform oder mithilfe einer Reihe vorgefertigter Beispiele erstellt, die in unserem Github-Repository verfügbar sind: Terraform-Beispiele.

Das Repository mit Beispielen ist in zwei Verzeichnisse unterteilt:

  • Module, enthält kleine wiederverwendbare Module, die eine Reihe von Parametern als Eingabe verwenden und eine kleine Menge an Ressourcen verwalten;
  • Beispiele, mit Beispielen eines vollständigen Satzes miteinander verbundener Module.

Nachdem wir Terraform installiert, einen Selectel-API-Schlüssel erstellt und uns mit den Beispielen vertraut gemacht haben, gehen wir zu praktischen Beispielen über.

Ein Beispiel für die Erstellung eines Servers mit einer lokalen Festplatte

Schauen wir uns ein Beispiel für die Erstellung eines Projekts, eines Benutzers mit einer Rolle und einer virtuellen Maschine mit einer lokalen Festplatte an: terraform-examples/examples/vpc/server_local_root_disk.

Im Ordner vars.tf Alle Parameter, die beim Aufruf von Modulen verwendet werden, werden beschrieben. Einige von ihnen haben Standardwerte, beispielsweise wird der Server in der Zone erstellt de-3a mit folgender Konfiguration:

variable "server_vcpus" {
default = 4
}

variable "server_ram_mb" {
default = 8192
}

variable "server_root_disk_gb" {
default = 8
}

variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}

Im Ordner main.tf Der Selectel-Anbieter wird initialisiert:

provider "selectel" {
token    = "${var.sel_token}"
}

Diese Datei enthält auch den Standardwert für den SSH-Schlüssel, der auf dem Server installiert wird:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

Bei Bedarf können Sie einen anderen öffentlichen Schlüssel angeben. Der Schlüssel muss nicht als Dateipfad angegeben werden, Sie können den Wert auch als String hinzufügen.

Weiter in dieser Datei werden die Module gestartet project_with_user и server_local_root_disk, die die notwendigen Ressourcen verwalten.

Schauen wir uns diese Module genauer an.

Erstellen eines Projekts und eines Benutzers mit einer Rolle

Das erste Modul erstellt ein Projekt und einen Benutzer mit einer Rolle in diesem Projekt: terraform-examples/modules/vpc/project_with_user.

Der erstellte Benutzer kann sich bei OpenStack anmelden und seine Ressourcen verwalten. Das Modul ist einfach und verwaltet nur drei Entitäten:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Erstellen eines virtuellen Servers mit lokaler Festplatte

Das zweite Modul befasst sich mit der Verwaltung von OpenStack-Objekten, die zum Erstellen eines Servers mit einer lokalen Festplatte erforderlich sind.

Sie sollten einige der Argumente beachten, die in diesem Modul für die Ressource angegeben werden openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

Argument ignoriere_Änderungen ermöglicht es Ihnen, Attributänderungen zu ignorieren id für das Image, das zum Erstellen der virtuellen Maschine verwendet wird. Im VPC-Dienst werden die meisten öffentlichen Bilder einmal pro Woche automatisch aktualisiert und gleichzeitig ihre id ändert sich auch. Dies liegt an den Besonderheiten der OpenStack-Komponente Glance, in der Bilder als unveränderliche Einheiten gelten.

Wenn Sie einen vorhandenen Server oder eine vorhandene Festplatte erstellen oder ändern, ist dies ein Argument image_id benutzt id Wenn Sie ein öffentliches Image erstellt haben, wird nach der Aktualisierung dieses Images durch erneutes Ausführen des Terraform-Manifests der Server oder die Festplatte neu erstellt. Ein Argument verwenden ignoriere_Änderungen ermöglicht es Ihnen, eine solche Situation zu vermeiden.

Hinweis: Argument ignoriere_Änderungen erschien vor ziemlich langer Zeit in Terraform: pull#2525.

Argument ignore_resize_confirmation erforderlich, um die Größe der lokalen Festplatte, der Kerne oder des Serverspeichers erfolgreich zu ändern. Solche Änderungen werden über die OpenStack Nova-Komponente per Anfrage vorgenommen Größe. Standard Nova auf Anfrage Größe versetzt den Server in den Status überprüfen_resize und wartet auf eine zusätzliche Bestätigung des Benutzers. Dieses Verhalten kann jedoch geändert werden, sodass Nova nicht auf weitere Aktionen des Benutzers wartet.

Das angegebene Argument ermöglicht es Terraform, nicht auf den Status zu warten überprüfen_resize für den Server und seien Sie darauf vorbereitet, dass sich der Server nach der Änderung seiner Parameter in einem aktiven Status befindet. Das Argument ist ab Version 1.10.0 des OpenStack Terraform-Anbieters verfügbar: pull#422.

Ressourcen erstellen

Bevor Sie die Manifeste ausführen, beachten Sie bitte, dass in unserem Beispiel zwei verschiedene Anbieter gestartet werden und der OpenStack-Anbieter von den Ressourcen des Selectel-Anbieters abhängt, da es ohne die Erstellung eines Benutzers im Projekt nicht möglich ist, die dazugehörigen Objekte zu verwalten . Aus demselben Grund können wir den Befehl leider nicht einfach ausführen Terraform anwenden in unserem Beispiel. Wir müssen zuerst tun sich bewerben für Modul project_with_user und danach für alles andere.

Hinweis: Dieses Problem ist in Terraform noch nicht gelöst. Sie können die Diskussion auf Github unter verfolgen Ausgabe #2430 и Ausgabe #4149.

Um Ressourcen zu erstellen, gehen Sie in das Verzeichnis terraform-examples/examples/vpc/server_local_root_disk, sein Inhalt sollte so aussehen:

$ ls
README.md	   main.tf		vars.tf

Wir initialisieren die Module mit dem Befehl:

$ terraform init

Die Ausgabe zeigt, dass Terraform die neuesten Versionen der verwendeten Anbieter herunterlädt und alle im Beispiel beschriebenen Module überprüft.

Wenden wir zunächst das Modul an project_with_user. Dies erfordert die manuelle Übergabe von Werten für Variablen, die nicht festgelegt wurden:

  • sel_account mit Ihrer Selectel-Kontonummer;
  • sel_token mit Ihrem Schlüssel für die Selectel API;
  • Benutzer-Passwort mit einem Passwort für den OpenStack-Benutzer.

Die Werte für die ersten beiden Variablen müssen entnommen werden Bedienfelder.

Für die letzte Variable können Sie sich ein beliebiges Passwort ausdenken.

Um das Modul verwenden zu können, müssen Sie die Werte ersetzen SEL_ACCOUNT, SEL_TOKEN и BENUTZER-PASSWORT Ausführen des Befehls:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

Nach der Ausführung des Befehls zeigt Terraform an, welche Ressourcen es erstellen möchte, und bittet um Bestätigung:

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

Sobald Projekt, Benutzer und Rolle erstellt wurden, können Sie mit der Erstellung der restlichen Ressourcen beginnen:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Achten Sie beim Erstellen von Ressourcen auf die Terraform-Ausgabe mit der externen IP-Adresse, unter der der erstellte Server erreichbar sein wird:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

Sie können mit der erstellten virtuellen Maschine über SSH unter Verwendung der angegebenen IP arbeiten.

Bearbeiten von Ressourcen

Zusätzlich zur Erstellung von Ressourcen über Terraform können diese auch geändert werden.

Erhöhen wir beispielsweise die Anzahl der Kerne und des Speichers für unseren Server, indem wir die Werte für die Parameter ändern server_vcpus и server_ram_mb im Ordner Beispiele/vpc/server_local_root_disk/main.tf:

-  server_vcpus        = "${var.server_vcpus}"
-  server_ram_mb       = "${var.server_ram_mb}"
+  server_vcpus        = 8
+  server_ram_mb       = 10240

Anschließend prüfen wir mit dem folgenden Befehl, welche Änderungen dies mit sich bringt:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform plan

Infolgedessen hat Terraform eine Ressourcenänderung vorgenommen openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Bitte beachten Sie, dass dies einen Neustart der erstellten virtuellen Maschine erfordert.

Um die neue Konfiguration der virtuellen Maschine anzuwenden, verwenden Sie den Befehl Terraform anwenden, das wir bereits früher gestartet haben.

Alle erstellten Objekte werden in angezeigt VPC-Bedienfelder:

Terraform-Anbieter Selectel

In unserem Beispiel-Repositories Sie können auch Manifeste zum Erstellen virtueller Maschinen mit Netzlaufwerken anzeigen.

Beispiel für die Erstellung eines Kubernetes-Clusters

Bevor wir mit dem nächsten Beispiel fortfahren, bereinigen wir die zuvor erstellten Ressourcen. Tun Sie dies im Stammverzeichnis des Projekts terraform-examples/examples/vpc/server_local_root_disk Führen wir den Befehl zum Löschen von OpenStack-Objekten aus:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.server_local_root_disk

Führen Sie dann den Befehl aus, um Selectel VPC API-Objekte zu löschen:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.project_with_user

In beiden Fällen müssen Sie das Löschen aller Objekte bestätigen:

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

Das folgende Beispiel befindet sich im Verzeichnis terraform-examples/examples/vpc/kubernetes_cluster.

In diesem Beispiel werden ein Projekt, ein Benutzer mit einer Rolle im Projekt und ein Kubernetes-Cluster erstellt. Im Ordner vars.tf Sie können Standardwerte sehen, z. B. die Anzahl der Knoten, ihre Eigenschaften, die Kubernetes-Version usw.

Um Ressourcen ähnlich dem ersten Beispiel zu erstellen, beginnen wir zunächst mit der Initialisierung von Modulen und der Erstellung von Modulressourcen project_with_userund dann alles andere erstellen:

$ terraform init

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Wir werden die Erstellung und Verwaltung von Kubernetes-Clustern durch die OpenStack Magnum-Komponente übertragen. Weitere Informationen zur Arbeit mit einem Cluster finden Sie in einem unserer vorherige Artikelund so in Wissensbasis.

Bei der Vorbereitung des Clusters werden Festplatten und virtuelle Maschinen erstellt und alle notwendigen Komponenten installiert. Die Vorbereitung dauert etwa 4 Minuten. Während dieser Zeit zeigt Terraform Meldungen an wie:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

Sobald die Installation abgeschlossen ist, zeigt Terraform an, dass der Cluster bereit ist, und zeigt seine ID an:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Um den erstellten Kubernetes-Cluster über das Dienstprogramm zu verwalten kubectl Sie müssen die Cluster-Zugriffsdatei erhalten. Gehen Sie dazu in der Projektliste Ihres Kontos auf das über Terraform erstellte Projekt:

Terraform-Anbieter Selectel

Folgen Sie anschließend dem Link „Gefällt mir“. xxxxxx.selvpc.ruwelches unter dem Projektnamen erscheint:

Terraform-Anbieter Selectel

Verwenden Sie für die Anmeldeinformationen den Benutzernamen und das Passwort, die Sie über Terraform erstellt haben. Wenn Sie nicht betrogen haben vars.tf oder main.tf In unserem Beispiel erhält der Benutzer den Namen tf_user. Sie müssen den Wert der Variablen als Passwort verwenden TF_VAR_user_password, die beim Start angegeben wurde Terraform anwenden früher.

Innerhalb des Projekts müssen Sie zur Registerkarte gehen Kubernetes:

Terraform-Anbieter Selectel

Hier befindet sich der über Terraform erstellte Cluster. Datei herunterladen für kubectl Sie können auf der Registerkarte „Zugriff“:

Terraform-Anbieter Selectel

Installationsanweisungen finden Sie auf derselben Registerkarte. kubectl und Nutzung der heruntergeladenen Dateien config.yaml.

Nach dem Start der kubectl und Festlegen der Umgebungsvariablen KUBECONFIG Sie können Kubernetes verwenden:

$ kubectl get pods --all-namespaces

NAMESPACE        NAME                                    READY  STATUS  RESTARTS AGE
kube-system   coredns-9578f5c87-g6bjf                      1/1   Running   0 8m
kube-system   coredns-9578f5c87-rvkgd                     1/1   Running   0 6m
kube-system   heapster-866fcbc879-b6998                 1/1   Running   0 8m
kube-system   kube-dns-autoscaler-689688988f-8cxhf             1/1   Running   0 8m
kube-system   kubernetes-dashboard-7bdb5d4cd7-jcjq9          1/1   Running   0 8m
kube-system   monitoring-grafana-84c97bb64d-tc64b               1/1   Running   0 8m
kube-system   monitoring-influxdb-7c8ccc75c6-dzk5f                1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1   Running   0 8m
kube-system   openstack-cloud-controller-manager-8vrmp        1/1   Running   3 8m
prometeus-monitoring   grafana-76bcb7ffb8-4tm7t       1/1   Running   0 8m
prometeus-monitoring   prometheus-75cdd77c5c-w29gb           1/1   Running   0 8m

Die Anzahl der Clusterknoten kann einfach über Terraform geändert werden.
Im Ordner main.tf folgender Wert wird angegeben:

cluster_node_count = "${var.cluster_node_count}"

Dieser Wert wird durch ersetzt vars.tf:

variable "cluster_node_count" {
default = 2
}

Sie können entweder den Standardwert in ändern vars.tf, oder geben Sie den erforderlichen Wert direkt in an main.tf:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

Um die Änderungen wie im ersten Beispiel zu übernehmen, verwenden Sie den Befehl Terraform anwenden:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Wenn sich die Anzahl der Knoten ändert, bleibt der Cluster verfügbar. Nachdem Sie einen Knoten über Terraform hinzugefügt haben, können Sie ihn ohne zusätzliche Konfiguration verwenden:

$ kubectl get nodes
NAME                               STATUS                     ROLES     AGE   VERSION
tf-cluster-rz6nggvs4va7-master-0   Ready,SchedulingDisabled   master    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-0   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-1   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-2   Ready                      <none>    3m    v1.12.4

Abschluss

In diesem Artikel haben wir uns mit den wichtigsten Arbeitsmethoden vertraut gemacht „Virtuelle private Cloud“ über Terraform. Wir freuen uns, wenn Sie den offiziellen Selectel Terraform-Anbieter nutzen und Feedback geben.

Alle im Selectel Terraform-Anbieter gefundenen Fehler können über gemeldet werden Github-Probleme.

Source: habr.com

Kommentar hinzufügen