Terraform-leverandør Selectel

Terraform-leverandør Selectel

Vi har lansert en offisiell Terraform-leverandør for å jobbe med Selectel. Dette produktet lar brukere fullt ut implementere ressursadministrasjon gjennom Infrastructure-as-code-metoden.

Leverandøren støtter for tiden tjenesteressursadministrasjon "Virtuell privat sky" (heretter kalt VPC). I fremtiden planlegger vi å legge til ressursadministrasjon for andre tjenester levert av Selectel.

Som du allerede vet, er VPC-tjenesten bygget på OpenStack. Men på grunn av det faktum at OpenStack ikke tilbyr native verktøy for å betjene den offentlige skyen, implementerte vi den manglende funksjonaliteten i et sett med ekstra APIer som forenkler administrasjonen av komplekse sammensatte objekter og gjør arbeidet mer praktisk. Noe av funksjonaliteten som er tilgjengelig i OpenStack er stengt fra direkte bruk, men er tilgjengelig gjennom vårt API.

Selectel Terraform-leverandøren inkluderer nå muligheten til å administrere følgende VPC-ressurser:

  • prosjekter og deres kvoter;
  • brukere, deres roller og tokens;
  • offentlige undernett, inkludert tverrregionale og VRRP;
  • programvarelisenser.

Leverandøren bruker vårt offentlige Go-bibliotek for å jobbe med VPC API. Både biblioteket og selve leverandøren er åpen kildekode, utviklingen deres utføres på Github:

For å administrere andre skyressurser, som virtuelle maskiner, disker, Kubernetes-klynger, kan du bruke OpenStack Terraform-leverandøren. Offisiell dokumentasjon for begge leverandørene er tilgjengelig på følgende lenker:

Komme i gang

For å komme i gang må du installere Terraform (instruksjoner og lenker til installasjonspakker finner du på offisiell nettside).

For å operere krever leverandøren en Selectel API-nøkkel, som er opprettet i kontokontrollpaneler.

Manifester for å jobbe med Selectel lages ved hjelp av Terraform eller ved å bruke et sett med ferdige eksempler som er tilgjengelige i vårt Github-lager: terraform-eksempler.

Depotet med eksempler er delt inn i to kataloger:

  • moduler, som inneholder små gjenbrukbare moduler som tar et sett med parametere som input og administrerer et lite sett med ressurser;
  • eksempler, som inneholder eksempler på et komplett sett med sammenkoblede moduler.

Etter å ha installert Terraform, opprettet en Selectel API-nøkkel og gjort deg kjent med eksemplene, la oss gå videre til praktiske eksempler.

Et eksempel på å lage en server med en lokal disk

La oss se på et eksempel på å lage et prosjekt, en bruker med en rolle og en virtuell maskin med en lokal disk: terraform-eksempler/eksempler/vpc/server_lokal_rotdisk.

I fil vars.tf alle parametere som vil bli brukt når du kaller moduler er beskrevet. Noen av dem har standardverdier, for eksempel vil serveren opprettes i sonen ru-3a med følgende konfigurasjon:

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-leverandøren initialiseres:

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

Denne filen inneholder også standardverdien for SSH-nøkkelen som skal installeres på serveren:

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

Om nødvendig kan du spesifisere en annen offentlig nøkkel. Nøkkelen trenger ikke å angis som en filbane; du kan også legge til verdien som en streng.

Videre i denne filen lanseres modulene prosjekt_med_bruker и server_local_root_disk, som forvalter de nødvendige ressursene.

La oss se på disse modulene mer detaljert.

Opprette et prosjekt og en bruker med en rolle

Den første modulen oppretter et prosjekt og en bruker med en rolle i det prosjektet: terraform-eksempler/moduler/vpc/prosjekt_med_bruker.

Den opprettede brukeren vil kunne logge på OpenStack og administrere ressursene. Modulen er enkel og administrerer kun tre enheter:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Opprette en virtuell server med lokal disk

Den andre modulen tar for seg å administrere OpenStack-objekter, som er nødvendige for å lage en server med en lokal disk.

Du bør ta hensyn til noen av argumentene som er spesifisert i denne modulen for ressursen 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 lar deg ignorere attributtendringer id for bildet som ble brukt til å lage den virtuelle maskinen. I VPC-tjenesten oppdateres de fleste offentlige bilder automatisk en gang i uken og samtidig deres id endres også. Dette er på grunn av særegenhetene til OpenStack-komponenten - Glance, der bilder anses som uforanderlige enheter.

Hvis du oppretter eller endrer en eksisterende server eller disk som har som argument image_id brukes id offentlig bilde, og etter at bildet er oppdatert, vil kjøring av Terraform-manifestet på nytt gjenskape serveren eller disken. Ved å bruke et argument ignore_changes lar deg unngå en slik situasjon.

Merk: argument ignore_changes dukket opp i Terraform for ganske lenge siden: pull#2525.

argument ignore_resize_confirmation nødvendig for å kunne endre størrelse på lokal disk, kjerner eller serverminne. Slike endringer gjøres gjennom OpenStack Nova-komponenten ved å bruke en forespørsel endre størrelse. Standard Nova etter forespørsel endre størrelse setter serveren i status verify_resize og venter på ytterligere bekreftelse fra brukeren. Denne oppførselen kan imidlertid endres slik at Nova ikke venter på ytterligere handlinger fra brukeren.

Det angitte argumentet lar Terraform ikke vente på statusen verify_resize for serveren og være forberedt på at serveren er i aktiv status etter å ha endret parameterne. Argumentet er tilgjengelig fra versjon 1.10.0 av OpenStack Terraform-leverandøren: pull#422.

Opprette ressurser

Før du kjører manifestene, vær oppmerksom på at i vårt eksempel lanseres to forskjellige leverandører, og OpenStack-leverandøren avhenger av ressursene til Selectel-leverandøren, siden uten å opprette en bruker i prosjektet, er det umulig å administrere objektene som tilhører den . Dessverre, av samme grunn kan vi ikke bare kjøre kommandoen terraform gjelder i vårt eksempel. Vi må først gjøre søke om for modul prosjekt_med_bruker og etter det for alt annet.

Merk: Dette problemet er ennå ikke løst i Terraform, du kan følge diskusjonen på Github på problem#2430 и problem#4149.

For å opprette ressurser, gå til katalogen terraform-eksempler/eksempler/vpc/server_lokal_rotdisk, bør innholdet være slik:

$ ls
README.md	   main.tf		vars.tf

Vi initialiserer modulene ved å bruke kommandoen:

$ terraform init

Utdataene viser at Terraform laster ned de nyeste versjonene av leverandørene den bruker og sjekker alle modulene beskrevet i eksempelet.

La oss først bruke modulen prosjekt_med_bruker. Dette krever manuell overføring av verdier for variabler som ikke er angitt:

  • sel_konto med ditt Selectel-kontonummer;
  • sel_token med nøkkelen for Selectel API;
  • bruker passord med et passord for OpenStack-brukeren.

Verdiene for de to første variablene må hentes fra kontrollpaneler.

For den siste variabelen kan du komme opp med et hvilket som helst passord.

For å bruke modulen må du erstatte verdiene SEL_ACCOUNT, SEL_TOKEN и BRUKER PASSORD kjører kommandoen:

$ 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

Etter å ha kjørt kommandoen, vil Terraform vise hvilke ressurser den vil opprette og be om bekreftelse:

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 prosjektet, brukeren og rollen er opprettet, kan du begynne å lage de gjenværende ressursene:

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

Når du oppretter ressurser, vær oppmerksom på Terraform-utgangen med den eksterne IP-adressen der den opprettede serveren vil være tilgjengelig:

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

Du kan jobbe med den opprettede virtuelle maskinen via SSH ved å bruke den angitte IP-en.

Redigering av ressurser

I tillegg til å opprette ressurser gjennom Terraform, kan de også modifiseres.

La oss for eksempel øke antall kjerner og minne for serveren vår ved å endre verdiene for parameterne server_vcpus и server_ram_mb i fil eksempler/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

Etter dette sjekker vi hvilke endringer dette vil føre til ved å bruke følgende kommando:

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

Som et resultat gjorde Terraform en ressursendring openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Vær oppmerksom på at dette vil medføre omstart av den opprettede virtuelle maskinen.

For å bruke den nye virtuelle maskinkonfigurasjonen, bruk kommandoen terraform gjelder, som vi allerede har lansert tidligere.

Alle opprettede objekter vises i VPC kontrollpaneler:

Terraform-leverandør Selectel

I vår eksempellagre Du kan også se manifester for å lage virtuelle maskiner med nettverksstasjoner.

Eksempel på å lage en Kubernetes-klynge

Før vi går videre til neste eksempel, skal vi rydde opp i ressursene vi opprettet tidligere. For å gjøre dette i roten til prosjektet terraform-eksempler/eksempler/vpc/server_lokal_rotdisk La oss kjøre kommandoen for å slette OpenStack-objekter:

$ 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

Kjør deretter kommandoen for å fjerne Selectel VPC API-objekter:

$ 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 begge tilfeller må du bekrefte slettingen av alle objekter:

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ølgende eksempel er i katalogen terraform-examples/examples/vpc/kubernetes_cluster.

Dette eksemplet oppretter et prosjekt, en bruker med en rolle i prosjektet, og oppretter én Kubernetes-klynge. I fil vars.tf du kan se standardverdier, for eksempel antall noder, deres egenskaper, Kubernetes-versjon osv.

For å lage ressurser som ligner på det første eksemplet, vil vi først og fremst begynne å initialisere moduler og lage modulressurser prosjekt_med_brukerog deretter lage alt annet:

$ 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 vil overføre opprettelsen og administrasjonen av Kubernetes-klynger gjennom OpenStack Magnum-komponenten. Du kan finne ut mer om hvordan du jobber med en klynge i en av våre tidligere artikler, så vel som i kunnskapsbase.

Når du klargjør klyngen, vil disker og virtuelle maskiner bli opprettet og alle nødvendige komponenter vil bli installert. Forberedelsen tar omtrent 4 minutter, i løpet av denne tiden vil Terraform vise meldinger som:

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

Når installasjonen er fullført, vil Terraform indikere at klyngen er klar og vise IDen:

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

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

For å administrere den opprettede Kubernetes-klyngen gjennom verktøyet kubectl du må få tilgangsfilen til klyngen. For å gjøre dette, gå til prosjektet opprettet gjennom Terraform i listen over prosjekter på kontoen din:

Terraform-leverandør Selectel

Deretter følger du lenken som xxxxxx.selvpc.rusom vises under prosjektnavnet:

Terraform-leverandør Selectel

For påloggingsinformasjon, bruk brukernavnet og passordet du opprettet gjennom Terraform. Hvis du ikke har jukset vars.tf eller main.tf for vårt eksempel vil brukeren ha navnet tf_user. Du må bruke verdien til variabelen som passord TF_VAR_user_password, som ble spesifisert ved oppstart terraform gjelder Tidligere.

Inne i prosjektet må du gå til fanen Kubernetes:

Terraform-leverandør Selectel

Det er her klyngen opprettet via Terraform ligger. Last ned fil for kubectl du kan på "Tilgang"-fanen:

Terraform-leverandør Selectel

Installasjonsinstruksjoner er plassert på samme fane. kubectl og bruk av det nedlastede config.yaml.

Etter lansering kubectl og angi miljøvariabelen KUBECONFIG du kan bruke 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

Antall cluster noder kan enkelt endres via Terraform.
I fil main.tf følgende verdi er spesifisert:

cluster_node_count = "${var.cluster_node_count}"

Denne verdien er erstattet fra vars.tf:

variable "cluster_node_count" {
default = 2
}

Du kan endre enten standardverdien i vars.tf, eller spesifiser ønsket verdi direkte i main.tf:

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

For å bruke endringene, som i tilfellet med det første eksemplet, bruk kommandoen terraform gjelder:

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

Når antallet noder endres, vil klyngen forbli tilgjengelig. Etter å ha lagt til en node via Terraform, kan du bruke den uten ytterligere konfigurasjon:

$ 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

Konklusjon

I denne artikkelen ble vi kjent med de viktigste måtene å jobbe med "Virtuell privat sky" via Terraform. Vi vil være glade hvis du bruker den offisielle Selectel Terraform-leverandøren og gir tilbakemelding.

Eventuelle feil funnet i Selectel Terraform-leverandøren kan rapporteres via Github-problemer.

Kilde: www.habr.com

Legg til en kommentar