
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.