Terraform-провайдер в Selectel

Terraform-провайдер в Selectel

Ми запустили офіційний провайдер Terraform для роботи з Selectel. Цей продукт дозволяє користувачам повністю реалізувати керування ресурсами через методологію Infrastructure-as-code (інфраструктура як код).

На даний час провайдер підтримує управління ресурсами послуги. «Віртуальна приватна хмара» (Далі VPC). У майбутньому ми плануємо додати до нього управління ресурсами інших послуг, що надаються Selectel.

Як ви вже знаєте, послуга VPC побудована на базі OpenStack. Однак, через те, що OpenStack не надає нативних засобів для обслуговування публічної хмари, ми реалізували недостатню функціональність у наборі додаткових API, які спрощують керування складними складовими об'єктами та роблять роботу зручнішою. Частина функціональності, доступна в OpenStack, закрита від використання безпосередньо, але доступна через наш API.

У Terraform-провайдері Selectel зараз реалізована можливість керування наступними ресурсами VPC:

  • проекти та їх квоти;
  • користувачі, їх ролі та токени;
  • публічні підмережі, у тому числі крос-регіональні та VRRP;
  • ліцензії ПЗ.

Провайдер використовує нашу публічну Go-бібліотеку для роботи з API VPC. І бібліотека, і сам провайдер є open-source, їх розробка ведеться на Github:

Для керування іншими ресурсами хмари, такими як віртуальні машини, диски, кластери Kubernetes, можна використовувати Terraform-провайдер OpenStack. Офіційна документація для обох провайдерів доступна за такими посиланнями:

Початок роботи

Для початку роботи необхідно встановити Terraform (інструкції та посилання на інсталяційні пакети можна подивитися на офіційному сайті).

Для роботи провайдеру потрібен ключ Selectel API, який створюється в панелі керування для облікового запису.

Маніфести для роботи з Selectel створюються за допомогою Terraform або використовуючи набір готових прикладів, які доступні в нашому Github-репозиторії: terraform-examples.

Репозиторій із прикладами розбито на дві директорії:

  • Модулі, що містить невеликі модулі, що перевикористовуються, які приймають на вхід набір параметрів і управляють невеликим набором ресурсів;
  • Прикладимістить приклади повного набору пов'язаних між собою модулів.

Після встановлення 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")}"
}

За потреби можна вказати інший публічний ключ. Ключ не обов'язково вказувати як шлях до файлу, також можна додати значення у вигляді рядка.

Далі у цьому файлі запускаються модулі project_with_user и server_local_root_disk, які керують необхідними ресурсами.

Розберемо докладніше ці модулі.

Створення проекту та користувача за участю

Перший модуль створює проект і користувача з роллю у цьому проекті: 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 досить давно: pull#2525.

аргумент ignore_resize_confirmation необхідний успішного зміни розміру локального диска, ядер чи пам'яті сервера. Такі зміни здійснюються через компонент OpenStack Nova за допомогою запиту змінити розмір. За промовчанням Nova після запиту змінити розмір переводить сервер у статус verify_resize та чекає від користувача додаткового підтвердження. Однак цю поведінку можна змінити так, щоб компанія Nova не чекала від користувача додаткових дій.

Зазначений аргумент дозволяє Terraform не чекати статусу verify_resize для сервера та бути готовим до того, що сервер опиниться в активному статусі після зміни його параметрів. Аргумент доступний з версії 1.10.0 Terraform-провайдера OpenStack: pull#422.

Створення ресурсів

Перед запуском маніфестів слід врахувати, що в нашому прикладі запускаються два різні провайдери, причому провайдер OpenStack залежить від ресурсів провайдера Selectel, оскільки без створення користувача в проекті управляти об'єктами, що йому належать, неможливо. На жаль, з цієї причини ми не можемо просто запустити команду Терраформи застосовуються усередині нашого прикладу. Нам потрібно спочатку зробити застосовувати для модуля project_with_user і вже після цього для решти.

Примітка: зазначена проблема ще не вирішена в Terraform, за її обговоренням можна стежити на Github випуск №2430 и випуск №4149.

Для створення ресурсів перейдемо до директорії terraform-examples/examples/vpc/server_local_root_disk, її вміст має бути таким:

$ ls
README.md	   main.tf		vars.tf

Ініціалізуємо модулі за допомогою команди:

$ terraform init

У висновку видно, що Terraform завантажує останні версії провайдерів і перевіряє всі модулі, описані в прикладі.

Спочатку застосуємо модуль project_with_user. При цьому потрібно вручну передати значення для змінних, які не були встановлені:

  • sel_account з номером вашого облікового запису Selectel;
  • sel_token із вашим ключем для Selectel API;
  • user_password з паролем для користувача 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 та інше.

Для створення ресурсів аналогічно першому прикладу насамперед запустимо ініціалізацію модулів та створення ресурсів модуля project_with_user, а потім створення решти:

$ 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 повідомить, що кластер готовий і відобразить його ідентифікатор:

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 через утиліту кубектл потрібно отримати файл доступу до кластера. Для цього перейдіть до проекту, створеного через Terraform, у списку проектів вашого облікового запису:

Terraform-провайдер в Selectel

Далі перейдіть за посиланням виду xxxxxx.selvpc.ru, яка відображається нижче імені проекту:

Terraform-провайдер в Selectel

Як дані для входу використовуйте ім'я та пароль користувача, створені через Terraform. Якщо ви не зраджували vars.tf або main.tf для нашого прикладу, то користувач матиме ім'я tf_user. Як пароль потрібно використовувати значення змінної TF_VAR_user_password, яке було вказано під час запуску Терраформи застосовуються раніше.

Всередині проекту потрібно перейти на вкладку Кубернетес:

Terraform-провайдер в Selectel

Тут розташований кластер, створений через Terraform. Завантажити файл для кубектл можна на вкладці «Доступ»:

Terraform-провайдер в Selectel

На цій же вкладці знаходиться інструкція з встановлення кубектл та використання скачаного config.yaml.

після запуску кубектл та установки змінної оточення 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. Будемо раді, якщо ви скористаєтеся офіційним Terraform-провайдером Selectel і надаєте зворотній зв'язок.

Про всі знайдені баги Terraform-провайдера Selectel можна повідомити за допомогою Проблеми Github.

Джерело: habr.com

Додати коментар або відгук