Furnizor Terraform Selectel

Furnizor Terraform Selectel

Am lansat un furnizor oficial Terraform pentru a lucra cu Selectel. Acest produs permite utilizatorilor să implementeze pe deplin gestionarea resurselor prin metodologia Infrastructure-as-code.

Furnizorul acceptă în prezent gestionarea resurselor de servicii „Cloud privat virtual” (denumit în continuare VPC). În viitor, intenționăm să adăugăm managementul resurselor pentru alte servicii furnizate de Selectel.

După cum știți deja, serviciul VPC este construit pe OpenStack. Cu toate acestea, datorită faptului că OpenStack nu oferă instrumente native pentru deservirea cloud-ului public, am implementat funcționalitatea lipsă într-un set de API-uri suplimentare care simplifică gestionarea obiectelor compozite complexe și fac munca mai convenabilă. Unele dintre funcționalitățile disponibile în OpenStack sunt închise de la utilizarea directă, dar sunt disponibile prin API-ul nostru.

Furnizorul Selectel Terraform include acum capacitatea de a gestiona următoarele resurse VPC:

  • proiecte și cotele acestora;
  • utilizatorii, rolurile și simbolurile acestora;
  • subrețele publice, inclusiv interregionale și VRRP;
  • licențe software.

Furnizorul folosește biblioteca noastră publică Go pentru a lucra cu API-ul VPC. Atât biblioteca, cât și furnizorul în sine sunt open-source, dezvoltarea lor se realizează pe Github:

Pentru a gestiona alte resurse cloud, cum ar fi mașini virtuale, discuri, clustere Kubernetes, puteți utiliza furnizorul OpenStack Terraform. Documentația oficială pentru ambii furnizori este disponibilă la următoarele link-uri:

Noțiuni de bază

Pentru a începe, trebuie să instalați Terraform (instrucțiunile și linkurile către pachetele de instalare pot fi găsite la site-ul oficial).

Pentru a funcționa, furnizorul necesită o cheie API Selectel, care este creată în panouri de control al contului.

Manifestele pentru lucrul cu Selectel sunt create folosind Terraform sau folosind un set de exemple gata făcute care sunt disponibile în depozitul nostru Github: terraform-exemple.

Depozitul cu exemple este împărțit în două directoare:

  • module, care conțin module mici reutilizabile care preiau un set de parametri ca intrare și gestionează un set mic de resurse;
  • exemple, care conține exemple de un set complet de module interconectate.

După instalarea Terraform, crearea unei chei API Selectel și familiarizarea cu exemplele, să trecem la exemple practice.

Un exemplu de creare a unui server cu un disc local

Să ne uităm la un exemplu de creare a unui proiect, a unui utilizator cu rol și a unei mașini virtuale cu un disc local: terraform-examples/examples/vpc/server_local_root_disk.

În dosar vars.tf sunt descriși toți parametrii care vor fi utilizați la apelarea modulelor. Unele dintre ele au valori implicite, de exemplu, serverul va fi creat în zonă ru-3a cu următoarea configurație:

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

În dosar principal.tf Furnizorul Selectel este inițializat:

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

Acest fișier conține și valoarea implicită pentru cheia SSH care va fi instalată pe server:

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

Dacă este necesar, puteți specifica o cheie publică diferită. Cheia nu trebuie să fie specificată ca cale de fișier; puteți adăuga și valoarea ca șir.

Mai departe, în acest fișier sunt lansate modulele proiect_cu_utilizator и server_local_root_disk, care gestionează resursele necesare.

Să ne uităm la aceste module mai detaliat.

Crearea unui proiect și a unui utilizator cu rol

Primul modul creează un proiect și un utilizator cu rol în acel proiect: terraform-examples/module/vpc/project_with_user.

Utilizatorul creat se va putea conecta la OpenStack și va putea gestiona resursele acestuia. Modulul este simplu și gestionează doar trei entități:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Crearea unui server virtual cu disc local

Al doilea modul se ocupă de gestionarea obiectelor OpenStack, care sunt necesare pentru a crea un server cu un disc local.

Ar trebui să acordați atenție unora dintre argumentele care sunt specificate în acest modul pentru resursă openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

Argument ignore_changes vă permite să ignorați modificările atributelor id pentru imaginea folosită la crearea mașinii virtuale. În serviciul VPC, majoritatea imaginilor publice sunt actualizate automat o dată pe săptămână și în același timp și id se schimba de asemenea. Acest lucru se datorează particularităților componentei OpenStack - Glance, în care imaginile sunt considerate entități imuabile.

Dacă creați sau modificați un server sau un disc existent care are ca argument imagine_id utilizat id imagine publică, apoi după ce acea imagine este actualizată, rularea manifestului Terraform din nou va recrea serverul sau discul. Folosind un argument ignore_changes vă permite să evitați o astfel de situație.

Notă: argument ignore_changes a apărut în Terraform cu mult timp în urmă: trage#2525.

Argument ignore_resize_confirmation necesare pentru a redimensiona cu succes discul local, nucleele sau memoria serverului. Astfel de modificări se fac prin componenta OpenStack Nova folosind o solicitare redimensiona. Nova implicită după solicitare redimensiona pune serverul în stare verify_resize și așteaptă o confirmare suplimentară din partea utilizatorului. Cu toate acestea, acest comportament poate fi modificat, astfel încât Nova să nu aștepte acțiuni suplimentare din partea utilizatorului.

Argumentul specificat permite Terraform să nu aștepte starea verify_resize pentru server și fiți pregătiți pentru ca serverul să fie într-o stare activă după modificarea parametrilor acestuia. Argumentul este disponibil din versiunea 1.10.0 a furnizorului OpenStack Terraform: trage#422.

Crearea resurselor

Înainte de a rula manifestele, vă rugăm să rețineți că în exemplul nostru sunt lansați doi furnizori diferiți, iar furnizorul OpenStack depinde de resursele furnizorului Selectel, deoarece fără a crea un utilizator în proiect este imposibil să gestionați obiectele care îi aparțin. . Din păcate, din același motiv, nu putem rula comanda se aplică terraform în exemplul nostru. Mai întâi trebuie să facem aplica pentru modul proiect_cu_utilizator iar după aceea pentru orice altceva.

Notă: Această problemă nu este încă rezolvată în Terraform, puteți urmări discuția pe Github la problema #2430 и problema #4149.

Pentru a crea resurse, accesați directorul terraform-examples/examples/vpc/server_local_root_disk, conținutul său ar trebui să fie astfel:

$ ls
README.md	   main.tf		vars.tf

Inițializam modulele folosind comanda:

$ terraform init

Rezultatul arată că Terraform descarcă cele mai recente versiuni ale furnizorilor pe care îi folosește și verifică toate modulele descrise în exemplu.

Mai întâi să aplicăm modulul proiect_cu_utilizator. Acest lucru necesită trecerea manuală a valorilor pentru variabilele care nu au fost setate:

  • sel_account cu numărul de cont Selectel;
  • sel_token cu cheia dvs. pentru Selectel API;
  • Parolă de utilizator cu o parolă pentru utilizatorul OpenStack.

Valorile pentru primele două variabile trebuie luate din panouri de control.

Pentru ultima variabilă, puteți veni cu orice parolă.

Pentru a utiliza modulul trebuie să înlocuiți valorile SEL_ACCOUNT, SEL_TOKEN и PAROLĂ DE UTILIZATOR rulează comanda:

$ 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

După rularea comenzii, Terraform va arăta ce resurse dorește să creeze și va cere confirmarea:

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

Odată ce proiectul, utilizatorul și rolul au fost create, puteți începe să creați resursele rămase:

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

Când creați resurse, acordați atenție ieșirii Terraform cu adresa IP externă unde serverul creat va fi accesibil:

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

Puteți lucra cu mașina virtuală creată prin SSH folosind IP-ul specificat.

Editarea resurselor

Pe lângă crearea de resurse prin Terraform, acestea pot fi și modificate.

De exemplu, să creștem numărul de nuclee și memorie pentru serverul nostru prin modificarea valorilor parametrilor server_vcpus и server_ram_mb în dosar exemple/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

După aceasta, verificăm ce modificări vor duce la aceasta folosind următoarea comandă:

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

Drept urmare, Terraform a făcut o schimbare de resursă openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Vă rugăm să rețineți că acest lucru va presupune repornirea mașinii virtuale create.

Pentru a aplica noua configurație a mașinii virtuale, utilizați comanda se aplică terraform, pe care l-am lansat deja mai devreme.

Toate obiectele create vor fi afișate în Panouri de control VPC:

Furnizor Terraform Selectel

În nostru exemple de depozite De asemenea, puteți vedea manifeste pentru crearea de mașini virtuale cu unități de rețea.

Exemplu de creare a unui cluster Kubernetes

Înainte de a trece la următorul exemplu, vom curăța resursele pe care le-am creat mai devreme. Pentru a face acest lucru în rădăcina proiectului terraform-examples/examples/vpc/server_local_root_disk Să rulăm comanda pentru a șterge obiectele OpenStack:

$ 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

Apoi rulați comanda pentru a șterge obiectele Selectel VPC API:

$ 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

În ambele cazuri, va trebui să confirmați ștergerea tuturor obiectelor:

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

Următorul exemplu este în director terraform-examples/examples/vpc/kubernetes_cluster.

Acest exemplu creează un proiect, un utilizator cu rol în proiect și generează un cluster Kubernetes. În dosar vars.tf puteți vedea valorile implicite, cum ar fi numărul de noduri, caracteristicile acestora, versiunea Kubernetes etc.

Pentru a crea resurse similare cu primul exemplu, în primul rând vom începe inițializarea modulelor și crearea resurselor modulelor proiect_cu_utilizatorși apoi creând orice altceva:

$ 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

Vom transfera crearea și gestionarea clusterelor Kubernetes prin componenta OpenStack Magnum. Puteți afla mai multe despre cum să lucrați cu un cluster într-unul dintre noi articolele anterioareprecum și bază de cunoștințe.

La pregătirea clusterului, vor fi create discuri și mașini virtuale și vor fi instalate toate componentele necesare. Pregătirea durează aproximativ 4 minute, timp în care Terraform va afișa mesaje precum:

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

Odată ce instalarea este finalizată, Terraform va indica faptul că clusterul este gata și va afișa ID-ul său:

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

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

Pentru a gestiona clusterul Kubernetes creat prin utilitar kubectl trebuie să obțineți fișierul de acces la cluster. Pentru a face acest lucru, accesați proiectul creat prin Terraform în lista de proiecte din contul dvs.:

Furnizor Terraform Selectel

Apoi, urmați linkul like xxxxxx.selvpc.rucare apare sub numele proiectului:

Furnizor Terraform Selectel

Pentru informații de conectare, utilizați numele de utilizator și parola pe care le-ați creat prin Terraform. Dacă nu ai înșelat vars.tf sau principal.tf pentru exemplul nostru, utilizatorul va avea numele tf_user. Trebuie să utilizați valoarea variabilei ca parolă TF_VAR_parola_utilizator, care a fost specificat la pornire se aplică terraform mai devreme.

În interiorul proiectului, trebuie să accesați fila Kubernetes:

Furnizor Terraform Selectel

Aici se află clusterul creat prin Terraform. Descărcați fișierul pentru kubectl puteți în fila „Acces”:

Furnizor Terraform Selectel

Instrucțiunile de instalare se află pe aceeași filă. kubectl și utilizarea celor descărcate config.yaml.

După lansare kubectl și setarea variabilei de mediu KUBECONFIG poți folosi Kubernetes:

$ 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

Numărul de noduri de cluster poate fi schimbat cu ușurință prin Terraform.
În dosar principal.tf se specifica urmatoarea valoare:

cluster_node_count = "${var.cluster_node_count}"

Această valoare este înlocuită de la vars.tf:

variable "cluster_node_count" {
default = 2
}

Puteți modifica fie valoarea implicită în vars.tf, sau specificați valoarea necesară direct în principal.tf:

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

Pentru a aplica modificările, ca în cazul primului exemplu, utilizați comanda se aplică terraform:

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

Când numărul de noduri se modifică, clusterul va rămâne disponibil. După ce adăugați un nod prin Terraform, îl puteți utiliza fără configurare suplimentară:

$ 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

Concluzie

În acest articol ne-am familiarizat cu principalele modalități de a lucra „Cloud privat virtual” prin Terraform. Vom fi bucuroși dacă utilizați furnizorul oficial Terraform Selectel și oferiți feedback.

Orice erori găsite în furnizorul Selectel Terraform pot fi raportate prin Probleme Github.

Sursa: www.habr.com

Adauga un comentariu