Terraform-leverantören Selectel

Terraform-leverantören Selectel

Vi har lanserat en officiell Terraform-leverantör för att arbeta med Selectel. Denna produkt tillåter användare att fullt ut implementera resurshantering genom metoden Infrastructure-as-code.

Leverantören stöder för närvarande serviceresurshantering "Virtuella privata moln" (nedan kallat VPC). I framtiden planerar vi att lägga till resurshantering för andra tjänster som tillhandahålls av Selectel.

Som du redan vet är VPC-tjänsten byggd på OpenStack. Men på grund av det faktum att OpenStack inte tillhandahåller inbyggda verktyg för att betjäna det offentliga molnet, implementerade vi den saknade funktionaliteten i en uppsättning ytterligare API:er som förenklar hanteringen av komplexa sammansatta objekt och gör arbetet mer bekvämt. En del av de funktioner som finns tillgängliga i OpenStack är stängda från direkt användning, men är tillgängliga via vårt API.

Selectel Terraform-leverantören inkluderar nu möjligheten att hantera följande VPC-resurser:

  • projekt och deras kvoter;
  • användare, deras roller och tokens;
  • offentliga undernät, inklusive tvärregionala och VRRP;
  • mjukvarulicenser.

Leverantören använder vårt offentliga Go-bibliotek för att arbeta med VPC API. Både biblioteket och själva leverantören är öppen källkod, deras utveckling utförs på Github:

För att hantera andra molnresurser, såsom virtuella maskiner, diskar, Kubernetes-kluster, kan du använda OpenStack Terraform-leverantören. Officiell dokumentation för båda leverantörerna finns på följande länkar:

Komma igång

För att komma igång måste du installera Terraform (instruktioner och länkar till installationspaket finns på officiella hemsida).

För att fungera kräver leverantören en Selectel API-nyckel, som skapas i kontokontrollpaneler.

Manifester för att arbeta med Selectel skapas med Terraform eller med hjälp av en uppsättning färdiga exempel som finns tillgängliga i vårt Github-förråd: terraform-exempel.

Förvaret med exempel är uppdelat i två kataloger:

  • moduler, som innehåller små återanvändbara moduler som tar en uppsättning parametrar som input och hanterar en liten uppsättning resurser;
  • exempel, som innehåller exempel på en komplett uppsättning sammankopplade moduler.

Efter att ha installerat Terraform, skapat en Selectel API-nyckel och bekantat dig med exemplen, låt oss gå vidare till praktiska exempel.

Ett exempel på att skapa en server med en lokal disk

Låt oss titta på ett exempel på att skapa ett projekt, en användare med en roll och en virtuell maskin med en lokal disk: terraform-examples/examples/vpc/server_local_root_disk.

I fil vars.tf alla parametrar som kommer att användas vid anrop av moduler beskrivs. Vissa av dem har standardvärden, till exempel kommer servern att skapas i zonen ru-3a med följande 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"
}

I fil main.tf Selectel-leverantören initieras:

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

Den här filen innehåller också standardvärdet för SSH-nyckeln som kommer att installeras på servern:

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

Om det behövs kan du ange en annan publik nyckel. Nyckeln behöver inte anges som en filsökväg, du kan också lägga till värdet som en sträng.

Längre i denna fil lanseras modulerna projekt_med_användare и server_local_root_disk, som förvaltar nödvändiga resurser.

Låt oss titta på dessa moduler mer i detalj.

Skapa ett projekt och en användare med en roll

Den första modulen skapar ett projekt och en användare med en roll i det projektet: terraform-exempel/moduler/vpc/project_with_user.

Den skapade användaren kommer att kunna logga in på OpenStack och hantera sina resurser. Modulen är enkel och hanterar endast tre enheter:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Skapa en virtuell server med lokal disk

Den andra modulen handlar om att hantera OpenStack-objekt, som är nödvändiga för att skapa en server med en lokal disk.

Du bör vara uppmärksam på några av argumenten som anges i denna modul för resursen 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 låter dig ignorera attributändringar id för bilden som används för att skapa den virtuella maskinen. I VPC-tjänsten uppdateras de flesta offentliga bilder automatiskt en gång i veckan och samtidigt deras id ändras också. Detta beror på särdragen hos OpenStack-komponenten - Glance, där bilder anses vara oföränderliga enheter.

Om du skapar eller modifierar en befintlig server eller disk som har som argument bild-id används id public image, sedan efter att den bilden har uppdaterats kommer att köra Terraform-manifestet igen att återskapa servern eller disken. Använder ett argument ignore_changes gör att du kan undvika en sådan situation.

Obs: argument ignore_changes dök upp i Terraform för ganska länge sedan: pull#2525.

argument ignore_resize_confirmation behövs för att lyckas ändra storlek på lokal disk, kärnor eller serverminne. Sådana ändringar görs genom OpenStack Nova-komponenten med hjälp av en begäran ändra storlek. Standard Nova efter förfrågan ändra storlek sätter servern i status verifiera_ändra storlek och väntar på ytterligare bekräftelse från användaren. Detta beteende kan dock ändras så att Nova inte väntar på ytterligare åtgärder från användaren.

Det angivna argumentet tillåter Terraform att inte vänta på statusen verifiera_ändra storlek för servern och var beredd på att servern är i aktiv status efter att ha ändrat dess parametrar. Argumentet är tillgängligt från version 1.10.0 av OpenStack Terraform-leverantören: pull#422.

Skapa resurser

Innan du kör manifesten, observera att i vårt exempel lanseras två olika leverantörer, och OpenStack-leverantören beror på Selectel-leverantörens resurser, eftersom utan att skapa en användare i projektet är det omöjligt att hantera objekten som hör till den . Tyvärr kan vi av samma anledning inte bara köra kommandot terraform gäller i vårt exempel. Vi måste först göra tillämpa för modul projekt_med_användare och efter det för allt annat.

Obs: Det här problemet är ännu inte löst i Terraform, du kan följa diskussionen på Github på nummer #2430 и nummer #4149.

För att skapa resurser, gå till katalogen terraform-examples/examples/vpc/server_local_root_disk, bör dess innehåll vara så här:

$ ls
README.md	   main.tf		vars.tf

Vi initierar modulerna med kommandot:

$ terraform init

Resultatet visar att Terraform laddar ner de senaste versionerna av de leverantörer som den använder och kontrollerar alla moduler som beskrivs i exemplet.

Låt oss först tillämpa modulen projekt_med_användare. Detta kräver manuell överföring av värden för variabler som inte har ställts in:

  • sel_account med ditt Selectel-kontonummer;
  • sel_token med din nyckel för Selectel API;
  • användarlösenord med ett lösenord för OpenStack-användaren.

Värdena för de två första variablerna måste tas från kontrollpaneler.

För den sista variabeln kan du komma med vilket lösenord som helst.

För att använda modulen måste du byta ut värdena SEL_ACCOUNT, SEL_TOKEN и ANVÄNDARLÖSENORD kör kommandot:

$ 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

Efter att ha kört kommandot kommer Terraform att visa vilka resurser den vill skapa och be om bekräftelse:

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

När projektet, användaren och rollen har skapats kan du börja skapa de återstående resurserna:

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

När du skapar resurser, var uppmärksam på Terraform-utgången med den externa IP-adressen där den skapade servern kommer att vara tillgänglig:

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

Du kan arbeta med den skapade virtuella maskinen via SSH med den angivna IP-adressen.

Redigera resurser

Förutom att skapa resurser genom Terraform kan de även modifieras.

Låt oss till exempel öka antalet kärnor och minne för vår server genom att ändra värdena för parametrarna server_vcpus и server_ram_mb i fil exempel/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

Efter detta kontrollerar vi vilka ändringar detta kommer att leda till med hjälp av följande kommando:

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

Som ett resultat gjorde Terraform en resursförändring openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Observera att detta kommer att innebära omstart av den skapade virtuella maskinen.

Använd kommandot för att tillämpa den nya virtuella maskinkonfigurationen terraform gäller, som vi redan har lanserat tidigare.

Alla skapade objekt kommer att visas i VPC kontrollpaneler:

Terraform-leverantören Selectel

I vår exempelförråd Du kan också se manifest för att skapa virtuella maskiner med nätverksenheter.

Exempel på att skapa ett Kubernetes-kluster

Innan vi går vidare till nästa exempel kommer vi att rensa upp de resurser vi skapade tidigare. För att göra detta i roten av projektet terraform-examples/examples/vpc/server_local_root_disk Låt oss köra kommandot för att ta bort OpenStack-objekt:

$ 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

Kör sedan kommandot för att rensa Selectel VPC API-objekt:

$ 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

I båda fallen måste du bekräfta raderingen av alla objekt:

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

Följande exempel finns i katalogen terraform-examples/examples/vpc/kubernetes_cluster.

Det här exemplet skapar ett projekt, en användare med en roll i projektet och skapar ett Kubernetes-kluster. I fil vars.tf du kan se standardvärden, såsom antalet noder, deras egenskaper, Kubernetes-version, etc.

För att skapa resurser som liknar det första exemplet, börjar vi först och främst initiera moduler och skapa modulresurser projekt_med_användareoch skapa sedan allt annat:

$ 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

Vi kommer att överföra skapandet och hanteringen av Kubernetes-kluster genom OpenStack Magnum-komponenten. Du kan ta reda på mer om hur du arbetar med ett kluster i en av våra tidigare artiklar, såväl som i kunskapsbas.

När du förbereder klustret kommer diskar och virtuella maskiner att skapas och alla nödvändiga komponenter kommer att installeras. Förberedelserna tar cirka 4 minuter, under vilken tid Terraform visar meddelanden som:

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

När installationen är klar kommer Terraform att indikera att klustret är klart och visa dess ID:

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

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

För att hantera det skapade Kubernetes-klustret genom verktyget kubectl du behöver skaffa klusteråtkomstfilen. För att göra detta, gå till projektet skapat genom Terraform i listan över projekt på ditt konto:

Terraform-leverantören Selectel

Följ sedan länken som xxxxxx.selvpc.rusom visas under projektnamnet:

Terraform-leverantören Selectel

För inloggningsinformation, använd användarnamnet och lösenordet som du skapade genom Terraform. Om du inte har fuskat vars.tf eller main.tf för vårt exempel kommer användaren att ha namnet tf_user. Du måste använda variabelns värde som lösenord TF_VAR_user_password, som specificerades vid start terraform gäller tidigare.

Inuti projektet måste du gå till fliken Kubernetes:

Terraform-leverantören Selectel

Det är här klustret som skapats via Terraform finns. Ladda ner filen för kubectl du kan på fliken "Åtkomst":

Terraform-leverantören Selectel

Installationsanvisningar finns på samma flik. kubectl och användning av det nedladdade config.yaml.

Efter lanseringen kubectl och ställa in miljövariabeln KUBECONFIG du kan använda 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

Antalet klusternoder kan enkelt ändras via Terraform.
I fil main.tf följande värde anges:

cluster_node_count = "${var.cluster_node_count}"

Detta värde ersätts från vars.tf:

variable "cluster_node_count" {
default = 2
}

Du kan ändra antingen standardvärdet i vars.tf, eller ange önskat värde direkt i main.tf:

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

För att tillämpa ändringarna, som i fallet med det första exemplet, använd kommandot terraform gäller:

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

När antalet noder ändras kommer klustret att förbli tillgängligt. Efter att ha lagt till en nod via Terraform kan du använda den utan ytterligare konfiguration:

$ 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

Slutsats

I den här artikeln har vi bekantat oss med de viktigaste sätten att arbeta med "Virtuella privata moln" via Terraform. Vi blir glada om du använder den officiella Terraform-leverantören Selectel och ger feedback.

Eventuella buggar som hittas i Selectel Terraform-leverantören kan rapporteras via Github-problem.

Källa: will.com

Lägg en kommentar