موفر Terraform Selectel

موفر Terraform Selectel

لقد أطلقنا مزود Terraform رسميًا للعمل مع Selectel. يتيح هذا المنتج للمستخدمين تنفيذ إدارة الموارد بشكل كامل من خلال منهجية البنية التحتية كرمز.

يدعم الموفر حاليًا إدارة موارد الخدمة "السحابة الخاصة الافتراضية" (يشار إليها فيما يلي باسم VPC). في المستقبل، نخطط لإضافة إدارة الموارد للخدمات الأخرى التي تقدمها Selectel.

كما تعلم بالفعل، فإن خدمة VPC مبنية على OpenStack. ومع ذلك، نظرًا لحقيقة أن OpenStack لا يوفر أدوات أصلية لخدمة السحابة العامة، فقد قمنا بتنفيذ الوظيفة المفقودة في مجموعة من واجهات برمجة التطبيقات الإضافية التي تعمل على تبسيط إدارة الكائنات المركبة المعقدة وتجعل العمل أكثر ملاءمة. بعض الوظائف المتوفرة في OpenStack مغلقة عن الاستخدام المباشر، ولكنها متاحة من خلال واجهة برمجة التطبيقات الخاصة بنا.

يتضمن موفر 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 يتم وصف كافة المعلمات التي سيتم استخدامها عند استدعاء الوحدات. بعضها لديه قيم افتراضية، على سبيل المثال، سيتم إنشاء الخادم في المنطقة رو-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 وإدارة موارده. الوحدة بسيطة وتدير ثلاثة كيانات فقط:

  • حدد_vpc_project_v2,
  • حدد_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
  }
}

حجة تجاهل_التغييرات يسمح لك بتجاهل تغييرات السمات id للصورة المستخدمة لإنشاء الجهاز الظاهري. في خدمة VPC، يتم تحديث معظم الصور العامة تلقائيًا مرة واحدة في الأسبوع وفي نفس الوقت يتم تحديثها id يتغير أيضا. ويرجع ذلك إلى خصوصيات مكون OpenStack - Glance، حيث تعتبر الصور كيانات غير قابلة للتغيير.

إذا كنت تقوم بإنشاء أو تعديل خادم أو قرص موجود كوسيطة معرّف_صورة تستخدم id العامة، وبعد تحديث تلك الصورة، سيؤدي تشغيل بيان Terraform مرة أخرى إلى إعادة إنشاء الخادم أو القرص. باستخدام حجة تجاهل_التغييرات يسمح لك بتجنب مثل هذا الموقف.

ملحوظة: حجة تجاهل_التغييرات ظهرت في Terraform منذ وقت طويل: سحب #2525.

حجة تجاهل_تغيير_الحجم_تأكيد اللازمة لتغيير حجم القرص المحلي أو النوى أو ذاكرة الخادم بنجاح. يتم إجراء مثل هذه التغييرات من خلال مكون OpenStack Nova باستخدام الطلب تغيير حجم. نوفا الافتراضي بعد الطلب تغيير حجم يضع الخادم في الحالة Verified_resize وينتظر تأكيدًا إضافيًا من المستخدم. ومع ذلك، يمكن تغيير هذا السلوك بحيث لا تنتظر Nova إجراءات إضافية من المستخدم.

تسمح الوسيطة المحددة لـ Terraform بعدم انتظار الحالة Verified_resize للخادم وكن مستعدًا ليكون الخادم في حالة نشطة بعد تغيير معلماته. الوسيطة متاحة من الإصدار 1.10.0 لموفر OpenStack Terraform: سحب #422.

إنشاء الموارد

قبل تشغيل البيانات، يرجى ملاحظة أنه في مثالنا، تم إطلاق موفرين مختلفين، ويعتمد موفر OpenStack على موارد موفر Selectel، لأنه بدون إنشاء مستخدم في المشروع، من المستحيل إدارة الكائنات التابعة له . ولسوء الحظ، لنفس السبب، لا يمكننا تشغيل الأمر فحسب تطبيق terraform داخل مثالنا. علينا أولا أن نفعل تطبيق للوحدة النمطية 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 في ملف أمثلة/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 وما إلى ذلك.

لإنشاء موارد مشابهة للمثال الأول، سنبدأ أولاً بتهيئة الوحدات وإنشاء موارد الوحدة 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 التي تم إنشاؤها من خلال الأداة المساعدة kubectl تحتاج إلى الحصول على ملف الوصول إلى الكتلة. للقيام بذلك، انتقل إلى المشروع الذي تم إنشاؤه من خلال Terraform في قائمة المشاريع الموجودة في حسابك:

موفر Terraform Selectel

بعد ذلك، اتبع الرابط مثل xxxxxx.selvpc.ruوالذي يظهر أسفل اسم المشروع:

موفر Terraform Selectel

للحصول على معلومات تسجيل الدخول، استخدم اسم المستخدم وكلمة المرور اللذين قمت بإنشائهما من خلال Terraform. إذا لم تكن قد خدعت vars.tf أو main.tf على سبيل المثال، سيكون لدى المستخدم الاسم tf_user. يجب عليك استخدام قيمة المتغير ككلمة المرور TF_VAR_user_password، والذي تم تحديده عند بدء التشغيل تطبيق terraform في وقت سابق.

داخل المشروع عليك الذهاب إلى علامة التبويب Kubernetes:

موفر Terraform Selectel

هذا هو المكان الذي توجد فيه المجموعة التي تم إنشاؤها عبر Terraform. تحميل الملف ل kubectl يمكنك في علامة التبويب "الوصول":

موفر Terraform Selectel

توجد تعليمات التثبيت في نفس علامة التبويب. kubectl واستخدام ما تم تنزيله الملف config.yaml.

بعد بدء تشغيل kubectl وتعيين متغير البيئة كوبيكونفيج يمكنك استخدام 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

اختتام

في هذه المقالة تعرفنا على الطرق الرئيسية للعمل بها "السحابة الخاصة الافتراضية" عبر تيرافورم. سنكون سعداء إذا استخدمت موفر Selectel Terraform الرسمي وقدمت تعليقاتك.

يمكن الإبلاغ عن أي أخطاء موجودة في موفر Selectel Terraform عبر قضايا جيثب.

المصدر: www.habr.com

إضافة تعليق