Terraform Provider Selectel



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

Derzeit unterstützt der Anbieter die Ressourcenverwaltung des Virtual Private Cloud-Dienstes (im Folgenden als VPC bezeichnet). In Zukunft planen wir, das Ressourcenmanagement anderer von Selectel bereitgestellter Dienste zu erweitern.

Wie Sie bereits wissen, basiert der VPC-Dienst auf OpenStack. Aufgrund der Tatsache, dass OpenStack keine nativen Tools für die Wartung der öffentlichen Cloud bereitstellt, haben wir die fehlenden Funktionen in einer Reihe zusätzlicher APIs implementiert, die die Verwaltung komplexer zusammengesetzter Objekte vereinfachen und die Arbeit vereinfachen. Ein Teil der in OpenStack verfügbaren Funktionen ist für die direkte Verwendung gesperrt, kann jedoch über unsere API aufgerufen werden .

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 verwendet unsere öffentliche Go-Bibliothek, um mit der VPC-API zu arbeiten. Sowohl die Bibliothek als auch der Anbieter selbst sind Open Source, sie werden auf Github entwickelt:


Zum Verwalten anderer Cloud-Ressourcen wie virtueller Maschinen, Festplatten und Kubernetes-Cluster können Sie den OpenStack Terraform-Anbieter verwenden. Die offizielle Dokumentation für beide Anbieter finden Sie unter folgenden Links:


Erste Schritte


Um zu beginnen, müssen Sie Terraform installieren (Anweisungen und Links zu Installationspaketen finden Sie auf der offiziellen Website ).

Zum Arbeiten benötigt der Anbieter den Selectel-API-Schlüssel, der in der Systemsteuerung für das Konto erstellt wird .

Manifeste für die Arbeit mit Selectel werden mit Terraform oder mit 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 , die kleine wiederverwendbare Module enthalten, die eine Reihe von Parametern als Eingabe verwenden und eine kleine Reihe von Ressourcen verwalten;
  • Beispiele mit Beispielen eines vollständigen Satzes miteinander verbundener Module.

Nachdem Sie Terraform installiert, einen Selectel-API-Schlüssel erstellt und sich mit Beispielen vertraut gemacht haben, fahren wir mit praktischen Beispielen fort.

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


Betrachten Sie das Beispiel zum Erstellen eines Projekts, eines Benutzers mit einer Rolle und einer virtuellen Maschine mit einer lokalen Festplatte: terraform-examples / examples / vpc / server_local_root_disk .

Die Datei vars.tf beschreibt alle Parameter, die beim Aufrufen der Module verwendet werden. Einige von ihnen haben Standardwerte, z. B. wird der Server in der ru-3a- Zone mit der folgenden Konfiguration erstellt:

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

In der Datei main.tf wird der Selectel-Anbieter 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 Pfad zur Datei angegeben werden. Sie können auch einen Wert als Zeichenfolge hinzufügen.

Weiter in dieser Datei werden die Module project_with_user und server_local_root_disk gestartet, die die erforderlichen Ressourcen verwalten.

Wir werden diese Module genauer analysieren.

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 einer lokalen Festplatte


Das zweite Modul verwaltet die OpenStack-Objekte, 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 openstack_compute_instance_v2 angegeben sind:

 resource "openstack_compute_instance_v2" "instance_1" { ... lifecycle { ignore_changes = ["image_id"] } vendor_options { ignore_resize_confirmation = true } } 

Mit dem Argument ignore_changes können Sie die Änderung des ID- Attributs für das Image ignorieren, das zum Erstellen der virtuellen Maschine verwendet wird. Im VPC-Dienst werden die meisten öffentlichen Bilder einmal pro Woche automatisch aktualisiert, und ihre ID ändert sich ebenfalls. Dies liegt an den Funktionen der OpenStack-Glance-Komponente, in der Bilder als unveränderliche Einheiten betrachtet werden.

Wenn ein vorhandener Server oder eine vorhandene Festplatte erstellt oder geändert wird, wobei die ID des öffentlichen Abbilds als Argument für image_id verwendet wird , wird nach dem Aktualisieren dieses Abbilds durch Neustart des Terraform-Manifests der Server oder die Festplatte neu erstellt. Die Verwendung des Arguments ignore_changes vermeidet diese Situation.

Hinweis: Das Argument ignore_changes wurde vor langer Zeit in Terraform angezeigt : pull # 2525 .

Das Argument ignore_resize_confirmation wird benötigt, um die Größe der lokalen Festplatte, der Kerne oder des Serverspeichers erfolgreich zu ändern. Solche Änderungen werden über die OpenStack Nova-Komponente mithilfe der Größenänderungsanforderung vorgenommen . Standardmäßig versetzt Nova nach einer Größenänderungsanforderung den Server in den Status " verify_resize " und wartet auf eine zusätzliche Bestätigung durch den Benutzer. Dieses Verhalten kann jedoch geändert werden, sodass Nova nicht auf zusätzliche Aktionen des Benutzers wartet.

Mit dem angegebenen Argument kann Terraform nicht auf den Status verify_resize für den Server warten und darauf vorbereitet sein, dass der Server nach Änderung seiner Parameter im aktiven Status ist. Das Argument ist ab Version 1.10.0 des OpenStack Terraform-Anbieters verfügbar: Pull # 422 .

Ressourcenerstellung


Vor dem Starten von Manifesten sollte beachtet werden, dass in unserem Beispiel zwei verschiedene Anbieter gestartet werden und der OpenStack-Anbieter von den Ressourcen des Selectel-Anbieters abhängt, da es unmöglich ist, dazugehörige Objekte zu verwalten, ohne einen Benutzer im Projekt zu erstellen. Aus dem gleichen Grund können wir den Befehl terraform apply in unserem Beispiel leider nicht einfach ausführen. Wir müssen uns zuerst für das Modul project_with_user und danach für alles andere bewerben .

Hinweis: Dieses Problem wurde in Terraform noch nicht behoben. Sie können die Diskussion zu Github in Ausgabe 2430 und Ausgabe 4149 verfolgen.

Um Ressourcen zu erstellen, gehen wir zum Verzeichnis terraform-examples / examples / vpc / server_local_root_disk. Der Inhalt sollte folgendermaßen 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 Sie zunächst das Modul project_with_user an . In diesem Fall müssen Sie die Werte für Variablen, die nicht festgelegt wurden, manuell übertragen:

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

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

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

Um das Modul zu verwenden, müssen die Werte SEL_ACCOUNT , SEL_TOKEN und USER_PASSWORD durch Ausführen des folgenden Befehls ersetzt werden:

 $ 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 dem Ausführen des Befehls Terraform wird angezeigt, welche Ressourcen erstellt werden sollen, und es muss eine Bestätigung erforderlich sein:

 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 das Projekt, der Benutzer und die Rolle erstellt wurden, können Sie mit dem Erstellen der verbleibenden 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 einer externen IP-Adresse, unter der auf den erstellten Server zugegriffen werden kann:

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

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

Ressourcenbearbeitung


Sie können nicht nur Ressourcen über Terraform erstellen, sondern auch ändern.

Erhöhen Sie beispielsweise die Anzahl der Kerne und den Speicher für unseren Server, indem Sie die Werte für die Parameter server_vcpus und server_ram_mb in der Datei examples / vpc / server_local_root_disk / main.tf ändern :

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

Danach überprüfen wir mit dem folgenden Befehl, zu welchen Änderungen dies führen wird:

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

Infolgedessen nahm Terraform Änderungen an den Ressourcen openstack_compute_instance_v2 und openstack_compute_flavor_v2 vor .

Bitte beachten Sie, dass dies zu einem Neustart der erstellten virtuellen Maschine führt.

Verwenden Sie zum Anwenden der neuen Konfiguration der virtuellen Maschine den Befehl terraform apply , den wir bereits zuvor ausgeführt haben.

Alle erstellten Objekte werden in der VPC-Systemsteuerung angezeigt:



In unserem Beispiel-Repository sehen Sie auch Manifeste zum Erstellen virtueller Maschinen mit Netzwerklaufwerken.

Beispiel für einen Kubernetes-Cluster


Bevor wir mit dem nächsten Beispiel fortfahren, werden die zuvor erstellten Ressourcen gelöscht. Führen Sie dazu im Projektstamm terraform-examples / examples / vpc / server_local_root_disk 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 als Nächstes den Befehl Selectel VPC API Object Cleanup aus:

 $ 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 wird ein Projekt erstellt, ein Benutzer mit einer Rolle im Projekt, und ein Kubernetes-Cluster wird ausgelöst. In der Datei vars.tf sehen Sie die Standardwerte wie die Anzahl der Knoten, ihre Eigenschaften, die Version von Kubernetes und vieles mehr.

Um Ressourcen zu erstellen, initialisieren wir ähnlich wie im ersten Beispiel zunächst die Module und erstellen die Modulressourcen project_with_user. Anschließend erstellen Sie den Rest:

 $ 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 geben die Erstellung und Verwaltung von Kubernetes-Clustern über die OpenStack Magnum-Komponente weiter. Weitere Informationen zum Arbeiten mit einem Cluster finden Sie in einem unserer vorherigen Artikel sowie in der Wissensdatenbank .

Während der Clustervorbereitung werden Festplatten und virtuelle Maschinen erstellt und alle erforderlichen Komponenten installiert. Die Vorbereitung dauert ca. 4 Minuten. Zu diesem Zeitpunkt zeigt Terraform Meldungen des Formulars an:

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

Nach Abschluss der Installation informiert Terraform Sie, dass der Cluster bereit ist, und zeigt seine Kennung 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 kubectl zu verwalten, müssen Sie die Clusterzugriffsdatei erhalten. Wechseln Sie dazu zu dem über Terraform erstellten Projekt in der Liste der Projekte in Ihrem Konto:



Folgen Sie als Nächstes dem Link des Formulars xxxxxx.selvpc.ru , das unter dem Projektnamen angezeigt wird:



Verwenden Sie den Benutzernamen und das Kennwort, die über Terraform erstellt wurden, als Anmeldeinformationen. Wenn Sie in unserem Beispiel weder vars.tf noch main.tf geändert haben, hat der Benutzer den Namen tf_user . Verwenden Sie als Kennwort den Wert der Variablen TF_VAR_user_password , der angegeben wurde, als terraform apply früher ausgeführt wurde.

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



Hier ist ein Cluster, der über Terraform erstellt wurde. Sie können die Datei für kubectl auf der Registerkarte "Zugriff" herunterladen:



Die gleiche Registerkarte enthält Anweisungen zum Installieren von kubectl und zum Verwenden der heruntergeladenen Datei config.yaml .

Nachdem Sie kubectl gestartet und die Umgebungsvariable KUBECONFIG festgelegt haben, können Sie 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.
Der folgende Wert ist in der Datei main.tf angegeben:

 cluster_node_count = "${var.cluster_node_count}" 

Dieser Wert wird durch vars.tf ersetzt :



 variable "cluster_node_count" { default = 2 } 

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

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

Verwenden Sie den Befehl terraform apply, um die Änderungen wie im ersten Beispiel anzuwenden :

 $ 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 

Fazit


In diesem Artikel haben wir die grundlegenden Möglichkeiten für die Arbeit mit der "Virtual Private Cloud" über Terraform kennengelernt. Wir freuen uns, wenn Sie den offiziellen Terraform-Anbieter Selectel nutzen und Feedback geben.

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

Source: https://habr.com/ru/post/de445162/


All Articles