
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 (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 .
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:
- Bibliotheksrepository ,
- Anbieter-Repository .
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:
- Ausgewählte Ressourcendokumentation: ,
- OpenStack-Ressourcendokumentation: .
Erste Schritte
Um zu beginnen, müssen Sie Terraform installieren (Anweisungen und Links zu Installationspaketen finden Sie unter ).
Zum Betrieb benötigt der Anbieter einen Selectel-API-Schlüssel, der in erstellt wird .
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: .
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: .
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: .
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: .
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: .
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 и .
Um Ressourcen zu erstellen, gehen Sie in das Verzeichnis , 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 .
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 :

In unserem 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 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 .
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 und so in .
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:

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

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:

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

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
Fazit
In diesem Artikel haben wir uns mit den wichtigsten Arbeitsmethoden vertraut gemacht ü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 .
Source: habr.com
