Terraform موفر Selectel



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

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

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

يوفر موفر Selectel Terraform الآن القدرة على إدارة موارد VPC التالية:

  • المشاريع وحصصها ؛
  • المستخدمين ، أدوارهم ورموزهم ؛
  • الشبكات الفرعية العامة ، بما في ذلك المناطق الإقليمية و VRRP ؛
  • تراخيص البرمجيات.

يستخدم المزود مكتبة Go العامة الخاصة بنا للعمل مع واجهة برمجة تطبيقات VPC. كل من المكتبة والمزود نفسه مفتوح المصدر ، ويجري تطويرهما على جيثب:


لإدارة الموارد السحابية الأخرى ، مثل الأجهزة الظاهرية ، والأقراص ، ومجموعات Kubernetes ، يمكنك استخدام موفر OpenStack Terraform. الوثائق الرسمية لكلا مقدمي الخدمة متاحة على الروابط التالية:


الابتداء


للبدء ، تحتاج إلى تثبيت Terraform (يمكن العثور على تعليمات وروابط حزم التثبيت على الموقع الرسمي ).

للعمل ، يتطلب الموفر مفتاح Selectel API ، والذي يتم إنشاؤه في لوحة التحكم للحساب .

يتم إنشاء بيانات للعمل مع Selectel باستخدام Terraform أو باستخدام مجموعة من الأمثلة الجاهزة المتوفرة في مستودع Github الخاص بنا: أمثلة terraform .

يتم تقسيم مستودع التخزين بأمثلة إلى دليلين:

  • الوحدات النمطية ، التي تحتوي على وحدات صغيرة قابلة لإعادة الاستخدام تأخذ مجموعة من المعلمات كمدخلات وإدارة مجموعة صغيرة من الموارد ؛
  • أمثلة ، تحتوي على أمثلة لمجموعة كاملة من الوحدات المترابطة.

بعد تثبيت Terraform ، وإنشاء مفتاح Selectel API وتعريف نفسك بالأمثلة ، ننتقل إلى أمثلة عملية.

مثال على إنشاء خادم مع قرص محلي


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

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

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

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

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

خلق الموارد


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

ملاحظة: لم يتم حل هذه المشكلة بعد في Terraform ، يمكنك متابعة مناقشتها حول Github في العدد رقم 2430 والإصدار رقم 4149 .

لإنشاء موارد ، سننتقل إلى دليل terraform- أمثلة / أمثلة / 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: "" => "xxxx" 

يمكنك العمل مع الجهاز الظاهري الذي تم إنشاؤه عبر 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 application ، والذي سبق أن قمنا بتشغيله مسبقًا.

سيتم عرض جميع الكائنات التي تم إنشاؤها في لوحة التحكم VPC :



في مستودع المثال الخاص بنا ، يمكنك أيضًا مشاهدة بيانات حول إنشاء أجهزة افتراضية مع محركات أقراص الشبكة.

Kubernetes Cluster مثال


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

 $ 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- أمثلة / أمثلة / 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 في قائمة المشاريع في حسابك:



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



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

داخل المشروع ، تحتاج إلى الانتقال إلى علامة تبويب Kubernetes :



هنا مجموعة تم إنشاؤها من خلال Terraform. يمكنك تنزيل ملف kubectl في علامة التبويب "الوصول":



تحتوي علامة التبويب نفسها على إرشادات لتثبيت 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 

لتطبيق التغييرات ، كما في حالة المثال الأول ، استخدم الأمر terraform application :

 $ 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 

استنتاج


في هذه المقالة ، تعلمنا عن الطرق الأساسية للعمل مع "Virtual Private Cloud" من خلال Terraform. سنكون سعداء إذا كنت تستخدم مزود Terraform الرسمي Selectel وتقديم ملاحظات.

يمكن الإبلاغ عن جميع الأخطاء التي تم العثور عليها لموفر Terraform Selectel من خلال مشكلات Github .

Source: https://habr.com/ru/post/ar445162/


All Articles