Terraform-provizanto Selectel

Terraform-provizanto Selectel

Ni lanĉis oficialan Terraform-provizanton por labori kun Selectel. Ĉi tiu produkto permesas al uzantoj plene efektivigi rimedadministradon per la metodologio Infrastructure-as-code.

La provizanto nuntempe subtenas administradon de servaj rimedoj "Virtuala privata nubo" (ĉi-poste nomata VPC). En la estonteco, ni planas aldoni rimedadministradon por aliaj servoj provizitaj de Selectel.

Kiel vi jam scias, la VPC-servo estas konstruita sur OpenStack. Tamen, pro la fakto, ke OpenStack ne provizas indiĝenajn ilojn por servi la publikan nubon, ni efektivigis la mankantan funkciecon en aro da pliaj API-oj, kiuj simpligas la administradon de kompleksaj kunmetitaj objektoj kaj igas la laboron pli oportuna. Iuj el la disponeblaj funkcioj en OpenStack estas fermitaj pro rekta uzo, sed disponeblaj pere nia API.

La provizanto de Selectel Terraform nun inkluzivas la kapablon administri la sekvajn VPC-rimedojn:

  • projektoj kaj iliaj kvotoj;
  • uzantoj, iliaj roloj kaj ĵetonoj;
  • publikaj subretoj, inkluzive de transregionaj kaj VRRP;
  • programaraj permesiloj.

La provizanto uzas nian publikan Go-bibliotekon por labori kun la VPC-API. Kaj la biblioteko kaj la provizanto mem estas malfermfontaj, ilia evoluo estas farita sur Github:

Por administri aliajn nubajn rimedojn, kiel virtualajn maŝinojn, diskojn, Kubernetes-grupojn, vi povas uzi la provizanton de OpenStack Terraform. Oficiala dokumentaro por ambaŭ provizantoj estas haveblaj ĉe la sekvaj ligiloj:

Kiel ekuzi

Por komenci, vi devas instali Terraform (instrukcioj kaj ligiloj al instalaj pakaĵoj troveblas ĉe oficiala retejo).

Por funkcii, la provizanto postulas Selectel API-ŝlosilon, kiu estas kreita en kontaj kontrolpaneloj.

Manifestoj por labori kun Selectel estas kreitaj uzante Terraform aŭ uzante aron de pretaj ekzemploj disponeblaj en nia Github-deponejo: terraformaj-ekzemploj.

La deponejo kun ekzemploj estas dividita en du dosierujojn:

  • moduloj, enhavante malgrandajn reuzeblajn modulojn, kiuj prenas aron da parametroj kiel enigaĵon kaj administras malgrandan aron da rimedoj;
  • ekzemploj, enhavante ekzemplojn de kompleta aro de interligitaj moduloj.

Post instali Terraform, krei Selectel API-ŝlosilon kaj familiarigi vin kun la ekzemploj, ni pluiru al praktikaj ekzemploj.

Ekzemplo de kreado de servilo kun loka disko

Ni rigardu ekzemplon de kreado de projekto, uzanto kun rolo kaj virtuala maŝino kun loka disko: terraform-examples/examples/vpc/server_local_root_disk.

En dosiero vars.tf ĉiuj parametroj kiuj estos uzataj dum vokado de moduloj estas priskribitaj. Iuj el ili havas defaŭltajn valorojn, ekzemple, la servilo estos kreita en la zono ru-3a kun la sekva agordo:

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

En dosiero ĉefa.tf La Selectel-provizanto estas pravigita:

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

Ĉi tiu dosiero ankaŭ enhavas la defaŭltan valoron por la SSH-ŝlosilo kiu estos instalita sur la servilo:

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

Se necese, vi povas specifi malsaman publikan ŝlosilon. La ŝlosilo ne devas esti specifita kiel dosiervojo; vi ankaŭ povas aldoni la valoron kiel ĉenon.

Plue en ĉi tiu dosiero la moduloj estas lanĉitaj projekto_kun_uzanto и servilo_loka_radika_disko, kiuj administras la necesajn rimedojn.

Ni rigardu ĉi tiujn modulojn pli detale.

Krei projekton kaj uzanton kun rolo

La unua modulo kreas projekton kaj uzanton kun rolo en tiu projekto: terraform-examples/modules/vpc/project_with_user.

La kreita uzanto povos ensaluti al OpenStack kaj administri ĝiajn rimedojn. La modulo estas simpla kaj administras nur tri entojn:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Kreante virtualan servilon kun loka disko

La dua modulo okupiĝas pri administrado de OpenStack-objektoj, kiuj estas necesaj por krei servilon kun loka disko.

Vi devus atenti kelkajn el la argumentoj kiuj estas specifitaj en ĉi tiu modulo por la rimedo openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argumenton ignori_ŝanĝojn permesas al vi ignori atributajn ŝanĝojn id por la bildo uzata por krei la virtualan maŝinon. En la VPC-servo, plej multaj publikaj bildoj estas aŭtomate ĝisdatigitaj unufoje semajne kaj samtempe ilia id ankaŭ ŝanĝiĝas. Ĉi tio estas pro la proprecoj de la OpenStack-komponento - Rigardo, en kiu bildoj estas konsiderataj neŝanĝeblaj estaĵoj.

Se vi kreas aŭ modifas ekzistantan servilon aŭ diskon, kiu havas kiel argumenton bildo_id estas uzata id publika bildo, tiam post kiam tiu bildo estas ĝisdatigita, ruli la Terraform manifeston denove rekreos la servilon aŭ diskon. Uzante argumenton ignori_ŝanĝojn ebligas al vi eviti tian situacion.

Noto: argumento ignori_ŝanĝojn aperis en Terraform antaŭ sufiĉe longa tempo: tiri#2525.

argumenton ignori_regrandigi_konfirmon bezonata por sukcese regrandigi lokan diskon, kernojn aŭ servilan memoron. Tiaj ŝanĝoj estas faritaj per la OpenStack Nova komponento uzante peton regrandigi. Defaŭlte Nova post peto regrandigi metas la servilon en statuson kontroli_regrandigi kaj atendas plian konfirmon de la uzanto. Tamen, ĉi tiu konduto povas esti ŝanĝita tiel ke Nova ne atendas pliajn agojn de la uzanto.

La specifita argumento permesas al Terraform ne atendi la staton kontroli_regrandigi por la servilo kaj estu preta por ke la servilo estu en aktiva stato post ŝanĝado de ĝiaj parametroj. La argumento haveblas de versio 1.10.0 de la provizanto OpenStack Terraform: tiri#422.

Kreante Rimedojn

Antaŭ ol ruli la manifestojn, bonvolu noti, ke en nia ekzemplo, du malsamaj provizantoj estas lanĉitaj, kaj la OpenStack-provizanto dependas de la rimedoj de la Selectel-provizanto, ĉar sen krei uzanton en la projekto, estas neeble administri la objektojn apartenantaj al ĝi. . Bedaŭrinde, pro la sama kialo ni ne povas simple ruli la komandon terraform apliki ene de nia ekzemplo. Ni unue devas fari apliki por modulo projekto_kun_uzanto kaj post tio por ĉio alia.

Noto: Ĉi tiu problemo ankoraŭ ne estas solvita en Terraform, vi povas sekvi la diskuton pri Github ĉe temo #2430 и temo #4149.

Por krei rimedojn, iru al la dosierujo terraform-examples/examples/vpc/server_local_root_disk, ĝia enhavo devus esti tia:

$ ls
README.md	   main.tf		vars.tf

Ni pravigas la modulojn uzante la komandon:

$ terraform init

La eligo montras, ke Terraform elŝutas la plej novajn versiojn de la provizantoj kiujn ĝi uzas kaj kontrolas ĉiujn modulojn priskribitajn en la ekzemplo.

Unue ni apliku la modulon projekto_kun_uzanto. Ĉi tio postulas mane pasi valorojn por variabloj ne agordita:

  • mem_konto kun via numero de konto Selectel;
  • sel_token kun via ŝlosilo por Selectel API;
  • uzanto_pasvorto kun pasvorto por la uzanto de OpenStack.

La valoroj por la unuaj du variabloj devas esti prenitaj de kontrolpaneloj.

Por la lasta variablo, vi povas elpensi ajnan pasvorton.

Por uzi la modulon vi devas anstataŭigi la valorojn SEL_KONTO, SEL_TOKEN и USER_PASSWORD rulante la komandon:

$ 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

Post rulado de la komando, Terraform montros kiajn rimedojn ĝi volas krei kaj petos konfirmon:

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

Post kiam la projekto, uzanto kaj rolo estas kreitaj, vi povas komenci krei la ceterajn rimedojn:

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

Kreante rimedojn, atentu la eligon de Terraform kun la ekstera IP-adreso, kie la kreita servilo estos alirebla:

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

Vi povas labori kun la kreita virtuala maŝino per SSH uzante la specifitan IP.

Redaktaj Rimedoj

Krom kreado de rimedoj per Terraform, ili ankaŭ povas esti modifitaj.

Ekzemple, ni pliigu la nombron da kernoj kaj memoron por nia servilo ŝanĝante la valorojn por la parametroj server_vcpus и server_ram_mb en dosiero examples/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

Post ĉi tio, ni kontrolas kiajn ŝanĝojn ĉi tio kondukos al uzado de la sekva komando:

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

Kiel rezulto, Terraform faris rimedŝanĝon openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Bonvolu noti, ke tio implicos rekomenci la kreitan virtualan maŝinon.

Por apliki la novan virtualan maŝinan agordon, uzu la komandon terraform apliki, kiun ni jam lanĉis pli frue.

Ĉiuj kreitaj objektoj estos montrataj en VPC-kontrolpaneloj:

Terraform-provizanto Selectel

En nia ekzemplaj deponejoj Vi ankaŭ povas vidi manifestojn por krei virtualajn maŝinojn kun retaj diskoj.

Ekzemplo de kreado de Kubernetes-areto

Antaŭ ol ni transiru al la sekva ekzemplo, ni purigos la rimedojn, kiujn ni kreis antaŭe. Por fari tion en la radiko de la projekto terraform-examples/examples/vpc/server_local_root_disk Ni rulu la komandon por forigi OpenStack-objektojn:

$ 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

Poste rulu la komandon por forigi objektojn de 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

En ambaŭ kazoj, vi devos konfirmi la forigon de ĉiuj objektoj:

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

La sekva ekzemplo estas en la dosierujo terraform-examples/examples/vpc/kubernetes_cluster.

Ĉi tiu ekzemplo kreas projekton, uzanton kun rolo en la projekto, kaj levas unu Kubernetes-grupon. En dosiero vars.tf vi povas vidi defaŭltajn valorojn, kiel la nombro da nodoj, iliaj karakterizaĵoj, Kubernetes-versio, ktp.

Por krei rimedojn similajn al la unua ekzemplo, unue ni komencos pravalorigi modulojn kaj krei modulajn rimedojn projekto_kun_uzantokaj poste kreante ĉion alian:

$ 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

Ni translokigos la kreadon kaj administradon de Kubernetes-grupoj per la OpenStack Magnum-komponento. Vi povas ekscii pli pri kiel labori kun areto en unu el niaj antaŭaj artikolojsame kiel en sciobazo.

Preparante la areton, diskoj kaj virtualaj maŝinoj estos kreitaj kaj ĉiuj necesaj komponantoj estos instalitaj. Preparo daŭras ĉirkaŭ 4 minutojn, dum kiu tempo Terraform montros mesaĝojn kiel:

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

Post kiam la instalado finiĝos, Terraform indikos, ke la areto estas preta kaj montros sian 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.

Administri la kreitan Kubernetes-grupon per la utileco kubectl vi devas akiri la cluster-alirdosieron. Por fari tion, iru al la projekto kreita per Terraform en la listo de projektoj en via konto:

Terraform-provizanto Selectel

Poste, sekvu la ligilon kiel xxxxxx.selvpc.rukiu aperas sub la nomo de la projekto:

Terraform-provizanto Selectel

Por ensalutinformoj, uzu la uzantnomon kaj pasvorton, kiujn vi kreis per Terraform. Se vi ne trompis vars.tf ĉefa.tf por nia ekzemplo, la uzanto havos la nomon tf_uzanto. Vi devas uzi la valoron de la variablo kiel la pasvorton TF_VAR_uzanto_pasvorto, kiu estis specifita ĉe ekfunkciigo terraform apliki pli frue.

Ene de la projekto vi devas iri al la langeto Kubernetoj:

Terraform-provizanto Selectel

Ĉi tie situas la areto kreita per Terraform. Elŝutu dosieron por kubectl vi povas en la langeto "Aliro":

Terraform-provizanto Selectel

Instalaj instrukcioj troviĝas sur la sama langeto. kubectl kaj uzo de la elŝutita agordo.yaml.

Post lanĉo kubectl kaj fiksante la mediovariablon KUBECONFIG vi povas uzi 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

La nombro da aretnodoj povas esti facile ŝanĝita per Terraform.
En dosiero ĉefa.tf la sekva valoro estas specifita:

cluster_node_count = "${var.cluster_node_count}"

Ĉi tiu valoro estas anstataŭigita de vars.tf:

variable "cluster_node_count" {
default = 2
}

Vi povas ŝanĝi aŭ la defaŭltan valoron en vars.tf, aŭ specifu la postulatan valoron rekte en ĉefa.tf:

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

Por apliki la ŝanĝojn, kiel en la kazo de la unua ekzemplo, uzu la komandon terraform apliki:

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

Kiam la nombro da nodoj ŝanĝiĝas, la areto restos disponebla. Post aldoni nodon per Terraform, vi povas uzi ĝin sen plia agordo:

$ 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

konkludo

En ĉi tiu artikolo ni konatiĝis kun la ĉefaj manieroj kunlabori "Virtuala privata nubo" per Terraform. Ni ĝojos se vi uzos la oficialan Terraform-provizanton Selectel kaj donos komentojn.

Ajnaj eraroj trovitaj en la provizanto de Selectel Terraform povas esti raportitaj per Problemoj de Github.

fonto: www.habr.com

Aldoni komenton