Dostawca terraform Selectel

Dostawca terraform Selectel

Uruchomiliśmy oficjalnego dostawcę Terraform do współpracy z Selectel. Produkt ten umożliwia użytkownikom pełne wdrożenie zarządzania zasobami poprzez metodologię infrastruktury jako kodu.

Dostawca aktualnie wspiera zarządzanie zasobami usługi „Wirtualna chmura prywatna” (zwane dalej VPC). W przyszłości planujemy dodać zarządzanie zasobami dla innych usług świadczonych przez Selectel.

Jak już wiesz, usługa VPC zbudowana jest na OpenStack. Jednak w związku z tym, że OpenStack nie udostępnia natywnych narzędzi do obsługi chmury publicznej, brakującą funkcjonalność zaimplementowaliśmy w zestawie dodatkowych API, które upraszczają zarządzanie złożonymi obiektami złożonymi i czynią pracę wygodniejszą. Niektóre funkcje dostępne w OpenStack są niedostępne do bezpośredniego użycia, ale są dostępne za pośrednictwem w API.

Dostawca Selectel Terraform umożliwia teraz zarządzanie następującymi zasobami VPC:

  • projekty i ich kwoty;
  • użytkownicy, ich role i tokeny;
  • podsieci publiczne, w tym międzyregionalne i VRRP;
  • licencje na oprogramowanie.

Dostawca korzysta z naszej publicznej biblioteki Go do współpracy z API VPC. Zarówno biblioteka, jak i sam dostawca są open source, ich rozwój odbywa się na Githubie:

Do zarządzania innymi zasobami chmurowymi, takimi jak maszyny wirtualne, dyski, klastry Kubernetes, można skorzystać z dostawcy OpenStack Terraform. Oficjalna dokumentacja obu dostawców jest dostępna pod następującymi linkami:

Pierwsze kroki

Aby rozpocząć, musisz zainstalować Terraform (instrukcje i linki do pakietów instalacyjnych znajdziesz na stronie Oficjalna strona).

Do działania dostawca wymaga klucza API Selectel, który jest tworzony w panele kontrolne konta.

Manifesty do pracy z Selectelem tworzymy przy pomocy Terraforma lub z wykorzystaniem zestawu gotowych przykładów, które są dostępne w naszym repozytorium Github: przykłady terraform.

Repozytorium z przykładami podzielone jest na dwa katalogi:

  • Moduły, zawierający małe moduły wielokrotnego użytku, które pobierają zestaw parametrów jako dane wejściowe i zarządzają niewielkim zestawem zasobów;
  • przykłady, zawierający przykłady kompletnego zestawu wzajemnie połączonych modułów.

Po zainstalowaniu Terraforma, utworzeniu klucza API Selectel i zapoznaniu się z przykładami przejdźmy do przykładów praktycznych.

Przykład utworzenia serwera z dyskiem lokalnym

Spójrzmy na przykład tworzenia projektu, użytkownika z rolą i maszyny wirtualnej z dyskiem lokalnym: terraform-examples/examples/vpc/server_local_root_disk.

W pliku vars.tf opisano wszystkie parametry, które będą wykorzystywane podczas wywoływania modułów. Część z nich ma wartości domyślne, np. serwer zostanie utworzony w strefie ru-3a z następującą konfiguracją:

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

W pliku główna.tf Dostawca Selectel jest inicjowany:

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

Plik ten zawiera także domyślną wartość klucza SSH, który zostanie zainstalowany na serwerze:

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

Jeśli to konieczne, możesz określić inny klucz publiczny. Klucz nie musi być określony jako ścieżka pliku; możesz także dodać wartość jako ciąg znaków.

W dalszej części tego pliku uruchamiane są moduły projekt_z_użytkownikiem и serwer_lokalny_dysk_główny_serwera, które zarządzają niezbędnymi zasobami.

Przyjrzyjmy się tym modułom bardziej szczegółowo.

Tworzenie projektu i użytkownika z rolą

Pierwszy moduł tworzy projekt i użytkownika z rolą w tym projekcie: terraform-examples/modules/vpc/project_with_user.

Utworzony użytkownik będzie mógł zalogować się do OpenStack i zarządzać jego zasobami. Moduł jest prosty i zarządza tylko trzema podmiotami:

  • wybierz_vpc_project_v2,
  • wybierz_vpc_user_v2,
  • wybierz_vpc_role_v2.

Tworzenie serwera wirtualnego z dyskiem lokalnym

Drugi moduł dotyczy zarządzania obiektami OpenStack, które są niezbędne do utworzenia serwera z dyskiem lokalnym.

Należy zwrócić uwagę na niektóre argumenty określone w tym module dla zasobu openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argument ignorować_zmiany pozwala zignorować zmiany atrybutów id dla obrazu użytego do utworzenia maszyny wirtualnej. W usłudze VPC większość zdjęć publicznych jest aktualizowana automatycznie raz w tygodniu i jednocześnie ich id również się zmienia. Wynika to ze specyfiki komponentu OpenStack - Glance, w którym obrazy są uważane za niezmienne byty.

Jeśli tworzysz lub modyfikujesz istniejący serwer lub dysk, który ma jako argument identyfikator_obrazu używany id publiczny obraz, a po zaktualizowaniu tego obrazu ponowne uruchomienie manifestu Terraform spowoduje odtworzenie serwera lub dysku. Używanie argumentu ignorować_zmiany pozwala uniknąć takiej sytuacji.

Uwaga: argument ignorować_zmiany pojawił się w Terraformie dość dawno temu: pociągnij#2525.

argument ignorowanie_resize_confirmation potrzebne do pomyślnej zmiany rozmiaru dysku lokalnego, rdzeni lub pamięci serwera. Takie zmiany wprowadzane są poprzez komponent OpenStack Nova za pomocą żądania rozmiar. Domyślna Nova na żądanie rozmiar ustawia serwer w stan zweryfikować_zmianę rozmiaru i czeka na dodatkowe potwierdzenie od użytkownika. Można jednak to zachowanie zmienić tak, aby Nova nie czekała na dodatkowe działania ze strony użytkownika.

Podany argument pozwala Terraformowi nie czekać na status zweryfikować_zmianę rozmiaru dla serwera i bądź przygotowany na to, że serwer będzie w stanie aktywnym po zmianie jego parametrów. Argument jest dostępny od wersji 1.10.0 dostawcy OpenStack Terraform: pociągnij#422.

Tworzenie zasobów

Przed uruchomieniem manifestów należy zwrócić uwagę, że w naszym przykładzie uruchamianych jest dwóch różnych dostawców, a dostawca OpenStack jest zależny od zasobów dostawcy Selectel, gdyż bez utworzenia użytkownika w projekcie nie da się zarządzać należącymi do niego obiektami . Niestety z tego samego powodu nie możemy po prostu uruchomić polecenia zastosowanie ma terraform wewnątrz naszego przykładu. Najpierw musimy zrobić zastosować dla modułu projekt_z_użytkownikiem a potem na wszystko inne.

Uwaga: ten problem nie został jeszcze rozwiązany w Terraform. Możesz śledzić dyskusję na Githubie pod adresem numer 2430 и numer 4149.

Aby utworzyć zasoby, przejdź do katalogu terraform-examples/examples/vpc/server_local_root_disk, jego zawartość powinna wyglądać następująco:

$ ls
README.md	   main.tf		vars.tf

Inicjujemy moduły za pomocą polecenia:

$ terraform init

Dane wyjściowe pokazują, że Terraform pobiera najnowsze wersje dostawców, z których korzysta, i sprawdza wszystkie moduły opisane w przykładzie.

Najpierw zastosujmy moduł projekt_z_użytkownikiem. Wymaga to ręcznego przekazania wartości dla zmiennych, które nie zostały ustawione:

  • sel_konto z numerem konta Selectel;
  • sel_token z kluczem do Selectel API;
  • hasło użytkownika z hasłem dla użytkownika OpenStack.

Należy pobrać wartości pierwszych dwóch zmiennych panel kontrolny.

Dla ostatniej zmiennej możesz wymyślić dowolne hasło.

Aby skorzystać z modułu należy zastąpić wartości SEL_KONTO, SEL_TOKEN и HASŁO UŻYTKOWNIKA uruchomienie polecenia:

$ 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

Po uruchomieniu polecenia Terraform pokaże, jakie zasoby chce utworzyć i poprosi o potwierdzenie:

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

Po utworzeniu projektu, użytkownika i roli możesz rozpocząć tworzenie pozostałych zasobów:

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

Podczas tworzenia zasobów zwróć uwagę na wyjście Terraform z zewnętrznym adresem IP, pod którym będzie dostępny utworzony serwer:

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

Możesz pracować z utworzoną maszyną wirtualną poprzez SSH przy użyciu określonego adresu IP.

Edytowanie zasobów

Oprócz tworzenia zasobów poprzez Terraform, można je również modyfikować.

Przykładowo zwiększmy ilość rdzeni i pamięci dla naszego serwera zmieniając wartości parametrów serwer_vcpus и serwer_ram_mb w pliku przykłady/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

Następnie sprawdzamy, do jakich zmian to doprowadzi, za pomocą następującego polecenia:

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

W rezultacie Terraform dokonał zmiany zasobów openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Należy pamiętać, że będzie to wymagało ponownego uruchomienia utworzonej maszyny wirtualnej.

Aby zastosować nową konfigurację maszyny wirtualnej, użyj polecenia zastosowanie ma terraform, który uruchomiliśmy już wcześniej.

Wszystkie utworzone obiekty zostaną wyświetlone w Panele sterowania VPC:

Dostawca terraform Selectel

В нашем przykładowe repozytoria Możesz także zobaczyć manifesty do tworzenia maszyn wirtualnych z dyskami sieciowymi.

Przykład tworzenia klastra Kubernetes

Zanim przejdziemy do następnego przykładu, wyczyścimy zasoby, które utworzyliśmy wcześniej. Aby to zrobić w katalogu głównym projektu terraform-examples/examples/vpc/server_local_root_disk Uruchommy polecenie, aby usunąć obiekty 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

Następnie uruchom polecenie, aby wyczyścić obiekty API Selectel VPC:

$ 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

W obu przypadkach konieczne będzie potwierdzenie usunięcia wszystkich obiektów:

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

Poniższy przykład znajduje się w katalogu terraform-examples/examples/vpc/kubernetes_cluster.

Ten przykład tworzy projekt, użytkownika z rolą w projekcie i wywołuje jeden klaster Kubernetes. W pliku vars.tf możesz zobaczyć wartości domyślne, takie jak liczba węzłów, ich charakterystyka, wersja Kubernetesa itp.

Aby utworzyć zasoby podobnie jak w pierwszym przykładzie, najpierw zajmiemy się inicjowaniem modułów i tworzeniem zasobów modułów projekt_z_użytkownikiema następnie tworzenie wszystkiego innego:

$ 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

Przeniesiemy tworzenie i zarządzanie klastrami Kubernetes poprzez komponent OpenStack Magnum. Więcej o pracy z klastrem możesz dowiedzieć się w jednym z naszych poprzednie artykuły, jak również w baza wiedzy.

Podczas przygotowywania klastra zostaną utworzone dyski i maszyny wirtualne oraz zainstalowane zostaną wszystkie niezbędne komponenty. Przygotowanie trwa około 4 minut, w tym czasie Terraform wyświetli komunikaty typu:

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

Po zakończeniu instalacji Terraform wskaże, że klaster jest gotowy i wyświetli jego identyfikator:

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

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

Aby zarządzać utworzonym klastrem Kubernetes za pomocą narzędzia kubectl musisz uzyskać plik dostępu do klastra. Aby to zrobić, przejdź do projektu utworzonego za pomocą Terraform na liście projektów na swoim koncie:

Dostawca terraform Selectel

Następnie kliknij link jak xxxxxx.selvpc.ruktóry pojawia się pod nazwą projektu:

Dostawca terraform Selectel

Aby uzyskać dane logowania, użyj nazwy użytkownika i hasła utworzonego w Terraform. Jeśli nie oszukałeś vars.tf lub główna.tf w naszym przykładzie użytkownik będzie miał nazwę użytkownik tf. Jako hasła należy użyć wartości zmiennej TF_VAR_hasło_użytkownika, który został określony przy uruchomieniu zastosowanie ma terraform wcześniej.

Wewnątrz projektu musisz przejść do zakładki Kubernetes:

Dostawca terraform Selectel

Tutaj znajduje się klaster utworzony za pomocą Terraform. Pobierz plik dla kubectl możesz na karcie „Dostęp”:

Dostawca terraform Selectel

Instrukcje instalacji znajdują się na tej samej karcie. kubectl i korzystanie z pobranych konfiguracja.yaml.

Po odpaleniu kubectl i ustawienie zmiennej środowiskowej KUBECOFIG możesz użyć Kubernetesa:

$ 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

Liczbę węzłów klastra można łatwo zmienić za pomocą Terraform.
W pliku główna.tf określona jest następująca wartość:

cluster_node_count = "${var.cluster_node_count}"

Ta wartość jest zastępowana przez vars.tf:

variable "cluster_node_count" {
default = 2
}

Możesz zmienić wartość domyślną w vars.tflub określ wymaganą wartość bezpośrednio w główna.tf:

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

Aby zastosować zmiany, podobnie jak w przypadku pierwszego przykładu, użyj polecenia zastosowanie ma terraform:

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

Gdy liczba węzłów ulegnie zmianie, klaster pozostanie dostępny. Po dodaniu węzła poprzez Terraform można z niego korzystać bez dodatkowej konfiguracji:

$ 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

wniosek

W tym artykule zapoznaliśmy się z głównymi sposobami pracy „Wirtualna chmura prywatna” za pośrednictwem Terraformu. Będzie nam miło, jeśli skorzystasz z oficjalnego dostawcy Selectel Terraform i przekażesz nam swoją opinię.

Wszelkie błędy znalezione w dostawcy Selectel Terraform można zgłaszać za pośrednictwem Problemy z Githubem.

Źródło: www.habr.com

Dodaj komentarz