Доставчик на Terraform Selectel

Доставчик на Terraform Selectel

Пуснахме официален доставчик на Terraform, който да работи със Selectel. Този продукт позволява на потребителите да прилагат изцяло управление на ресурсите чрез методологията Infrastructure-as-code.

В момента доставчикът поддържа управление на ресурсите на услугата „Виртуален частен облак“ (наричан по-долу VPC). В бъдеще планираме да добавим управление на ресурси за други услуги, предоставяни от Selectel.

Както вече знаете, услугата VPC е изградена на OpenStack. Въпреки това, поради факта, че OpenStack не предоставя собствени инструменти за обслужване на публичния облак, внедрихме липсващата функционалност в набор от допълнителни API, които опростяват управлението на сложни съставни обекти и правят работата по-удобна. Някои от функциите, налични в OpenStack, са затворени за директна употреба, но са достъпни чрез нашия API.

Доставчикът Selectel Terraform вече включва възможност за управление на следните VPC ресурси:

  • проекти и техните квоти;
  • потребители, техните роли и токени;
  • публични подмрежи, включително междурегионални и VRRP;
  • софтуерни лицензи.

Доставчикът използва нашата публична Go библиотека, за да работи с VPC API. Както библиотеката, така и самият доставчик са с отворен код, тяхното развитие се извършва в Github:

За да управлявате други облачни ресурси, като виртуални машини, дискове, Kubernetes клъстери, можете да използвате доставчика OpenStack Terraform. Официална документация и за двата доставчика е достъпна на следните връзки:

Първи стъпки

За да започнете, трябва да инсталирате Terraform (инструкции и връзки към инсталационните пакети можете да намерите на официален сайт).

За да работи, доставчикът изисква Selectel API ключ, който е създаден в контролни панели на акаунта.

Манифестите за работа със Selectel се създават с помощта на Terraform или с помощта на набор от готови примери, които са налични в нашето хранилище на Github: тераформа-примери.

Хранилището с примери е разделено на две директории:

  • модули, съдържащ малки модули за многократна употреба, които приемат набор от параметри като вход и управляват малък набор от ресурси;
  • примери, съдържащ примери за пълен набор от взаимосвързани модули.

След като инсталирате Terraform, създадете Selectel API ключ и се запознаете с примерите, нека да преминем към практически примери.

Пример за създаване на сървър с локален диск

Нека да разгледаме пример за създаване на проект, потребител с роля и виртуална машина с локален диск: terraform-examples/examples/vpc/server_local_root_disk.

Във файла vars.tf са описани всички параметри, които ще се използват при извикване на модули. Някои от тях имат стойности по подразбиране, например сървърът ще бъде създаден в зоната ru-3a със следната конфигурация:

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

Във файла main.tf Доставчикът Selectel се инициализира:

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

Този файл съдържа и стойността по подразбиране за SSH ключа, който ще бъде инсталиран на сървъра:

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

Ако е необходимо, можете да посочите различен публичен ключ. Ключът не трябва да бъде посочен като път към файл; можете също да добавите стойността като низ.

По-нататък в този файл се стартират модулите проект_с_потребител и сървър_локален_основен_диск, които управляват необходимите ресурси.

Нека разгледаме тези модули по-подробно.

Създаване на проект и потребител с роля

Първият модул създава проект и потребител с роля в този проект: terraform-examples/modules/vpc/project_with_user.

Създаденият потребител ще може да влезе в OpenStack и да управлява неговите ресурси. Модулът е прост и управлява само три обекта:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Създаване на виртуален сървър с локален диск

Вторият модул се занимава с управление на OpenStack обекти, които са необходими за създаване на сървър с локален диск.

Трябва да обърнете внимание на някои от аргументите, които са посочени в този модул за ресурса openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

аргумент ignore_changes ви позволява да игнорирате промените в атрибутите id за изображението, използвано за създаване на виртуалната машина. В услугата VPC повечето публични изображения се актуализират автоматично веднъж седмично и в същото време техните id също се променя. Това се дължи на особеностите на компонента OpenStack - Glance, в който изображенията се считат за неизменни обекти.

Ако създавате или модифицирате съществуващ сървър или диск, който има като аргумент image_id употребяван id публично изображение, след като това изображение бъде актуализирано, повторното стартиране на манифеста на Terraform ще пресъздаде сървъра или диска. Използване на аргумент ignore_changes ви позволява да избегнете подобна ситуация.

Забележка: аргумент ignore_changes се появи в Terraform доста отдавна: изтегляне#2525.

аргумент ignore_resize_confirmation необходими за успешно преоразмеряване на локален диск, ядра или сървърна памет. Такива промени се правят чрез компонента OpenStack Nova с помощта на заявка преоразмерите. Нова по подразбиране след заявка преоразмерите поставя сървъра в състояние verify_resize и чака допълнително потвърждение от потребителя. Това поведение обаче може да бъде променено, така че Nova да не чака допълнителни действия от потребителя.

Посоченият аргумент позволява на Terraform да не чака статуса verify_resize за сървъра и бъдете подготвени сървърът да бъде в активен статус след промяна на параметрите му. Аргументът е достъпен от версия 1.10.0 на доставчика OpenStack Terraform: изтегляне#422.

Създаване на ресурси

Преди да изпълните манифестите, имайте предвид, че в нашия пример се стартират два различни доставчика и доставчикът OpenStack зависи от ресурсите на доставчика Selectel, тъй като без създаване на потребител в проекта е невъзможно да се управляват обектите, принадлежащи към него . За съжаление, по същата причина не можем просто да изпълним командата прилагане на тераформа в нашия пример. Първо трябва да направим Приложи за модул проект_с_потребител и след това за всичко останало.

Забележка: Този проблем все още не е разрешен в Terraform, можете да проследите дискусията в Github на брой #2430 и брой #4149.

За да създадете ресурси, отидете в директорията terraform-examples/examples/vpc/server_local_root_disk, съдържанието му трябва да е така:

$ ls
README.md	   main.tf		vars.tf

Инициализираме модулите с помощта на командата:

$ terraform init

Резултатът показва, че Terraform изтегля най-новите версии на доставчиците, които използва, и проверява всички модули, описани в примера.

Първо нека приложим модула проект_с_потребител. Това изисква ръчно подаване на стойности за променливи, които не са зададени:

  • sel_account с номера на вашата сметка Selectel;
  • sel_token с вашия ключ за Selectel API;
  • потребителска_парола с парола за потребителя на OpenStack.

Стойностите за първите две променливи трябва да бъдат взети от контролни панели.

За последната променлива можете да измислите всяка парола.

За да използвате модула, трябва да замените стойностите SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD изпълнение на командата:

$ 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

След като изпълни командата, Terraform ще покаже какви ресурси иска да създаде и ще поиска потвърждение:

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

След като проектът, потребителят и ролята са създадени, можете да започнете да създавате останалите ресурси:

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

Когато създавате ресурси, обърнете внимание на изхода на Terraform с външния IP адрес, където ще бъде достъпен създаденият сървър:

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

Можете да работите със създадената виртуална машина чрез SSH, като използвате посочения IP.

Редактиране на ресурси

В допълнение към създаването на ресурси чрез Terraform, те също могат да бъдат модифицирани.

Например, нека увеличим броя на ядрата и паметта за нашия сървър, като променим стойностите на параметрите server_vcpus и server_ram_mb във файл 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

След това проверяваме до какви промени ще доведе това чрез следната команда:

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

В резултат на това Terraform направи промяна на ресурса openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Моля, имайте предвид, че това ще доведе до рестартиране на създадената виртуална машина.

За да приложите новата конфигурация на виртуална машина, използвайте командата прилагане на тераформа, който вече стартирахме по-рано.

Всички създадени обекти ще бъдат показани в VPC контролни панели:

Доставчик на Terraform Selectel

В нашата примерни хранилища Можете също да видите манифести за създаване на виртуални машини с мрежови устройства.

Пример за създаване на Kubernetes клъстер

Преди да преминем към следващия пример, ще изчистим ресурсите, които създадохме по-рано. За да направите това в корена на проекта terraform-examples/examples/vpc/server_local_root_disk Нека изпълним командата за изтриване на 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

След това изпълнете командата, за да изчистите 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

И в двата случая ще трябва да потвърдите изтриването на всички обекти:

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

Следният пример е в директорията terraform-examples/examples/vpc/kubernetes_cluster.

Този пример създава проект, потребител с роля в проекта и повдига един Kubernetes клъстер. Във файл vars.tf можете да видите стойности по подразбиране, като например броя на възлите, техните характеристики, версия на Kubernetes и др.

За да създадем ресурси, подобни на първия пример, първо ще започнем да инициализираме модули и да създаваме модулни ресурси проект_с_потребители след това създава всичко останало:

$ 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

Ще прехвърлим създаването и управлението на Kubernetes клъстери чрез компонента OpenStack Magnum. Можете да научите повече за това как да работите с клъстер в един от нашите предишни статии, както и в знание.

При подготовката на клъстера ще бъдат създадени дискове и виртуални машини и ще бъдат инсталирани всички необходими компоненти. Подготовката отнема около 4 минути, през което време Terraform ще показва съобщения като:

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

След като инсталацията приключи, Terraform ще покаже, че клъстерът е готов и ще покаже неговия 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.

За да управлявате създадения Kubernetes клъстер чрез помощната програма kubectl трябва да получите файла за достъп до клъстера. За да направите това, отидете на проекта, създаден чрез Terraform в списъка с проекти във вашия акаунт:

Доставчик на Terraform Selectel

След това следвайте връзката като xxxxxx.selvpc.ruкоето се появява под името на проекта:

Доставчик на Terraform Selectel

За информация за влизане използвайте потребителското име и паролата, които сте създали чрез Terraform. Ако не сте изневерявали vars.tf или main.tf за нашия пример потребителят ще има името tf_user. Трябва да използвате стойността на променливата като парола TF_VAR_user_password, който е зададен при стартиране прилагане на тераформа по-рано.

Вътре в проекта трябва да отидете в раздела Kubernetes:

Доставчик на Terraform Selectel

Това е мястото, където се намира клъстерът, създаден чрез Terraform. Изтегляне на файл за kubectl можете в раздела „Достъп“:

Доставчик на Terraform Selectel

Инструкциите за инсталиране се намират в същия раздел. kubectl и използване на изтеглените config.yaml.

След старта kubectl и настройка на променливата на средата KUBECONFIG можете да използвате 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

Броят на клъстерните възли може лесно да се променя чрез Terraform.
Във файла main.tf е посочена следната стойност:

cluster_node_count = "${var.cluster_node_count}"

Тази стойност се замества от vars.tf:

variable "cluster_node_count" {
default = 2
}

Можете да промените стойността по подразбиране в vars.tf, или посочете необходимата стойност директно в main.tf:

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

За да приложите промените, както в случая с първия пример, използвайте командата прилагане на тераформа:

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

Когато броят на възлите се промени, клъстерът ще остане достъпен. След като добавите възел чрез Terraform, можете да го използвате без допълнителна конфигурация:

$ 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

Заключение

В тази статия се запознахме с основните начини за работа „Виртуален частен облак“ чрез Terraform. Ще се радваме, ако използвате официалния доставчик на Selectel Terraform и предоставите обратна връзка.

Всички грешки, открити в доставчика на Selectel Terraform, могат да бъдат докладвани чрез Проблеми с Github.

Източник: www.habr.com

Добавяне на нов коментар