Fornitore di Terraform Selectel

Fornitore di Terraform Selectel

Abbiamo lanciato un fornitore Terraform ufficiale per collaborare con Selectel. Questo prodotto consente agli utenti di implementare completamente la gestione delle risorse attraverso la metodologia Infrastructure-as-code.

Il provider attualmente supporta la gestione delle risorse del servizio "Cloud privato virtuale" (di seguito denominato VPC). In futuro prevediamo di aggiungere la gestione delle risorse per altri servizi forniti da Selectel.

Come già sai, il servizio VPC è basato su OpenStack. Tuttavia, poiché OpenStack non fornisce strumenti nativi per servire il cloud pubblico, abbiamo implementato la funzionalità mancante in una serie di API aggiuntive che semplificano la gestione di oggetti compositi complessi e rendono il lavoro più conveniente. Alcune delle funzionalità disponibili in OpenStack non possono essere utilizzate direttamente, ma sono disponibili tramite nostra API.

Il provider Selectel Terraform ora include la possibilità di gestire le seguenti risorse VPC:

  • progetti e relative quote;
  • utenti, i loro ruoli e token;
  • sottoreti pubbliche, comprese quelle interregionali e VRRP;
  • licenze software.

Il provider utilizza la nostra libreria Go pubblica per funzionare con l'API VPC. Sia la libreria che il provider stesso sono open source, il loro sviluppo viene effettuato su Github:

Per gestire altre risorse cloud, come macchine virtuali, dischi, cluster Kubernetes, puoi utilizzare il provider OpenStack Terraform. La documentazione ufficiale per entrambi i fornitori è disponibile ai seguenti link:

Guida introduttiva

Per iniziare, è necessario installare Terraform (le istruzioni e i collegamenti ai pacchetti di installazione sono disponibili all'indirizzo il sito ufficiale).

Per funzionare, il provider richiede una chiave API Selectel, che viene creata in pannelli di controllo dell'account.

I manifest per lavorare con Selectel vengono creati utilizzando Terraform o utilizzando una serie di esempi già pronti disponibili nel nostro repository Github: esempi di terraform.

Il repository con gli esempi è diviso in due directory:

  • moduli, contenente piccoli moduli riutilizzabili che accettano un insieme di parametri come input e gestiscono un piccolo insieme di risorse;
  • Esempi, contenente esempi di un set completo di moduli interconnessi.

Dopo aver installato Terraform, creato una chiave API Selectel e familiarizzato con gli esempi, passiamo agli esempi pratici.

Un esempio di creazione di un server con un disco locale

Diamo un'occhiata ad un esempio di creazione di un progetto, un utente con un ruolo e una macchina virtuale con un disco locale: terraform-examples/examples/vpc/server_local_root_disk.

In archivio vars.tf vengono descritti tutti i parametri che verranno utilizzati durante la chiamata dei moduli. Alcuni di essi hanno valori predefiniti, ad esempio il server verrà creato nella zona ru-3a con la seguente configurazione:

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 archivio principale.tf Il provider Selectel viene inizializzato:

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

Questo file contiene anche il valore predefinito per la chiave SSH che verrà installata sul server:

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

Se necessario, è possibile specificare una chiave pubblica diversa. Non è necessario specificare la chiave come percorso del file; è anche possibile aggiungere il valore come stringa.

Più avanti in questo file vengono avviati i moduli progetto_con_utente и server_local_root_disk, che gestiscono le risorse necessarie.

Diamo un'occhiata a questi moduli in modo più dettagliato.

Creazione di un progetto e di un utente con un ruolo

Il primo modulo crea un progetto e un utente con un ruolo in quel progetto: terraform-examples/modules/vpc/project_with_user.

L'utente creato potrà accedere a OpenStack e gestirne le risorse. Il modulo è semplice e gestisce solo tre entità:

  • selectel_vpc_project_v2,
  • selectel_vpc_utente_v2,
  • selectel_vpc_role_v2.

Creazione di un server virtuale con disco locale

Il secondo modulo si occupa della gestione degli oggetti OpenStack, necessari per creare un server con un disco locale.

Dovresti prestare attenzione ad alcuni degli argomenti specificati in questo modulo per la risorsa openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argomento ignora_cambiamenti ti consente di ignorare le modifiche agli attributi id per l'immagine utilizzata per creare la macchina virtuale. Nel servizio VPC, la maggior parte delle immagini pubbliche vengono aggiornate automaticamente una volta alla settimana e contemporaneamente id cambia anche. Ciò è dovuto alle peculiarità del componente OpenStack - Glance, in cui le immagini sono considerate entità immutabili.

Se stai creando o modificando un server o un disco esistente che ha come argomento ID_immagine usato id public, quindi, una volta aggiornata l'immagine, l'esecuzione successiva del manifest Terraform ricreerà il server o il disco. Utilizzando un argomento ignora_cambiamenti ti permette di evitare una situazione del genere.

Nota: argomento ignora_cambiamenti è apparso in Terraform parecchio tempo fa: tirare#2525.

argomento ignora_ridimensiona_conferma necessario per ridimensionare correttamente il disco locale, i core o la memoria del server. Tali modifiche vengono apportate tramite il componente OpenStack Nova utilizzando una richiesta ridimensionare. Nova predefinita dopo la richiesta ridimensionare mette il server nello stato verificare_ridimensionare e attende ulteriore conferma da parte dell'utente. Tuttavia, questo comportamento può essere modificato in modo che Nova non attenda ulteriori azioni da parte dell'utente.

L'argomento specificato consente a Terraform di non attendere lo stato verificare_ridimensionare per il server ed essere preparati affinché il server sia in uno stato attivo dopo aver modificato i suoi parametri. L'argomento è disponibile dalla versione 1.10.0 del provider OpenStack Terraform: tirare#422.

Creazione di risorse

Prima di eseguire i manifest, tieni presente che nel nostro esempio vengono lanciati due diversi provider e il provider OpenStack dipende dalle risorse del provider Selectel, poiché senza creare un utente nel progetto è impossibile gestire gli oggetti che ne fanno parte . Sfortunatamente, per lo stesso motivo non possiamo semplicemente eseguire il comando applicare terraform all'interno del nostro esempio. Dobbiamo prima fare applicare per modulo progetto_con_utente e poi per tutto il resto.

Nota: questo problema non è stato ancora risolto in Terraform, puoi seguire la discussione su Github all'indirizzo problema#2430 и problema#4149.

Per creare risorse, vai alla directory terraform-examples/examples/vpc/server_local_root_disk, il suo contenuto dovrebbe essere così:

$ ls
README.md	   main.tf		vars.tf

Inizializziamo i moduli utilizzando il comando:

$ terraform init

L'output mostra che Terraform scarica le versioni più recenti dei provider che utilizza e controlla tutti i moduli descritti nell'esempio.

Per prima cosa applichiamo il modulo progetto_con_utente. Ciò richiede il passaggio manuale dei valori per le variabili che non sono state impostate:

  • sel_account con il tuo numero di conto Selectel;
  • sel_token con la tua chiave per l'API Selectel;
  • password utente con una password per l'utente OpenStack.

I valori per le prime due variabili devono essere presi da pannelli di controllo.

Per l'ultima variabile, puoi trovare qualsiasi password.

Per utilizzare il modulo è necessario sostituire i valori SEL_ACCOUNT, SEL_TOKEN и PASSWORD UTENTE eseguendo il comando:

$ 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

Dopo aver eseguito il comando, Terraform mostrerà quali risorse desidera creare e chiederà conferma:

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 creati progetto, utente e ruolo, puoi iniziare a creare le risorse rimanenti:

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

Quando crei le risorse, presta attenzione all'output Terraform con l'indirizzo IP esterno da cui sarà accessibile il server creato:

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

Puoi lavorare con la macchina virtuale creata tramite SSH utilizzando l'IP specificato.

Modifica delle risorse

Oltre a creare risorse tramite Terraform, è anche possibile modificarle.

Ad esempio, aumentiamo il numero di core e memoria per il nostro server modificando i valori dei parametri server_vcpus и server_ram_mb in archivio 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

Successivamente, controlliamo quali modifiche comporteranno ciò utilizzando il seguente comando:

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

Di conseguenza, Terraform ha apportato una modifica alla risorsa openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Tieni presente che ciò comporterà il riavvio della macchina virtuale creata.

Per applicare la nuova configurazione della macchina virtuale, utilizzare il comando applicare terraform, che abbiamo già lanciato in precedenza.

Tutti gli oggetti creati verranno visualizzati in Pannelli di controllo VPC:

Fornitore di Terraform Selectel

Nel nostro repository di esempio Puoi anche visualizzare i manifest per la creazione di macchine virtuali con unità di rete.

Esempio di creazione di un cluster Kubernetes

Prima di passare all'esempio successivo, ripuliremo le risorse create in precedenza. Per fare questo nella radice del progetto terraform-examples/examples/vpc/server_local_root_disk Eseguiamo il comando per eliminare gli 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

Quindi esegui il comando per cancellare gli oggetti API VPC Selectel:

$ 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 entrambi i casi, dovrai confermare la cancellazione di tutti gli oggetti:

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'esempio seguente è nella directory terraform-examples/examples/vpc/kubernetes_cluster.

Questo esempio crea un progetto, un utente con un ruolo nel progetto e genera un cluster Kubernetes. In archivio vars.tf puoi vedere i valori predefiniti, come il numero di nodi, le loro caratteristiche, la versione di Kubernetes, ecc.

Per creare risorse simili al primo esempio, prima di tutto inizieremo ad inizializzare i moduli e a creare le risorse dei moduli progetto_con_utentee poi creando tutto il resto:

$ 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

Trasferiremo la creazione e la gestione dei cluster Kubernetes tramite il componente OpenStack Magnum. Puoi scoprire di più su come lavorare con un cluster in uno dei nostri articoli precedentie così dentro base di conoscenza.

Durante la preparazione del cluster verranno creati dischi e macchine virtuali e verranno installati tutti i componenti necessari. La preparazione richiede circa 4 minuti, durante i quali Terraform visualizzerà messaggi come:

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

Una volta completata l'installazione, Terraform indicherà che il cluster è pronto e ne visualizzerà l'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 gestire il cluster Kubernetes creato tramite l'utility kubectl è necessario ottenere il file di accesso al cluster. Per fare ciò, vai al progetto creato tramite Terraform nell'elenco dei progetti nel tuo account:

Fornitore di Terraform Selectel

Successivamente, segui il collegamento come xxxxxx.selvpc.ruche appare sotto il nome del progetto:

Fornitore di Terraform Selectel

Per le informazioni di accesso, utilizza il nome utente e la password che hai creato tramite Terraform. Se non hai tradito vars.tf o principale.tf per il nostro esempio, l'utente avrà il nome tf_utente. È necessario utilizzare il valore della variabile come password TF_VAR_password_utente, che è stato specificato all'avvio applicare terraform in precedenza.

All'interno del progetto devi andare alla scheda kubernetes:

Fornitore di Terraform Selectel

Qui è dove si trova il cluster creato tramite Terraform. Scarica il file per kubectl puoi nella scheda “Accesso”:

Fornitore di Terraform Selectel

Le istruzioni di installazione si trovano nella stessa scheda. kubectl e l'utilizzo di quanto scaricato config.yaml.

Dopo l'avvio della kubectl e impostando la variabile d'ambiente KUBECONFIG puoi usare 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

Il numero di nodi del cluster può essere facilmente modificato tramite Terraform.
In archivio principale.tf è specificato il seguente valore:

cluster_node_count = "${var.cluster_node_count}"

Questo valore è sostituito da vars.tf:

variable "cluster_node_count" {
default = 2
}

È possibile modificare il valore predefinito in vars.tfoppure specificare il valore richiesto direttamente in principale.tf:

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

Per applicare le modifiche, come nel caso del primo esempio, utilizzare il comando applicare terraform:

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

Quando il numero di nodi cambia, il cluster rimarrà disponibile. Dopo aver aggiunto un nodo tramite Terraform, puoi utilizzarlo senza ulteriore configurazione:

$ 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

conclusione

In questo articolo abbiamo conosciuto i principali modi con cui lavorare "Cloud privato virtuale" tramite Terraform. Saremo lieti se utilizzi il provider Terraform ufficiale Selectel e fornisci feedback.

Eventuali bug rilevati nel provider Selectel Terraform possono essere segnalati tramite Problemi con Github.

Fonte: habr.com

Aggiungi un commento