ارائه دهنده Terraform Selectel

ارائه دهنده Terraform Selectel

ما یک ارائه دهنده رسمی Terraform را برای کار با Selectel راه اندازی کرده ایم. این محصول به کاربران اجازه می دهد تا مدیریت منابع را به طور کامل از طریق متدولوژی زیرساخت به عنوان کد پیاده سازی کنند.

ارائه دهنده در حال حاضر از مدیریت منابع خدمات پشتیبانی می کند "ابر خصوصی مجازی" (از این پس VPC نامیده می شود). در آینده قصد داریم مدیریت منابع را برای سایر خدمات ارائه شده توسط Selectel اضافه کنیم.

همانطور که می دانید، سرویس VPC بر روی OpenStack ساخته شده است. با این حال، با توجه به این واقعیت که OpenStack ابزارهای بومی را برای خدمت به ابر عمومی ارائه نمی دهد، ما عملکرد گمشده را در مجموعه ای از API های اضافی پیاده سازی کردیم که مدیریت اشیاء ترکیبی پیچیده را ساده می کند و کار را راحت تر می کند. برخی از عملکردهای موجود در OpenStack با استفاده مستقیم بسته شده است، اما از طریق آن در دسترس است API ما.

ارائه دهنده Selectel Terraform اکنون توانایی مدیریت منابع VPC زیر را دارد:

  • پروژه ها و سهمیه آنها؛
  • کاربران، نقش ها و نشانه های آنها؛
  • زیرشبکه های عمومی، از جمله بین منطقه ای و VRRP.
  • مجوزهای نرم افزار

ارائه دهنده از کتابخانه عمومی Go ما برای کار با VPC API استفاده می کند. هم کتابخانه و هم خود ارائه دهنده منبع باز هستند، توسعه آنها در Github انجام می شود:

برای مدیریت سایر منابع ابری، مانند ماشین های مجازی، دیسک ها، خوشه های Kubernetes، می توانید از ارائه دهنده OpenStack Terraform استفاده کنید. اسناد رسمی برای هر دو ارائه دهنده در پیوندهای زیر موجود است:

شروع

برای شروع، باید Terraform را نصب کنید (دستورالعمل ها و پیوندهای بسته های نصب را می توانید در اینجا پیدا کنید سایت رسمی).

برای کارکرد، ارائه‌دهنده به یک کلید API Selectel نیاز دارد که در ایجاد شده است پنل های کنترل حساب.

مانیفست‌های کار با Selectel با استفاده از Terraform یا با استفاده از مجموعه‌ای از نمونه‌های آماده که در مخزن Github ما موجود است ایجاد می‌شوند: terraform- نمونه ها.

مخزن با نمونه ها به دو دایرکتوری تقسیم می شود:

  • ماژول ها، شامل ماژول های کوچک قابل استفاده مجدد است که مجموعه ای از پارامترها را به عنوان ورودی می گیرند و مجموعه کوچکی از منابع را مدیریت می کنند.
  • مثال ها، حاوی نمونه هایی از مجموعه کاملی از ماژول های به هم پیوسته است.

پس از نصب 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")}"
}

در صورت لزوم، می توانید کلید عمومی دیگری را تعیین کنید. لازم نیست کلید به عنوان یک مسیر فایل مشخص شود، همچنین می توانید مقدار را به عنوان یک رشته اضافه کنید.

در ادامه این فایل ماژول ها راه اندازی می شوند پروژه_با_کاربر и 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 ارائه دهنده OpenStack Terraform در دسترس است: pull#422.

ایجاد منابع

قبل از اجرای مانیفست‌ها، لطفاً توجه داشته باشید که در مثال ما، دو ارائه‌دهنده مختلف راه‌اندازی می‌شوند و ارائه‌دهنده OpenStack به منابع ارائه‌دهنده Selectel بستگی دارد، زیرا بدون ایجاد کاربر در پروژه، مدیریت اشیاء متعلق به آن غیرممکن است. . متأسفانه، به همین دلیل ما نمی توانیم فقط دستور را اجرا کنیم terraform اعمال شود داخل مثال ما ابتدا باید انجام دهیم درخواست برای ماژول پروژه_با_کاربر و بعد از آن برای هر چیز دیگری.

توجه: این مشکل هنوز در 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؛
  • 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"

با استفاده از IP مشخص شده می توانید از طریق SSH با ماشین مجازی ایجاد شده کار کنید.

ویرایش منابع

علاوه بر ایجاد منابع از طریق 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.

لطفاً توجه داشته باشید که این امر مستلزم راه اندازی مجدد ماشین مجازی ایجاد شده است.

برای اعمال پیکربندی جدید ماشین مجازی، از دستور استفاده کنید terraform اعمال شود، که قبلاً آن را راه اندازی کرده ایم.

تمام اشیاء ایجاد شده در نمایش داده می شوند کنترل پنل های 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 نشان می دهد که خوشه آماده است و شناسه آن را نمایش می دهد:

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 اعمال شود زودتر

در داخل پروژه باید به تب بروید کوبرنیتس:

ارائه دهنده 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

برای اعمال تغییرات، مانند مثال اول، از دستور استفاده کنید terraform اعمال شود:

$ 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 استفاده کنید و بازخورد خود را ارائه دهید، خوشحال خواهیم شد.

هر گونه اشکال یافت شده در ارائه دهنده Selectel Terraform می تواند از طریق گزارش شود مسائل Github.

منبع: www.habr.com

اضافه کردن نظر