
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 (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 .
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:
- biblioteksdepot ,
- leverandørlager .
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:
- Velg ressursdokumentasjon: ,
- OpenStack ressursdokumentasjon: .
Komme i gang
For å komme i gang må du installere Terraform (instruksjoner og lenker til installasjonspakker finner du på ).
For å operere krever leverandøren en Selectel API-nøkkel, som er opprettet i .
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: .
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: .
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: .
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: .
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: .
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å и .
For å opprette ressurser, gå til katalogen , 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 .
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 :

I vår 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 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 .
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 , så vel som i .
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:

Deretter følger du lenken som som vises under prosjektnavnet:

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:

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

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 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 .
Kilde: www.habr.com
