Proveïdor de Terraform Selectel

Proveïdor de Terraform Selectel

Hem llançat un proveïdor oficial de Terraform per treballar amb Selectel. Aquest producte permet als usuaris implementar completament la gestió de recursos mitjançant la metodologia Infraestructura com a codi.

Actualment, el proveïdor admet la gestió de recursos del servei "Núvol privat virtual" (d'ara endavant, VPC). En el futur, tenim previst afegir la gestió de recursos per a altres serveis que ofereix Selectel.

Com ja sabeu, el servei VPC es basa en OpenStack. Tanmateix, a causa del fet que OpenStack no proporciona eines natives per donar servei al núvol públic, hem implementat la funcionalitat que faltava en un conjunt d'API addicionals que simplifiquen la gestió d'objectes compostos complexos i fan que el treball sigui més còmode. Algunes de les funcionalitats disponibles a OpenStack estan tancades per a l'ús directe, però estan disponibles mitjançant la nostra API.

El proveïdor de Selectel Terraform ara inclou la capacitat de gestionar els recursos VPC següents:

  • projectes i les seves quotes;
  • usuaris, els seus rols i fitxes;
  • subxarxes públiques, incloses les interregionals i VRRP;
  • llicències de programari.

El proveïdor utilitza la nostra biblioteca pública de Go per treballar amb l'API VPC. Tant la biblioteca com el propi proveïdor són de codi obert, el seu desenvolupament es realitza a Github:

Per gestionar altres recursos al núvol, com ara màquines virtuals, discs, clústers de Kubernetes, podeu utilitzar el proveïdor d'OpenStack Terraform. La documentació oficial d'ambdós proveïdors està disponible als enllaços següents:

primers passos

Per començar, cal instal·lar Terraform (es poden trobar instruccions i enllaços als paquets d'instal·lació a lloc web oficial).

Per funcionar, el proveïdor requereix una clau API de Selectel, que es crea a panells de control del compte.

Els manifests per treballar amb Selectel es creen amb Terraform o amb un conjunt d'exemples ja fets que estan disponibles al nostre repositori de Github: terraforma-exemples.

El repositori amb exemples es divideix en dos directoris:

  • mòduls, que conté petits mòduls reutilitzables que prenen un conjunt de paràmetres com a entrada i gestionen un petit conjunt de recursos;
  • exemples, que conté exemples d'un conjunt complet de mòduls interconnectats.

Després d'instal·lar Terraform, crear una clau API de Selectel i familiaritzar-se amb els exemples, passem a exemples pràctics.

Un exemple de creació d'un servidor amb un disc local

Vegem un exemple de creació d'un projecte, un usuari amb un rol i una màquina virtual amb un disc local: terraform-examples/examples/vpc/server_local_root_disk.

A l'arxiu vars.tf Es descriuen tots els paràmetres que s'utilitzaran en cridar mòduls. Alguns d'ells tenen valors per defecte, per exemple, el servidor es crearà a la zona ru-3a amb la configuració següent:

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

A l'arxiu principal.tf El proveïdor de Selectel està inicialitzat:

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

Aquest fitxer també conté el valor predeterminat de la clau SSH que s'instal·larà al servidor:

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

Si cal, podeu especificar una clau pública diferent. La clau no s'ha d'especificar com a ruta de fitxer; també podeu afegir el valor com a cadena.

Més endavant en aquest fitxer s'inicien els mòduls projecte_amb_usuari и disc_arrel_local_servidor, que gestionen els recursos necessaris.

Vegem aquests mòduls amb més detall.

Creació d'un projecte i d'un usuari amb un rol

El primer mòdul crea un projecte i un usuari amb una funció en aquest projecte: terraform-examples/mòduls/vpc/project_with_user.

L'usuari creat podrà iniciar sessió a OpenStack i gestionar els seus recursos. El mòdul és senzill i només gestiona tres entitats:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Creació d'un servidor virtual amb disc local

El segon mòdul s'ocupa de la gestió dels objectes OpenStack, necessaris per crear un servidor amb un disc local.

Hauríeu de parar atenció a alguns dels arguments que s'especifiquen en aquest mòdul per al recurs openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

Argument ignora_canvis us permet ignorar els canvis d'atributs id per a la imatge utilitzada per crear la màquina virtual. Al servei VPC, la majoria d'imatges públiques s'actualitzen automàticament un cop a la setmana i al mateix temps id també canvia. Això es deu a les peculiaritats del component OpenStack - Glance, en què les imatges es consideren entitats immutables.

Si esteu creant o modificant un servidor o disc existent que té com a argument image_id usat id imatge pública, després que aquesta imatge s'actualitzi, tornar a executar el manifest Terraform recrearà el servidor o el disc. Utilitzant un argument ignora_canvis permet evitar una situació així.

Nota: argument ignora_canvis va aparèixer a Terraform fa força temps: tirar #2525.

Argument ignore_resize_confirmation necessari per canviar la mida del disc local, els nuclis o la memòria del servidor. Aquests canvis es fan mitjançant el component OpenStack Nova mitjançant una sol·licitud canviar la mida de. Nova per defecte després de la sol·licitud canviar la mida de posa el servidor en estat verificar_redimensionar i espera una confirmació addicional de l'usuari. Tanmateix, aquest comportament es pot canviar perquè Nova no esperi accions addicionals de l'usuari.

L'argument especificat permet a Terraform no esperar l'estat verificar_redimensionar per al servidor i estar preparat perquè el servidor estigui en un estat actiu després de canviar els seus paràmetres. L'argument està disponible a la versió 1.10.0 del proveïdor d'OpenStack Terraform: tirar #422.

Creació de Recursos

Abans d'executar els manifests, tingueu en compte que en el nostre exemple s'inicien dos proveïdors diferents, i el proveïdor d'OpenStack depèn dels recursos del proveïdor de Selectel, ja que sense crear un usuari al projecte és impossible gestionar els objectes que li pertanyen. . Malauradament, pel mateix motiu no podem executar l'ordre aplicar terraform dins del nostre exemple. Primer hem de fer aplicar per al mòdul projecte_amb_usuari i després per a tota la resta.

Nota: aquest problema encara no s'ha resolt a Terraform, podeu seguir la discussió a Github a número 2430 и número 4149.

Per crear recursos, aneu al directori terraform-examples/examples/vpc/server_local_root_disk, el seu contingut hauria de ser així:

$ ls
README.md	   main.tf		vars.tf

Inicialitzem els mòduls mitjançant l'ordre:

$ terraform init

La sortida mostra que Terraform baixa les últimes versions dels proveïdors que utilitza i comprova tots els mòduls descrits a l'exemple.

Primer apliquem el mòdul projecte_amb_usuari. Això requereix passar manualment valors per a variables que no s'han establert:

  • compte_sel amb el vostre número de compte de Selectel;
  • sel_token amb la teva clau per a l'API Selectel;
  • contrasenya_usuari amb una contrasenya per a l'usuari d'OpenStack.

S'han de prendre els valors de les dues primeres variables panells de control.

Per a l'última variable, podeu trobar qualsevol contrasenya.

Per utilitzar el mòdul cal substituir els valors SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD executant l'ordre:

$ 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

Després d'executar l'ordre, Terraform mostrarà quins recursos vol crear i demanarà confirmació:

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

Un cop creat el projecte, l'usuari i el rol, podeu començar a crear els recursos restants:

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

Quan creeu recursos, presteu atenció a la sortida de Terraform amb l'adreça IP externa on es podrà accedir al servidor creat:

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

Podeu treballar amb la màquina virtual creada mitjançant SSH mitjançant la IP especificada.

Recursos d'edició

A més de crear recursos mitjançant Terraform, també es poden modificar.

Per exemple, augmentem el nombre de nuclis i memòria per al nostre servidor canviant els valors dels paràmetres server_vcpus и server_ram_mb a l'arxiu exemples/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

Després d'això, comprovem quins canvis comportarà amb l'ordre següent:

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

Com a resultat, Terraform va fer un canvi de recursos openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Tingueu en compte que això implicarà reiniciar la màquina virtual creada.

Per aplicar la nova configuració de la màquina virtual, utilitzeu l'ordre aplicar terraform, que ja hem posat en marxa abans.

Tots els objectes creats es mostraran a Panells de control VPC:

Proveïdor de Terraform Selectel

En la nostra repositoris d'exemple També podeu veure manifests per crear màquines virtuals amb unitats de xarxa.

Exemple de creació d'un clúster de Kubernetes

Abans de passar al següent exemple, netejarem els recursos que hem creat anteriorment. Per fer-ho a l'arrel del projecte terraform-examples/examples/vpc/server_local_root_disk Executem l'ordre per eliminar objectes d'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

A continuació, executeu l'ordre per esborrar els objectes de l'API de Selectel VPC:

$ 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

En ambdós casos, haureu de confirmar la supressió de tots els objectes:

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'exemple següent es troba al directori terraform-examples/examples/vpc/kubernetes_cluster.

Aquest exemple crea un projecte, un usuari amb una funció al projecte i genera un clúster de Kubernetes. A l'arxiu vars.tf podeu veure els valors per defecte, com ara el nombre de nodes, les seves característiques, la versió de Kubernetes, etc.

Per crear recursos semblants al primer exemple, primer de tot començarem a inicialitzar mòduls i crear recursos de mòduls projecte_amb_usuarii després crear tota la resta:

$ 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

Transferirem la creació i gestió de clústers Kubernetes a través del component OpenStack Magnum. Podeu obtenir més informació sobre com treballar amb un clúster en un dels nostres articles anteriorsaixí com a Base de coneixements.

En preparar el clúster, es crearan discs i màquines virtuals i s'instal·laran tots els components necessaris. La preparació triga uns 4 minuts, temps durant els quals Terraform mostrarà missatges com:

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

Un cop finalitzada la instal·lació, Terraform indicarà que el clúster està preparat i mostrarà el seu 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 gestionar el clúster de Kubernetes creat mitjançant la utilitat kubectl heu d'obtenir el fitxer d'accés al clúster. Per fer-ho, aneu al projecte creat mitjançant Terraform a la llista de projectes del vostre compte:

Proveïdor de Terraform Selectel

A continuació, seguiu l'enllaç m'agrada xxxxxx.selvpc.ruque apareix sota el nom del projecte:

Proveïdor de Terraform Selectel

Per obtenir informació d'inici de sessió, utilitzeu el nom d'usuari i la contrasenya que heu creat mitjançant Terraform. Si no has enganyat vars.tf o principal.tf per al nostre exemple, l'usuari tindrà el nom tf_usuari. Heu d'utilitzar el valor de la variable com a contrasenya TF_VAR_contrasenya_usuari, que es va especificar a l'inici aplicar terraform abans.

Dins del projecte cal anar a la pestanya Kubernetes:

Proveïdor de Terraform Selectel

Aquí és on es troba el clúster creat mitjançant Terraform. Descarregar fitxer per kubectl podeu a la pestanya "Accés":

Proveïdor de Terraform Selectel

Les instruccions d'instal·lació es troben a la mateixa pestanya. kubectl i ús del descarregat config.yaml.

Després del llançament kubectl i establir la variable d'entorn KUBECONFIG podeu utilitzar 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

El nombre de nodes del clúster es pot canviar fàcilment mitjançant Terraform.
A l'arxiu principal.tf s'especifica el valor següent:

cluster_node_count = "${var.cluster_node_count}"

Aquest valor es substitueix de vars.tf:

variable "cluster_node_count" {
default = 2
}

Podeu canviar el valor predeterminat a vars.tf, o especifiqueu el valor necessari directament a principal.tf:

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

Per aplicar els canvis, com en el cas del primer exemple, utilitzeu l'ordre aplicar terraform:

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

Quan canviï el nombre de nodes, el clúster romandrà disponible. Després d'afegir un node mitjançant Terraform, podeu utilitzar-lo sense configuració addicional:

$ 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

Conclusió

En aquest article ens vam familiaritzar amb les principals maneres de treballar "Núvol privat virtual" a través de Terraform. Estarem encantats si utilitzeu el proveïdor oficial de Selectel Terraform i proporcioneu comentaris.

Qualsevol error que es trobi al proveïdor de Selectel Terraform es pot informar mitjançant Problemes de Github.

Font: www.habr.com

Afegeix comentari