Provider ng Terraform na Selectel

Provider ng Terraform na Selectel

Naglunsad kami ng opisyal na provider ng Terraform para makipagtulungan sa Selectel. Binibigyang-daan ng produktong ito ang mga user na ganap na ipatupad ang pamamahala ng mapagkukunan sa pamamagitan ng pamamaraang Infrastructure-as-code.

Kasalukuyang sinusuportahan ng provider ang pamamahala ng mapagkukunan ng serbisyo "Virtual private cloud" (mula rito ay tinutukoy bilang VPC). Sa hinaharap, plano naming magdagdag ng pamamahala ng mapagkukunan para sa iba pang mga serbisyong ibinigay ng Selectel.

Tulad ng alam mo na, ang serbisyo ng VPC ay binuo sa OpenStack. Gayunpaman, dahil sa ang katunayan na ang OpenStack ay hindi nagbibigay ng mga katutubong tool para sa paghahatid ng pampublikong ulap, ipinatupad namin ang nawawalang pag-andar sa isang hanay ng mga karagdagang API na nagpapasimple sa pamamahala ng mga kumplikadong composite na bagay at ginagawang mas maginhawa ang gawain. Ang ilan sa mga functionality na magagamit sa OpenStack ay sarado mula sa direktang paggamit, ngunit magagamit sa pamamagitan ng ang aming API.

Kasama na ngayon ng provider ng Selectel Terraform ang kakayahang pamahalaan ang mga sumusunod na mapagkukunan ng VPC:

  • mga proyekto at kanilang mga quota;
  • mga gumagamit, ang kanilang mga tungkulin at mga token;
  • mga pampublikong subnet, kabilang ang cross-regional at VRRP;
  • mga lisensya ng software.

Ginagamit ng provider ang aming pampublikong Go library para magtrabaho kasama ang VPC API. Parehong ang library at ang provider mismo ay open-source, ang kanilang pag-unlad ay isinasagawa sa Github:

Upang pamahalaan ang iba pang mapagkukunan ng ulap, tulad ng mga virtual machine, disk, Kubernetes cluster, maaari mong gamitin ang OpenStack Terraform provider. Ang opisyal na dokumentasyon para sa parehong provider ay makukuha sa mga sumusunod na link:

Pagsisimula

Upang makapagsimula, kailangan mong i-install ang Terraform (matatagpuan ang mga tagubilin at link sa mga pakete ng pag-install sa opisyal na website).

Para gumana, kailangan ng provider ng Selectel API key, na ginawa sa mga control panel ng account.

Ang mga manifest para sa pagtatrabaho sa Selectel ay ginawa gamit ang Terraform o gamit ang isang set ng mga handa na halimbawa na available sa aming Github repository: terraform-halimbawa.

Ang repositoryo na may mga halimbawa ay nahahati sa dalawang direktoryo:

  • module, na naglalaman ng maliliit na magagamit muli na mga module na kumukuha ng isang set ng mga parameter bilang input at namamahala ng isang maliit na hanay ng mga mapagkukunan;
  • halimbawa, na naglalaman ng mga halimbawa ng kumpletong hanay ng magkakaugnay na mga module.

Pagkatapos mag-install ng Terraform, gumawa ng Selectel API key at maging pamilyar sa mga halimbawa, lumipat tayo sa mga praktikal na halimbawa.

Isang halimbawa ng paglikha ng isang server na may lokal na disk

Tingnan natin ang isang halimbawa ng paglikha ng isang proyekto, isang user na may tungkulin at isang virtual machine na may lokal na disk: terraform-examples/examples/vpc/server_local_root_disk.

Nasa file vars.tf lahat ng mga parameter na gagamitin kapag tumatawag sa mga module ay inilarawan. Ang ilan sa mga ito ay may mga default na halaga, halimbawa, ang server ay gagawin sa zone ru-3a na may sumusunod na pagsasaayos:

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

Nasa file pangunahing.tf Pinasimulan ang Selectel provider:

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

Ang file na ito ay naglalaman din ng default na halaga para sa SSH key na mai-install sa server:

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

Kung kinakailangan, maaari kang tumukoy ng ibang pampublikong key. Ang susi ay hindi kailangang tukuyin bilang isang landas ng file; maaari mo ring idagdag ang halaga bilang isang string.

Dagdag pa sa file na ito ang mga module ay inilunsad project_with_user и server_local_root_disk, na namamahala sa mga kinakailangang mapagkukunan.

Tingnan natin ang mga modyul na ito nang mas detalyado.

Paglikha ng isang proyekto at isang gumagamit na may tungkulin

Lumilikha ang unang module ng isang proyekto at isang user na may papel sa proyektong iyon: terraform-examples/modules/vpc/project_with_user.

Ang nilikhang user ay makakapag-log in sa OpenStack at mapamahalaan ang mga mapagkukunan nito. Ang module ay simple at pinamamahalaan lamang ang tatlong entity:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Paglikha ng isang virtual server na may lokal na disk

Ang pangalawang module ay tumatalakay sa pamamahala ng mga object ng OpenStack, na kinakailangan upang lumikha ng isang server na may lokal na disk.

Dapat mong bigyang pansin ang ilan sa mga argumento na tinukoy sa modyul na ito para sa mapagkukunan openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argumento ignore_changes nagbibigay-daan sa iyo na huwag pansinin ang mga pagbabago sa katangian id para sa imaheng ginamit upang lumikha ng virtual machine. Sa serbisyo ng VPC, ang karamihan sa mga pampublikong larawan ay awtomatikong ina-update isang beses sa isang linggo at sa parehong oras ang kanilang id nagbabago rin. Ito ay dahil sa mga kakaibang bahagi ng bahagi ng OpenStack - Sulyap, kung saan ang mga imahe ay itinuturing na mga hindi nababagong entity.

Kung ikaw ay gumagawa o nagbabago ng isang umiiral na server o disk na mayroon bilang isang argumento image_id ginamit id pampublikong imahe, pagkatapos ay pagkatapos na ma-update ang larawang iyon, muling gagawa ng server o disk ang pagpapatakbo ng Terraform manifest. Paggamit ng argumento ignore_changes nagbibigay-daan sa iyo upang maiwasan ang ganoong sitwasyon.

Tandaan: argumento ignore_changes lumitaw sa Terraform medyo matagal na ang nakalipas: hilahin#2525.

argumento ignore_resize_confirmation kinakailangan upang matagumpay na baguhin ang laki ng lokal na disk, mga core, o memorya ng server. Ang ganitong mga pagbabago ay ginawa sa pamamagitan ng bahagi ng OpenStack Nova gamit ang isang kahilingan baguhin ang sukat. Default na Nova pagkatapos ng kahilingan baguhin ang sukat inilalagay ang server sa katayuan verify_resize at naghihintay ng karagdagang kumpirmasyon mula sa user. Gayunpaman, maaaring baguhin ang gawi na ito upang hindi maghintay si Nova ng mga karagdagang aksyon mula sa user.

Ang tinukoy na argumento ay nagpapahintulot sa Terraform na huwag maghintay para sa katayuan verify_resize para sa server at maging handa para sa server na nasa isang aktibong katayuan pagkatapos baguhin ang mga parameter nito. Available ang argumento mula sa bersyon 1.10.0 ng OpenStack Terraform provider: hilahin#422.

Paglikha ng Mga Mapagkukunan

Bago patakbuhin ang mga manifest, pakitandaan na sa aming halimbawa, dalawang magkaibang provider ang inilunsad, at ang OpenStack provider ay nakasalalay sa mga mapagkukunan ng Selectel provider, dahil nang walang paglikha ng user sa proyekto, imposibleng pamahalaan ang mga bagay na kabilang dito. . Sa kasamaang-palad, sa parehong dahilan ay hindi lang natin mapapatakbo ang command nalalapat ang terraform sa loob ng ating halimbawa. Kailangan muna nating gawin mag-aplay para sa modyul project_with_user at pagkatapos nito para sa lahat ng iba pa.

Tandaan: Ang isyung ito ay hindi pa nareresolba sa Terraform, maaari mong sundan ang talakayan sa Github sa isyu#2430 и isyu#4149.

Upang lumikha ng mga mapagkukunan, pumunta sa direktoryo terraform-examples/examples/vpc/server_local_root_disk, ang mga nilalaman nito ay dapat na ganito:

$ ls
README.md	   main.tf		vars.tf

Sinisimulan namin ang mga module gamit ang command:

$ terraform init

Ipinapakita ng output na dina-download ng Terraform ang pinakabagong mga bersyon ng mga provider na ginagamit nito at sinusuri ang lahat ng mga module na inilarawan sa halimbawa.

Ilapat muna natin ang modyul project_with_user. Nangangailangan ito ng manu-manong pagpasa ng mga halaga para sa mga variable na hindi pa naitakda:

  • sel_account gamit ang iyong Selectel account number;
  • sel_token gamit ang iyong susi para sa Selectel API;
  • user_password na may password para sa OpenStack user.

Ang mga halaga para sa unang dalawang variable ay dapat kunin mula sa control panel.

Para sa huling variable, maaari kang makabuo ng anumang password.

Upang magamit ang module kailangan mong palitan ang mga halaga SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD pagpapatakbo ng utos:

$ 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

Pagkatapos patakbuhin ang utos, ipapakita ng Terraform kung anong mga mapagkukunan ang nais nitong gawin at humingi ng kumpirmasyon:

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

Kapag nagawa na ang proyekto, user at tungkulin, maaari mong simulan ang paggawa ng mga natitirang mapagkukunan:

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

Kapag lumilikha ng mga mapagkukunan, bigyang-pansin ang output ng Terraform na may panlabas na IP address kung saan maa-access ang nilikhang server:

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

Maaari kang magtrabaho kasama ang nilikha na virtual machine sa pamamagitan ng SSH gamit ang tinukoy na IP.

Pag-edit ng Mga Mapagkukunan

Bilang karagdagan sa paglikha ng mga mapagkukunan sa pamamagitan ng Terraform, maaari din silang baguhin.

Halimbawa, dagdagan natin ang bilang ng mga core at memory para sa aming server sa pamamagitan ng pagbabago ng mga halaga para sa mga parameter server_vcpus и server_ram_mb sa file 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

Pagkatapos nito, suriin namin kung anong mga pagbabago ang hahantong sa paggamit ng sumusunod na command:

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

Bilang resulta, gumawa ng pagbabago sa mapagkukunan ang Terraform openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Pakitandaan na ito ay mangangailangan ng pag-reboot ng nilikhang virtual machine.

Upang ilapat ang bagong configuration ng virtual machine, gamitin ang command nalalapat ang terraform, na inilunsad na namin kanina.

Ang lahat ng nilikhang bagay ay ipapakita sa Mga control panel ng VPC:

Provider ng Terraform na Selectel

Sa ating mga halimbawang repositoryo Maaari mo ring makita ang mga manifest para sa paglikha ng mga virtual machine na may mga network drive.

Halimbawa ng paggawa ng Kubernetes cluster

Bago tayo magpatuloy sa susunod na halimbawa, lilinisin natin ang mga mapagkukunang ginawa natin kanina. Upang gawin ito sa ugat ng proyekto terraform-examples/examples/vpc/server_local_root_disk Patakbuhin natin ang command para tanggalin ang mga object ng 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

Pagkatapos ay patakbuhin ang command upang i-clear ang Selectel VPC API objects:

$ 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

Sa parehong mga kaso, kakailanganin mong kumpirmahin ang pagtanggal ng lahat ng mga bagay:

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

Ang sumusunod na halimbawa ay nasa direktoryo terraform-examples/examples/vpc/kubernetes_cluster.

Ang halimbawang ito ay gumagawa ng isang proyekto, isang user na may papel sa proyekto, at nagtataas ng isang Kubernetes cluster. Nasa file vars.tf maaari mong makita ang mga default na halaga, tulad ng bilang ng mga node, kanilang mga katangian, bersyon ng Kubernetes, atbp.

Upang lumikha ng mga mapagkukunan na katulad ng unang halimbawa, una sa lahat sisimulan natin ang pagsisimula ng mga module at paglikha ng mga mapagkukunan ng module project_with_userat pagkatapos ay lumilikha ng lahat ng iba pa:

$ 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

Ililipat namin ang paglikha at pamamahala ng mga kumpol ng Kubernetes sa pamamagitan ng bahagi ng OpenStack Magnum. Maaari mong malaman ang higit pa tungkol sa kung paano magtrabaho sa isang cluster sa isa sa aming mga nakaraang artikulo, pati na rin sa base ng kaalaman.

Kapag inihahanda ang kumpol, gagawin ang mga disk at virtual machine at mai-install ang lahat ng kinakailangang sangkap. Ang paghahanda ay tumatagal ng humigit-kumulang 4 na minuto, kung saan ang Terraform ay magpapakita ng mga mensahe tulad ng:

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

Kapag kumpleto na ang pag-install, ipapahiwatig ng Terraform na handa na ang cluster at ipapakita ang ID nito:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Upang pamahalaan ang ginawang Kubernetes cluster sa pamamagitan ng utility kubectl kailangan mong makuha ang cluster access file. Upang gawin ito, pumunta sa proyektong ginawa sa pamamagitan ng Terraform sa listahan ng mga proyekto sa iyong account:

Provider ng Terraform na Selectel

Susunod, sundin ang link tulad ng xxxxxx.selvpc.runa lumalabas sa ibaba ng pangalan ng proyekto:

Provider ng Terraform na Selectel

Para sa impormasyon sa pag-log in, gamitin ang username at password na iyong ginawa sa pamamagitan ng Terraform. Kung hindi ka manloko vars.tf o pangunahing.tf para sa aming halimbawa, ang gumagamit ay magkakaroon ng pangalan tf_user. Dapat mong gamitin ang halaga ng variable bilang password TF_VAR_user_password, na tinukoy sa pagsisimula nalalapat ang terraform kanina pa

Sa loob ng proyekto kailangan mong pumunta sa tab Kubernetes:

Provider ng Terraform na Selectel

Dito matatagpuan ang cluster na ginawa sa pamamagitan ng Terraform. Mag-download ng file para sa kubectl maaari mo sa tab na "Access":

Provider ng Terraform na Selectel

Ang mga tagubilin sa pag-install ay matatagpuan sa parehong tab. kubectl at paggamit ng na-download config.yaml.

Pagkatapos ng paglulunsad kubectl at pagtatakda ng variable ng kapaligiran KUBECONFIG maaari mong gamitin ang 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

Ang bilang ng mga cluster node ay madaling mabago sa pamamagitan ng Terraform.
Nasa file pangunahing.tf ang sumusunod na halaga ay tinukoy:

cluster_node_count = "${var.cluster_node_count}"

Ang halagang ito ay pinapalitan mula sa vars.tf:

variable "cluster_node_count" {
default = 2
}

Maaari mong baguhin ang alinman sa default na halaga sa vars.tf, o tukuyin ang kinakailangang halaga nang direkta sa pangunahing.tf:

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

Upang ilapat ang mga pagbabago, tulad ng sa kaso ng unang halimbawa, gamitin ang command nalalapat ang terraform:

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

Kapag nagbago ang bilang ng mga node, mananatiling available ang cluster. Pagkatapos magdagdag ng node sa pamamagitan ng Terraform, magagamit mo ito nang walang karagdagang configuration:

$ 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

Konklusyon

Sa artikulong ito nakilala namin ang mga pangunahing paraan upang magtrabaho kasama "Virtual private cloud" sa pamamagitan ng Terraform. Kami ay natutuwa kung gagamitin mo ang opisyal na provider ng Terraform na Selectel at magbibigay ng feedback.

Ang anumang mga bug na makikita sa provider ng Selectel Terraform ay maaaring iulat sa pamamagitan ng Mga Isyu sa Github.

Pinagmulan: www.habr.com

Magdagdag ng komento