Fornitore di Terraform Selectel

Fornitore di Terraform Selectel

Avemu lanciatu u fornitore ufficiale di Terraform per travaglià cù Selectel. Stu pruduttu permette à l'utilizatori di implementà cumplettamente a gestione di e risorse attraversu a metodulugia Infrastruttura cum'è codice (infrastruttura cum'è codice).

U fornitore sustene attualmente a gestione di risorse di serviziu "Nuvola privata virtuale" (in seguitu VPC). In u futuru, avemu pensatu à aghjunghje a gestione di risorse di altri servizii furniti da Selectel.

Comu sapete digià, u serviziu VPC hè custruitu nantu à OpenStack. Tuttavia, a causa di u fattu chì OpenStack ùn furnisce micca strumenti nativi per serve u nuvulu publicu, avemu implementatu a funziunalità mancante in un inseme di API supplementari chì simplificanu a gestione di l'uggetti cumposti cumplessi è facenu u travagliu più convenientu. Parte di e funziunalità dispunibule in OpenStack hè chjusu da l'usu direttu, ma hè dispunibule attraversu a nostra API.

U fornitore Selectel Terraform hà avà a capacità di gestisce e seguenti risorse VPC:

  • prughjetti è e so quote;
  • utilizatori, i so rolli è tokens;
  • subnets publichi, cumpresi trans-regionale è VRRP;
  • licenze di software.

U fornitore usa a nostra biblioteca publica Go per travaglià cù l'API VPC. Sia a biblioteca è u fornitore stessu sò open-source, sò sviluppati in Github:

Per gestisce u restu di e risorse di nuvola, cum'è macchine virtuali, dischi, clusters Kubernetes, pudete aduprà u fornitore OpenStack Terraform. A documentazione ufficiale per i dui fornituri hè dispunibule à i seguenti ligami:

Getting passé

Per principià, avete bisognu di stallà Terraform (istruzzioni è ligami per i pacchetti di installazione ponu esse truvati à situ ufficiali).

Per travaglià, u fornitore hà bisognu di una chjave API Selectel, chì hè creata in pannellu di cuntrollu di contu.

Manifesti per travaglià cù Selectel sò creati cù Terraform o cù un inseme di esempi pronti chì sò dispunibili in u nostru repository Github: terraform-esempii.

U repository cù esempi hè divisu in dui cartulari:

  • moduli, chì cuntenenu picculi moduli reutilizabili chì piglianu un inseme di parametri cum'è input è gestiscenu un picculu settore di risorse;
  • esempi, chì cuntene esempi di un inseme cumpletu di moduli interconnessi.

Dopu avè installatu Terraform, creendu una chjave API Selectel, è rivedendu l'esempii, andemu à l'esempii pratichi.

Esempiu di creazione di un servitore cù un discu locale

Cunsiderate un esempiu di creà un prughjettu, un utilizatore cù un rolu è una macchina virtuale cù un discu locale: terraform-examples/examples/vpc/server_local_root_disk.

In u schedariu vars.tf tutti i paràmetri chì seranu utilizati quandu chjamanu i moduli sò descritti. Certi di elli anu valori predeterminati, per esempiu, u servitore serà creatu in a zona fr-3a cù a seguente cunfigurazione:

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 u schedariu principale.tf u fornitore Selectel hè inizializatu:

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

Stu schedariu cuntene ancu u valore predeterminatu per a chjave SSH chì serà installata in u servitore:

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

Se necessariu, pudete specificà una chjave publica diversa. A chjave ùn deve esse specificatu cum'è una strada à u schedariu, pudete ancu aghjunghje u valore cum'è una stringa.

In più in stu schedariu i moduli sò lanciati prughjettu_cù_utilizatori и server_local_root_diskchì gestisce e risorse necessarie.

Fighjemu un ochju più vicinu à sti moduli.

Crea un prughjettu è un utilizatore cù un rolu

U primu modulu crea un prughjettu è un utilizatore cù un rolu in quellu prughjettu: terraform-examples/modules/vpc/project_with_user.

L'utilizatore creatu hà da pudè accede à OpenStack è gestisce e so risorse. U modulu hè simplice è gestisce solu trè entità:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Crià un servitore virtuale cù un discu locale

U secondu modulu tratta di gestisce l'oggetti OpenStack chì sò necessarii per creà un servitore cù un discu locale.

Avete da attente à alcuni di l'argumenti chì sò specificati in stu modulu per a risorsa openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argumentu ignore_changes permette di ignorà u cambiamentu di l'attributu id per l'imagine utilizata per creà a macchina virtuale. In u serviziu VPC, a maiò parte di l'imaghjini publichi sò aghjurnati automaticamente una volta à settimana è à u stessu tempu sò id cambia ancu. Questu hè dovutu à e peculiarità di l'operazione di u cumpunente OpenStack - Glance, in quale l'imaghjini sò cunsiderate entità immutable.

Se crea o mudifica un servitore o discu esistenti chì hà cum'è argumentu image_id si usa id l'imagine publica, dopu chì l'imaghjina hè aghjurnata, eseguisce u manifestu Terraform di novu ricreà u servitore o u discu. Utilizà un argumentu ignore_changes evita una tale situazione.

nota : argumentu ignore_changes apparsu in Terraform assai tempu fà: tira #2525.

argumentu ignore_resize_confirmation necessariu per ridimensionà u discu locale, core, o memoria di u servitore. Tali cambiamenti sò fatti attraversu u cumpunente OpenStack Nova utilizendu a dumanda resize. Default Nova nantu à dumanda resize mette u servitore in statu verifica_resize è aspetta una cunferma supplementaria da l'utilizatore. Tuttavia, stu cumpurtamentu pò esse cambiatu in modu chì Nova ùn deve micca aspittà chì l'utilizatore per piglià azzioni supplementari.

L'argumentu specificatu permette à Terraform di ùn aspittà micca u statutu verifica_resize per u servitore è esse preparatu per u fattu chì u servitore serà in statu attivu dopu avè cambiatu i so paràmetri. L'argumentu hè dispunibule da a versione 1.10.0 di u fornitore OpenStack Terraform: tira #422.

Creazione di risorse

Prima di lancià i manifesti, deve esse nutatu chì in u nostru esempiu sò lanciati dui fornituri diffirenti, è u fornitore OpenStack dipende da e risorse di u fornitore Selectel, postu chì senza creà un utilizatore in u prugettu, hè impussibile di gestisce l'oggetti chì appartene à ellu. . Sfurtunatamente, per a stessa ragione, ùn pudemu micca solu eseguisce u cumandamentu terraform applica in u nostru esempiu. Avemu bisognu di fà prima applicà per u modulu prughjettu_cù_utilizatori è dopu per tuttu u restu.

Nota: U prublema informatu ùn hè ancu risolta in Terraform, pudete seguità a discussione nantu à Github à prublema #2430 и prublema #4149.

Per creà risorse, andate à u cartulare terraform-examples/examples/vpc/server_local_root_disk, u so cuntenutu deve esse cusì:

$ ls
README.md	   main.tf		vars.tf

Inizialemu i moduli usendu u cumandimu:

$ terraform init

L'output mostra chì Terraform scarica l'ultime versioni di i fornituri utilizati è verifica tutti i moduli descritti in l'esempiu.

Prima applicà u modulu prughjettu_cù_utilizatori. Questu hè bisognu di passà manualmente i valori per i variàbili chì ùn sò micca stati stabiliti:

  • sel_account cù u vostru numeru di contu Selectel;
  • sel_token cù a vostra chjave API Selectel;
  • user_password cù una password per l'utilizatore OpenStack.

I valori per i primi dui variàbili deve esse pigliatu da pannelli di cuntrollu.

Per l'ultima variabile, pudete vene cun qualsiasi password.

Per utilizà u modulu, avete bisognu di rimpiazzà i valori SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD eseguendu u cumandimu:

$ 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

Dopu avè eseguitu u cumandamentu, Terraform mostrarà quale risorse vole creà è richiede cunferma:

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

Una volta chì u prughjettu, l'utilizatore è u rolu sò creati, pudete inizià à creà u restu di e risorse:

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

Quandu crea risorse, fate attenzione à l'output Terraform cù l'indirizzu IP esternu induve u servitore creatu serà dispunibule:

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

Pudete travaglià cù a macchina virtuale creata via SSH utilizendu l'IP specificatu.

Risorse di editazione

In più di creà risorse attraversu Terraform, ponu ancu esse mudificate.

Per esempiu, aumentemu u numeru di core è memoria per u nostru servitore cambiendu i valori per i paràmetri server_vcpus и server_ram_mb in u schedariu esempi/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

Dopu quì, cuntrollemu ciò chì i cambiamenti portanu à aduprà u cumandimu seguente:

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

In u risultatu, Terraform hà fattu un cambiamentu di risorse openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Per piacè nutate chì questu implicarà u reboot di a macchina virtuale creata.

Per applicà a nova cunfigurazione di a macchina virtuale, utilizate u cumandimu terraform applica, chì avemu digià lanciatu prima.

Tutti l'uggetti creati seranu visualizati in Pannelli di cuntrollu VPC:

Fornitore di Terraform Selectel

In u nostru repository di esempiu Pudete ancu vede manifesti per creà macchine virtuali cù unità di rete.

Un esempiu di creazione di un cluster Kubernetes

Prima di passà à l'esempiu prossimu, pulizzeremu e risorse chì avemu creatu prima. Per fà questu, in a radica di u prugettu terraform-examples/examples/vpc/server_local_root_disk eseguite u cumandimu per sguassà l'oggetti 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

Allora eseguite u cumandimu per sguassà l'uggetti 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

In i dui casi, avete bisognu di cunfirmà l'eliminazione di tutti l'uggetti:

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

L'esempiu seguente hè in u cartulare terraform-examples/examples/vpc/kubernetes_cluster.

Questu esempiu crea un prughjettu, un utilizatore cù un rolu in u prugettu, è cresce un cluster Kubernetes. In u schedariu vars.tf pudete vede i valori predeterminati, cum'è u numeru di nodi, e so caratteristiche, a versione Kubernetes, è più.

Per creà risorse, simile à u primu esempiu, prima di tuttu, cuminciamu l'inizializazione di moduli è a creazione di risorse di moduli prughjettu_cù_utilizatorie poi creendu tuttu u restu:

$ 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

Trasferemu a creazione è a gestione di clusters Kubernetes attraversu u cumpunente OpenStack Magnum. Pudete amparà più nantu à cumu travaglià cù un cluster in unu di i nostri articuli precedenticum'è basa di cunniscenza.

Quandu preparanu u cluster, i dischi, i machini virtuali seranu creati è tutti i cumpunenti necessarii seranu stallati. A preparazione dura circa 4 minuti, durante u quale Terraform mostrarà missaghji cum'è:

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

Dopu chì a stallazione hè cumpleta, Terraform informarà chì u cluster hè prontu è mostra u so 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.

Per gestisce u cluster Kubernetes creatu attraversu l'utilità kubectl avete bisognu di ottene u schedariu d'accessu à u cluster. Per fà questu, andate à u prughjettu creatu via Terraform in a lista di prughjetti in u vostru contu:

Fornitore di Terraform Selectel

Dopu seguitate u ligame xxxxxx.selvpc.ru, chì hè visualizatu sottu u nome di u prugettu:

Fornitore di Terraform Selectel

Aduprate u nome d'utilizatore è a password chì sò stati creati attraversu Terraform cum'è l'infurmazioni di login. Se ùn avete micca cambiatu vars.tf o principale.tf per u nostru esempiu, l'utilizatore averà u nome tf_user. U valore di a variabile deve esse utilizatu cum'è password TF_VAR_user_password, chì hè stata specificata à l'iniziu terraform applica nanzu.

Dentru u prugettu, vi tocca à andà à a tabulazione Kubernetes:

Fornitore di Terraform Selectel

Eccu un cluster creatu attraversu Terraform. Scaricate u schedariu per kubectl Pudete nantu à a tabulazione "Access":

Fornitore di Terraform Selectel

Questa tabulazione cuntene struzzioni di installazione. kubectl è aduprà u scaricatu config.yaml.

Dopu u lanciu kubectl è stabilisce a variabile di l'ambiente KUBECONFIG Pudete aduprà 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

U numaru di nodi di cluster hè facilmente cambiatu attraversu Terraform.
In u schedariu principale.tf u valore seguente hè datu:

cluster_node_count = "${var.cluster_node_count}"

Stu valore hè sustituitu da vars.tf:

variable "cluster_node_count" {
default = 2
}

Pudete cambià sia u valore predeterminatu in vars.tf, o specificate u valore necessariu direttamente in principale.tf:

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

Per applicà i cambiamenti, cum'è in u casu di u primu esempiu, utilizate u cumandamentu terraform applica:

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

Se u numeru di nodi cambia, u cluster resterà dispunibule. Dopu avè aghjustatu un node via Terraform, pudete aduprà senza cunfigurazione supplementu:

$ 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

cunchiusioni

In questu articulu, avemu cunnisciutu i modi principali di travaglià "Nuvola privata virtuale" via Terraform. Saremu felici se utilizate u fornitore ufficiale di Selectel Terraform è furnisce feedback.

Tutti i bug trovati di u fornitore Selectel Terraform ponu esse signalati via Problemi di Github.

Source: www.habr.com

Add a comment