اختار المؤلف مؤسسة ويكيميديا لتلقي تبرع كجزء من برنامج كتابة من أجل التبرعات.
المقدمة
البنية ككود (IaC) هي ممارسة لتتميم نشر البنية التحتية وتعديلاتها عن طريق تعريف حالات الموارد وعلاقاتها في الكود. تنفيذ ذلك الكود ينشئ أو يعدل الموارد الفعلية في السحابة. تسمح IaC للمهندسين باستخدام أداة IaC مثل تيرافورم (من هاشيكورب) لتوفير البنية التحتية.
مع IaC، يمكن للتغييرات في بنيتك التحتية المرور بنفس عملية مراجعة الكود كما يحدث مع كود التطبيق الخاص بك. يمكنك تخزين الكود في التحكم بالنسخ (مثل جيت) للحفاظ على تاريخ حالة بنيتك التحتية، ويمكنك أيضًا توتير عملية النشر بشكل أوتوماتيكي بشكل أكبر باستخدام أدوات ذات مستوى أعلى مثل منصة تطويرية داخلية خدمية (IDP).
تيرافورم هو أداة معروفة للبنية كـ رمزية مستقلة عن المنصة بسبب دعمه الواسع للعديد من المنصات، بما في ذلك جيت هاب، كلاود فلير، و ديجيتال أوشن. يتم كتابة معظم تكوينات تيرافورم باستخدام لغة إعلانية تسمى لغة تكوين هاشيكورب (HCL).
أداة تطوير السحابة لتيرافورم (CDKTF) هي أداة مبنية على تيرافورم تتيح لك تعريف البنية التحتية باستخدام لغة برمجة مألوفة (مثل تايب سكربت، بايثون، أو جو) بدلاً من HCL. يمكن لهذه الأداة توفير منحنى تعلم أقل للمطورين الذين غير معرفين بـ HCL، بينما تسمح للمطورين باستخدام ميزات البرمجة الأصلية مثل الحلقات، والمتغيرات، والدوال.
في هذا البرنامج التعليمي، ستبدأ بتثبيت أداة واجهة سطر الأوامر (CLI) cdktf
. ثم، ستقوم بكتابة مشروع CDKTF بلغة تايب سكربت وتعريف المشروع بخادمين NGINX يتم توازن حملهما بواسطة موازن الحمل. ستستخدم بعد ذلك cdktf
لنشر البنية التحتية. في نهاية هذا البرنامج التعليمي، ستكون لديك مشروع CDKTF يمكنك من خلاله بناء لتوسيع البنية التحتية الخاصة بك.
ملاحظة: تم اختبار هذا البرنامج التعليمي مع CDKTF 0.11.2
و Terraform 1.2.2
.
الشروط المسبقة
لإكمال هذا البرنامج التعليمي، ستحتاج إلى:
- A good understanding of Infrastructure-as-Code (IaC). You can learn about IaC in Infrastructure as Code Explained.
- A DigitalOcean account. If you do not have one, sign up for a new account.
- A DigitalOcean Personal Access Token, which you can create via the DigitalOcean console. Instructions on how to do that can be found at How to Generate a Personal Access Token.
- A password-less SSH key added to your DigitalOcean account. You can add that by following How To Use SSH Keys with DigitalOcean Droplets. When you add the key to your account, remember the name you give it, as you will need it in this tutorial. For CDKTF to accept the name of your key, it must start with a letter or underscore and may contain only letters, digits, underscores, and dashes.
- تثبيت Terraform على جهازك المحلي، يمكنك القيام بذلك باستخدام “الخطوة 1 – تثبيت Terraform” في كيفية استخدام Terraform مع DigitalOcean.
- تثبيت Node.js على جهازك المحلي. يمكنك العثور على التعليمات لذلك في سلسلة كيفية تثبيت Node.js وإنشاء بيئة تطوير محلية.
- أن تكون مرتاحًا ببرمجة JavaScript. لبناء مهاراتك، تحقق من سلسلة كيفية البرمجة بلغة JavaScript.
- أن تكون مرتاحًا باستخدام الميزات الأساسية لـ TypeScript. إذا لم تكن مرتاحًا مع TypeScript، فإن سلسلة البرنامج التعليمي كيفية البرمجة بلغة TypeScript هي مصدر جيد لمساعدتك في الوصول إلى سرعة الإتقان.
- A code editor or integrated development environment (IDE) that supports TypeScript. If you are not currently using one, try Visual Studio Code. You can also read up on How To Work With TypeScript in Visual Studio Code.
الخطوة 1 — تثبيت أداة سطر الأوامر cdktf
للبدء، ستقوم بتثبيت أداة سطر الأوامر cdktf
.
تتوفر أداة سطر الأوامر cdktf
كحزمة NPM. إذا قمت بالبحث عن cdktf
على npmjs.com، ستجد حزمتين بأسماء مماثلة: cdktf
و cdktf-cli
.
من الناحية المفاهيمية، يُعتبر CDKTF طبقة تجريدية في الأعلى من Terraform. يتكون من جزئين:
-
مكتبة تحتوي على مجموعة من البنى الأساسية الخاصة بلغة البرمجة (مثل الدوال والكلاسات) لتحديد البنية التحتية. يتم تجميع هذا الجزء ضمن حزمة npm
cdktf
. على سبيل المثال، يمكنك رؤية استخدام كلا من الكلاساتApp
وTerraformStack
من حزمةcdktf
في المشروع النموذجي لـ CDKTF التالي: -
محول يحلل الهياكل داخل مشروع CDKTF ويقللها إلى مجموعة من مستندات JSON، التي يتم بعد ذلك استيعابها في Terraform بنفس الطريقة التي يتم بها استيعاب HCL. يتم تجميع هذا المحول في أداة سطر الأوامر تسمى
cdktf
، المقدمة من حزمةcdktf-cli
.
لتثبيت أداة سطر الأوامر cdktf
، تحتاج إلى حزمة cdktf-cli
. يمكنك تثبيت هذه الحزمة بشكل عام باستخدام npm
، yarn
، أو أي مدير حزم تفضله.
لتثبيت cdktf-cli
باستخدام npm
، قم بتشغيل الأمر التالي:
ملاحظة: من المحتمل أن تكون هناك نسخة أحدث من حزمة cdktf-cli
بعد نشر هذه المقالة. يمكنك محاولة اتباع البرنامج التعليمي بالنسخة الأحدث عبر تشغيل npm install --global cdktf-cli@latest
بدلاً من ذلك، ولكن يجب أن تكون على علم بأن بعض النواتج قد تختلف قليلاً.
بدلاً من ذلك، يمكنك استخدام Homebrew على macOS أو Linux لتثبيت أداة سطر الأوامر cdktf
كصيغة cdktf
:
للتحقق من نجاح التثبيت، قم بتشغيل الأمر cdktf
بدون معاملات:
ستشاهد مخرجات مشابهة لما يلي:
OutputPlease pass a command to cdktf, here are all available ones:
cdktf
Commands:
cdktf init Create a new cdktf project from a template.
cdktf get Generate CDK Constructs for Terraform providers and modules.
cdktf convert Converts a single file of HCL configuration to CDK for Terraform.
cdktf deploy [stacks...] Deploy the given stacks
cdktf destroy [stacks..] Destroy the given stacks
cdktf diff [stack] Perform a diff (terraform plan) for the given stack
cdktf list List stacks in app.
cdktf login Retrieves an API token to connect to Terraform Cloud.
cdktf synth Synthesizes Terraform code for the given app in a directory.
cdktf watch [stacks..] [experimental] Watch for file changes and automatically trigger a deploy
cdktf output [stacks..] Prints the output of stacks
cdktf debug Get debug information about the current project and environment
cdktf completion generate completion script
Options:
--version عرض رقم الإصدار
--disable-logging عدم كتابة ملفات السجل. مدعوم باستخدام بيئة CDKTF_DISABLE_LOGGING.
--disable-plugin-cache-env عدم تعيين مسار TF_PLUGIN_CACHE_DIR تلقائيًا.
--log-level مستوى السجل الذي يجب كتابته.
-h, --help Show help
Options can be specified via environment variables with the "CDKTF_" prefix (e.g. "CDKTF_OUTPUT")
تُظهر المخرجات الأوامر المتاحة لك. في بقية هذا البرنامج التعليمي، ستكتسب خبرة في استخدام cdktf init
، cdktf get
، cdktf deploy
، و cdktf destroy
.
الآن بعد تثبيت أداة السطر الأمرية cdktf
، يمكنك تحديد البنية التحتية من خلال كتابة بعض الشفرة TypeScript.
الخطوة 2 — إنشاء مشروع جديد لـ CDKTF
في هذه الخطوة، ستستخدم أداة سطر الأوامر cdktf
التي قمت للتو بتثبيتها لإنشاء مشروع أساسي لـ CDKTF، الذي ستبني عليه في الخطوات التالية.
أنشئ دليلًا سيستضيف مشروع CDKTF من خلال تشغيل الأمر التالي:
ثم، انتقل إلى الدليل الجديد الذي تم إنشاؤه:
استخدم الأمر cdktf init
لإنشاء هيكل مشروع CDKTF ستبني عليه:
يسمح CDKTF للمطورين بتحديد البنية التحتية باستخدام TypeScript، Python، Java، C#، أو Go. الخيار --template=typescript
يخبر cdktf
بتوليد مشروع CDKTF هذا باستخدام TypeScript.
تتتبع Terraform (وبالتالي CDKTF) الموارد التي تديرها عن طريق تسجيل تعريفاتها وحالاتها في ملفات تُسمى ملفات Terraform state. الخيار --local
يخبر CDKTF بالاحتفاظ بهذه الملفات الحالية محليًا على الجهاز الذي يعمل عليه cdktf
(يتبع كل ملف الهيكل التسمية terraform.<stack>.tfstate
).
بعد تشغيل الأمر، قد يطلب منك واجهة سطر الأوامر الإذن بإرسال تقارير الأعطال إلى فريق CDKTF لمساعدتهم في تحسين المنتج:
Output? Do you want to send crash reports to the CDKTF team? See https://www.terraform.io/cdktf/create-and-deploy/configuration-file for
more information (Y/n)
اكتب Y
إذا كنت ترغب في الموافقة أو N
إذا كنت غير موافق، ثم اضغط ENTER
.
سيقوم cdktf
بإنشاء هيكل المشروع وتثبيت الحزم. عندما يتم توليد المشروع، سترى إخراجًا مماثلًا للتالي:
Output Your cdktf typescript project is ready!
cat help Print this message
Compile:
npm run get Import/update Terraform providers and modules (you should check-in this directory)
npm run compile Compile typescript code to javascript (or "npm run watch")
npm run watch Watch for changes and compile typescript in the background
npm run build Compile typescript
Synthesize:
cdktf synth [stack] Synthesize Terraform resources from stacks to cdktf.out/ (ready for 'terraform apply')
Diff:
cdktf diff [stack] Perform a diff (terraform plan) for the given stack
Deploy:
cdktf deploy [stack] Deploy the given stack
Destroy:
cdktf destroy [stack] Destroy the stack
Test:
npm run test Runs unit tests (edit __tests__/main-test.ts to add your own tests)
npm run test:watch Watches the tests and reruns them on change
Upgrades:
npm run upgrade Upgrade cdktf modules to latest version
npm run upgrade:next Upgrade cdktf modules to latest "@next" version (last commit)
سترى أيضًا بعض الملفات الجديدة المضافة إلى الدليل infra
. أهم هذه الملفات هي cdktf.json
و main.ts
.
cdktf.json
هو ملف التكوين لمشروع CDKTF. إذا قمت بفتح الملف، سترى شيئًا مشابهًا للتالي:
تحدد خاصية app
الأمر الذي سيتم تشغيله لتخليص الكود TypeScript إلى JSON متوافق مع Terraform. تشير هذه الخاصية إلى أن main.ts
هو نقطة البداية لمشروع CDKTF.
إذا فتحت ملف main.ts
، سترى شيئًا مشابهًا لما يلي:
في لغة CDKTF، يمكن تجميع مجموعة من الموارد البنية التحتية ذات الصلة في مكدس. على سبيل المثال، يمكن تجميع الموارد التي تشكل تطبيق API، مثل Droplets وموازنات الحمل وسجلات DNS، في مكدس واحد يسمى APIStack
. يحتفظ كل مكدس بحالته الخاصة ويمكن نشره أو تعديله أو تدميره بشكل مستقل عن غيره من المكدسات. استخدام شائع للمكدسات هو وجود مكدس واحد للإنتاج ومكدس منفصل للتطوير.
تطبيق هو حاوية لعدة مكدسات. على سبيل المثال، يمكن لتطبيق تجميع مكدسات متعددة للخدمات الميكروية.
يحتوي هيكل المشروع CDKTF المولد في main.ts
على فئة مكدس واحدة تسمى MyStack
، تعرف حاليًا لا تحتوي على موارد. يتم إنشاء مثيل من MyStack
بالاسم infra
، موجود ضمن تطبيق يسمى app
. في الخطوات التالية، ستقوم بتعريف موارد البنية التحتية داخل مكدس MyStack
المنشئ.
بعد إنشاء المشروع، الخطوة التالية هي تكوين مشروع CDKTF باستخدام موفرات.
الخطوة 3 — تثبيت موفر DigitalOcean
في هذه الخطوة، ستقوم بتثبيت موفر DigitalOcean في مشروع CDKTF.
الموفرين هي مكتبات توفر تعليمات لـ Terraform (التي يستخدمها cdktf
تحت الغطاء) حول كيفية إنشاء وتحديث وحذف الموارد على مزودي الخدمة السحابية ومزودي الخدمة البرمجية السحابية وغيرها من المنصات التي تكشف عن واجهات برمجة تطبيقات (APIs). يقوم الموفرين بتجميع منطق استدعاء هذه الAPIs الخارجية في وظائف قياسية يمكن لـ Terraform استدعاؤها.
على سبيل المثال، إذا كنت ستقوم بإنشاء Droplet جديد على DigitalOcean بدون Terraform، فستضطر إلى إرسال طلب POST
إلى نقطة النهاية /v2/droplets
في API DigitalOcean. بـ Terraform، بدلاً من ذلك، يمكنك تثبيت موفر DigitalOcean وتعريف مورد digitalocean_droplet
، مشابه لمقطع الكود العيني التالي:
بعد ذلك، يمكنك استخدام أداة cdktf
CLI لترجمة هذا الكود TypeScript إلى JSON متوافق مع Terraform وتمريره إلى الموفر الذي سيقوم بإجراء الاتصالات اللازمة بواسطة الAPI لإنشاء Droplet نيابة عنك.
الآن بعد أن فهمت ما هو الموفر، يمكنك إعداد موفر DigitalOcean لمشروعك CDKTF.
افتح ملف cdktf.json
وأضف السلسلة digitalocean/digitalocean
إلى مصفوفة terraformProviders
:
digitalocean/digitalocean
هو المعرف لموفر DigitalOcean على مسجل Terraform.
احفظ وأغلق الملف.
بعد ذلك، قم بتشغيل cdktf get
لتنزيل وتثبيت الموفر.
cdktf get
سيقوم بتنزيل الموفر، واستخراج البنية، وتوليد الفئات TypeScript المقابلة، وإضافته كوحدة TypeScript تحت .gen/providers/
. هذا التوليد التلقائي للكود يمكنك من استخدام أي موفرات Terraform ووحدات HCL مع CDKTF، وهو كيف يمكن لـ CDKTF توفير الإكمال التلقائي للكود في المحررات التي تدعمه.
عندما ينتهي cdktf get
من التشغيل، سترى مخرجات مشابهة للتالي:
OutputGenerated typescript constructs in the output directory: .gen
سوف ترى أيضًا دليلاً جديدًا يسمى .gen
يحتوي على الكود المولد للموفر.
في هذه الخطوة، قمت بتثبيت موفر digitalocean/digitalocean
في المشروع. في الخطوة التالية، ستقوم بتكوين موفر DigitalOcean بالبيانات المصدقة المطلوبة للمصادقة على واجهة برمجة التطبيقات (API) الخاصة بـ DigitalOcean.
الخطوة 4 — تكوين موفر DigitalOcean
في هذه الخطوة، ستقوم بتكوين مزود DigitalOcean باستخدام رمز الوصول الشخصي الخاص بك في DigitalOcean، مما يتيح للمزود استدعاء واجهة برمجة التطبيقات الخاصة بـ DigitalOcean نيابةً عنك.
تتطلب مزودات مختلفة وتدعم أوراق اعتماد مختلفة للتوثيق مع واجهة برمجة التطبيقات الرئيسية. بالنسبة لمزود DigitalOcean، تحتاج إلى توفير رمز الوصول الشخصي الخاص بك في DigitalOcean. يمكنك تحديد الرمز للمزود عن طريق تعيينه كمتغير بيئي DIGITALOCEAN_TOKEN
أو DIGITALOCEAN_ACCESS_TOKEN
.
قم بتشغيل الأمر التالي في الطرفية الخاصة بك لتعيين متغير البيئة لجلسة الطرفية ذلك.
ملاحظة: من خلال استدعاء export
، فإنك تقوم بتعيين المتغير البيئي فقط لجلسة الطرفية تلك. إذا أغلقت الطرفية وأعدت فتحها أو قمت بتشغيل أوامر cdktf
في طرفية مختلفة، فستحتاج إلى تشغيل الأمر export
مرة أخرى لتفعيل المتغير البيئي.
بعد ذلك، ستقوم بتحديد المزود ضمن فئة MyStack
، مما سيتيح لك تحديد الموارد المقدمة من قبل المزود في كومة الخاصة بك. قم بتحديث ملف main.ts
إلى ما يلي:
الوحدة النمطية للمزود تقع في ./.gen/providers/digitalocean
، والتي تم إنشاؤها تلقائيًا عند تشغيل cdktf get
.
قمت بتكوين مزود digitalocean/digitalocean
بالاعتمادات في هذه الخطوة. في الخطوة التالية، ستبدأ في تعريف البنية التحتية التي تشكل جزءًا من هدف هذا البرنامج التعليمي.
الخطوة 5 — تعريف تطبيقات الويب على الدروبليتس
في هذه الخطوة، ستقوم بتعريف خادمين NGINX، يخدم كل منهما ملفات مختلفة، والمنتشرة على دروبليتس Ubuntu 20.04 متطابقة.
تبدأ بتعريف الدروبليتس الاثنين. قم بتعديل main.ts
بالتغييرات المظللة:
تستخدم حلقة JavaScript الأصلية (Array.prototype.map()
) لتجنب التكرار في الكود.
تمامًا كما لو كنت تقوم بإنشاء الدروبليت عبر وحدة التحكم، هناك عدة معلمات يجب تحديدها:
image
– توزيع Linux والإصدار الذي سيعمل عليه الدروبليت.region
– مركز البيانات الذي سيعمل فيه الدروبليت.size
– كمية موارد وحدة المعالجة المركزية والذاكرة لحجزها للدروبليت.name
– اسم فريد يستخدم للإشارة إلى الدروبليت.
القيم لـ الصورة
, المنطقة
, و الحجم
يجب أن تكون أشياء تدعمها DigitalOcean. يمكنك العثور على القيم الصحيحة (التي تسمى الشظايا) لجميع صور توزيع Linux المدعومة، وأحجام Droplet، والمناطق على صفحة DigitalOcean API Slugs. يمكنك العثور على قائمة كاملة من السمات المطلوبة والاختيارية على صفحة توثيق digitalocean_droplet
.
إضافة مفتاح SSH
كجزء من المتطلبات الأساسية، قمت بتحميل مفتاح SSH العام بدون كلمة مرور إلى حسابك في DigitalOcean ولاحظت اسمه. ستستخدم الآن ذلك الاسم لاسترجاع معرف مفتاح SSH وتمريره إلى تعريف Droplet الخاص بك.
نظرًا لأن مفتاح SSH تم إضافته يدويًا إلى حسابك في DigitalOcean، فإنه ليس موردًا يتم إدارته بواسطة تكوين Terraform الحالي الخاص بك. إذا حاولت تحديد مورد جديد لـ digitalocean_ssh_key
، فسينشئ مفتاح SSH جديدًا بدلاً من استخدام القائم بالفعل.
بدلاً من ذلك، ستقوم بتعريف مصدر بيانات جديد digitalocean_ssh_key
. في تيرا فورم، يُستخدم مصادر البيانات لاسترجاع معلومات حول البنية التحتية التي لا تتم إدارتها بواسطة تكوين تيرا فورم الحالي. بعبارة أخرى، يوفرون عرضًا للقراءة فقط عن حالة البنية التحتية الخارجية القائمة مسبقًا. بمجرد تعريف مصدر بيانات، يمكنك استخدام البيانات في أماكن أخرى في تكوين تيرا فورم الخاص بك.
لا يزال في main.ts
وداخل مُنشئ MyStack
، قم بتعريف مصدر بيانات DataDigitaloceanSshKey
جديد، وقم بتمرير الاسم الذي منحته لمفتاح SSH الخاص بك (هنا، الاسم هو do_cdktf
):
ثم، قم بتحديث تعريف Droplet ليتضمن مفتاح SSH:
عند التوفيق، يمكنك الوصول إلى Droplet باستخدام مفتاح SSH الخاص بك بدلاً من كلمة المرور.
تحديد سكربت بيانات المستخدم لتثبيت NGINX
لقد قمت الآن بتعريف Droplets متطابقة تعمل بنظام Ubuntu، مُكونة مع وصول SSH. المهمة التالية هي تثبيت NGINX على كل Droplet.
عند إنشاء Droplet ، سيقوم أداة تسمى CloudInit ببدء تشغيل الخادم. يمكن لـ CloudInit قبول ملف يسمى بيانات المستخدم، والذي يمكنه تعديل كيفية بدء تشغيل الخادم. يمكن أن تكون بيانات المستخدم أي ملفات cloud-config
أو نصوص يمكن للخادم تفسيرها، مثل نصوص Bash.
في بقية هذه الخطوة، ستقوم بإنشاء نص Bash وتحديده كـ بيانات مستخدم لـ Droplet. سيقوم النص بتثبيت NGINX كجزء من عملية البدء. بالإضافة إلى ذلك، سيقوم النص أيضًا بتعويض محتويات ملف /var/www/html/index.html
(الملف الافتراضي الذي يخدمه NGINX) بمضيف الاسم وعنوان IP للـ Droplet، مما سيؤدي إلى خدمة ملفين مختلفين من قبل الخادمين NGINX. في الخطوة التالية، ستضع كل من هذين الخادمين NGINX وراء موزع حملة؛ من خلال خدمة ملفات مختلفة، ستظهر ما إذا كان الموزع يوزع الطلبات بشكل صحيح أم لا.
لا يزال في main.ts
، أضف خاصية userData
جديدة إلى كائن تكوين Droplet:
تحذير: تأكد من عدم وجود أسطر جديدة قبل الشيبانغ (#!
)؛ وإلا فقد لا يتم تنفيذ النص.
عند توفير قطرة الماء لأول مرة، سيتم تشغيل النص كمستخدم root
. سيستخدم مدير الحزم في أوبونتو، APT، لتثبيت حزمة nginx
. سيستخدم بعد ذلك خدمة البيانات الوصفية لديجيتالأوشن لاسترداد معلومات حول نفسه، وكتابة اسم المضيف وعنوان الآي بي في index.html
، الذي يتم تقديمه بواسطة NGINX.
في هذه الخطوة، قمت بتعريف قطرتين تعملان بنظام أوبونتو، وقمت بتكوين كل منهما بوصول SSH، وقمت بتثبيت NGINX باستخدام ميزة بيانات المستخدم. في الخطوة التالية، ستقوم بتعريف موازن الحمل الذي سيقف أمام هذه الخوادم NGINX وتكوينه للتوازن في الشكل الدائري.
الخطوة 6 — تعريف موازن الحمل
في هذه الخطوة، ستقوم بتعريف موازن حمل DigitalOcean عن طريق تعريف نموذج للمورد digitalocean_loadbalancer
.
ما زلت في main.ts
، أضف التعريف التالي لموازن الحمل في نهاية مُنشئ MyStack
:
الوسيطة forwardingRule
تخبر محمّل التحميل بالاستماع إلى طلبات HTTP على المنفذ 80
وتوجيهها إلى كلٍّ من الـ Droplets على المنفذ 80
.
الـdropletIds
تحدد الـ Droplets التي سيمررها محمل التحميل الطلبات إليها. يأخذ رقمًا، ولكن قيمة droplet.id
هي سلسلة نصية. لذلك، قمت باستخدام Fn.tonumber
دالة Terraform لتحويل قيمة معرف Droplet من سلسلة نصية إلى رقم.
ملاحظة: لقد استخدمت Fn.tonumber
دالة Terraform هنا بدلاً من الدالة الأصلية في JavaScript parseInt
لأن قيمة droplet.id
غير معروفة حتى يتم توفير Droplet. الدوال في Terraform مصممة للعمل على القيم غير المعروفة أثناء التشغيل قبل تطبيق Terraform على التكوين.
احفظ وأغلق الملف.
لقد قمت الآن بتعريف Droplets اثنين ومحمل تحميل يجلس أمامهما. يجب أن يبدو ملفك main.ts
مشابهًا لهذا:
في الخطوة التالية، ستستخدم أداة CLI cdktf
لتفعيل مشروع CDKTF الخاص بك بالكامل.
الخطوة 7 — توفير بنية البنية التحتية الخاصة بك
في هذه الخطوة، ستستخدم أداة cdktf
CLI لتوفير Droplets وموازين الحمل التي قمت بتعريفها في الخطوات السابقة.
تأكد من أنك في الدليل infra/
وقد قمت بتعيين متغير البيئة DIGITALOCEAN_ACCESS_TOKEN
لجلسة الطرفية الخاصة بك، ثم قم بتشغيل الأمر cdktf deploy
:
يجب أن ترى نتائج مشابهة للتالي:
Outputinfra Initializing the backend...
infra Initializing provider plugins...
infra - Reusing previous version of digitalocean/digitalocean from the dependency lock file
infra - Using previously-installed digitalocean/digitalocean v2.19.0
infra Terraform has been successfully initialized!
infra Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
infra # digitalocean_droplet.bar (bar) will be created
+ resource "digitalocean_droplet" "bar" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "ubuntu-20-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "bar"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "lon1"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "34377800",
]
+ status = (known after apply)
+ urn = (known after apply)
+ user_data = "f9b1d9796d069fe504ce0d89439b6b664b14b1a1"
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}
# digitalocean_droplet.foo (foo) سيتم إنشاؤه
+ resource "digitalocean_droplet" "foo" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "ubuntu-20-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "foo"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "lon1"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "34377800",
]
+ status = (known after apply)
+ urn = (known after apply)
+ user_data = "f9b1d9796d069fe504ce0d89439b6b664b14b1a1"
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}
# digitalocean_loadbalancer.lb (lb) سيتم إنشاؤه
+ resource "digitalocean_loadbalancer" "lb" {
+ algorithm = "round_robin"
+ disable_lets_encrypt_dns_records = false
+ droplet_ids = (known after apply)
+ enable_backend_keepalive = false
+ enable_proxy_protocol = false
+ id = (known after apply)
+ ip = (known after apply)
+ name = "default"
+ redirect_http_to_https = false
+ region = "lon1"
+ size_unit = (known after apply)
+ status = (known after apply)
+ urn = (known after apply)
+ vpc_uuid = (known after apply)
+ forwarding_rule {
+ certificate_id = (known after apply)
+ certificate_name = (known after apply)
+ entry_port = 80
+ entry_protocol = "http"
+ target_port = 80
+ target_protocol = "http"
+ tls_passthrough = false
}
+ healthcheck {
+ check_interval_seconds = (known after apply)
+ healthy_threshold = (known after apply)
+ path = (known after apply)
+ port = (known after apply)
+ protocol = (known after apply)
+ response_timeout_seconds = (known after apply)
+ unhealthy_threshold = (known after apply)
}
+ sticky_sessions {
+ cookie_name = (known after apply)
+ cookie_ttl_seconds = (known after apply)
+ type = (known after apply)
}
}
Plan: 3 to add, 0 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────
Saved the plan to: plan
To perform exactly these actions, run the following command to apply:
terraform apply "plan"
Please review the diff output above for infra
❯ Approve Applies the changes outlined in the plan.
Dismiss
Stop
ملاحظة: لا يزال CDKTF قيد التطوير، وقد تختلف النتيجة عن تلك المُعرَضة أعلاه.
تُظهر هذه العرض كافة الموارد والخصائص التي يخطط cdktf
لإنشائها، تحديثها، وحذفها. بعض القيم، مثل معرف Droplet، لا تعرف إلا بعد توفير المورد. بالنسبة لهذه القيم، سترى (known after apply)
كقيمة للخاصية في الإخراج.
قم بمراجعة قائمة الموارد للتأكد من أنها كما تتوقع. ثم، استخدم مفاتيح الأسهم لتحديد الخيار الموافقة واضغط على ENTER
.
سترى إخراجًا مشابهًا للتالي:
Outputinfra digitalocean_droplet.foo (foo): Creating...
digitalocean_droplet.bar (bar): Creating...
infra digitalocean_droplet.bar (bar): Still creating... [10s elapsed]
infra digitalocean_droplet.foo (foo): Still creating... [10s elapsed]
1 Stack deploying 0 Stacks done 0 Stacks waiting
يخبرك هذا الإخراج بأن cdktf
يتواصل مع واجهة برمجة التطبيقات لـ DigitalOcean لإنشاء Droplet. cdktf
يقوم بإنشاء Droplets أولاً لأن موازن الحمل تعتمد على معرف Droplet، والذي لا يعرف حتى يتم توفير Droplets.
يستغرق إنشاء Droplet عادة أقل من دقيقة. بمجرد توفير Droplets، ينتقل cdktf
إلى إنشاء موازن الحمل.
Outputinfra digitalocean_droplet.bar (bar): Creation complete after 54s [id=298041598]
infra digitalocean_droplet.foo (foo): Creation complete after 55s [id=298041600]
infra digitalocean_loadbalancer.lb (lb): Creating...
infra digitalocean_loadbalancer.lb (lb): Still creating... [10s elapsed]
قد يستغرق تكوين الموازن الحمولة وقتًا أطول. بعد إنشاء الموازن الحمولة، سترى ملخصًا يظهر أن الشريحة قد تم نشرها بنجاح.
Outputinfra digitalocean_loadbalancer.lb (lb): Still creating... [1m30s elapsed]
infra digitalocean_loadbalancer.lb (lb): Creation complete after 1m32s [id=4f9ae2b7-b649-4fb4-beed-96b95bb72dd1]
infra
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
No outputs found.
يمكنك الآن زيارة واجهة التحكم في DigitalOcean، حيث يمكنك رؤية موازن الحمولة الواحد المسمى default
واثنين من Droplets الصحية المسماة foo
و bar
، وكل واحدة منها تخدم كهدف لموازن الحمولة.
يمكنك اختبار تشغيل NGINX وخدمة المحتوى بشكل صحيح عن طريق زيارة عنوان IP لكل Droplet. يجب أن ترى نصًا مشابهًا للتالي:
Droplet: bar, IP Address: droplet_ip
إذا لم تر هذه السلسلة من النص أو لم يتجاوب الخادم، تحقق من صحة البيانات التي حددتها للمستخدم وتأكد من عدم وجود أي أحرف (بما في ذلك الأسطر الجديدة) قبل الشيبانج (#!
). يمكنك أيضًا الاتصال بـ SSH إلى Droplet باستخدام مفتاح SSH الخاص بك ومراجعة سجلات الإخراج التي تم إنشاؤها بواسطة CloudInit في /var/log/cloud-init-output.log
:
بمجرد تأكيد تشغيل Droplets وخدمة المحتوى، يمكنك بدء اختبار موازن الحمولة. يمكنك القيام بذلك عن طريق إرسال بعض الطلبات.
قم بتشغيل الأمر التالي من الطرفية الخاصة بك لإرسال عشرة طلبات إلى موازن الحمولة:
يجب أن ترى نتائج مماثلة لما يلي، على الرغم من أن عناوين الـ IP المعروضة ستكون مختلفة:
OutputDroplet: foo, IP Address: droplet_foo_ip
Droplet: bar, IP Address: droplet_bar_ip
Droplet: foo, IP Address: droplet_foo_ip
Droplet: bar, IP Address: droplet_bar_ip
Droplet: bar, IP Address: droplet_bar_ip
Droplet: foo, IP Address: droplet_foo_ip
Droplet: bar, IP Address: droplet_bar_ip
Droplet: foo, IP Address: droplet_foo_ip
Droplet: bar, IP Address: droplet_bar_ip
Droplet: foo, IP Address: droplet_foo_ip
يظهر أن الطلبات إلى موازن الحمولة تم توجيهها إلى كل Droplet خمس مرات، مما يشير إلى عمل موازن الحمولة.
ملاحظة: قد لا يقوم موازن الحمولة دائمًا بتوزيع الحمولة بين الـ Droplets الاثنين بشكل مثالي؛ قد تجد أن أربع طلبات تم إرسالها إلى Droplet واحد وستة إلى الآخر. هذا السلوك طبيعي.
في هذه الخطوة، استخدمت cdktf
لتوفير مواردك، ثم استخدمت واجهة سطر الأوامر لـ DigitalOcean لاكتشاف عناوين IP الخاصة بـ Droplets وموزع الحمل الخاص بك. ثم قمت بإرسال طلبات إلى كل Droplet وموزع حمل للتأكد من عملها.
في الخطوة التالية، ستحصل على عناوين IP الخاصة بـ Droplets وموزع الحمل دون تسجيل الدخول إلى واجهة سطر الأوامر لـ DigitalOcean.
الخطوة 8 — إخراج المعلومات
في الخطوة السابقة، كان عليك تسجيل الدخول إلى واجهة سطر الأوامر لـ DigitalOcean للحصول على عناوين IP الخاصة بـ Droplet وموزع الحمل. في هذه الخطوة، ستقوم بتعديل الكود الخاص بك قليلاً بحيث يتم طباعة هذه المعلومات في الإخراج الخاص بأمر cdktf deploy
، مما يوفر لك رحلة إلى واجهة سطر الأوامر.
تسجل Terraform تكوين وحالة مواردها المدارة في ملفات الحالة. بالنسبة للتراص الخاص بك، يمكن العثور على ملف الحالة في infra/terraform.infra.tfstate
. ستتمكن من العثور على عناوين IP الخاصة بـ Droplets وموزع الحمل داخل هذا الملف الحالة.
ومع ذلك، قد يكون فرز ملف كبير غير مريح. يوفر CDKTF بناء TerraformOutput
، والذي يمكنك استخدامه لإخراج المتغيرات وجعلها متاحة خارج الرصيف. يتم طباعة أي إخراجات في stdout
بعد تشغيل cdktf deploy
. يمكن أيضًا تشغيل cdktf output
لطباعة الإخراجات في أي وقت.
ملاحظة: على الرغم من استخدامك للمخرجات لطباعة المعلومات إلى وحدة التحكم في هذا البرنامج التعليمي، إلا أن قوته الحقيقية تأتي من الاستفادة من الكومات المخرجة من الكومات الأخرى كمدخلات، وهو ميزة معروفة باسم المراجعات عبر الكومات.
قم بتحديث ملف main.ts
ليتضمن المخرجات لعناوين IP لموزع الأحمال والـ Droplets:
احفظ وأغلق الملف.
قم بتشغيل cdktf deploy
لتنفيذ التغيير:
Dentro del output، يجب أن ترى شيئًا مماثلاً للتالي:
Output─────────────────────────────────────────────────────────────────────────────
Changes to Outputs:
+ droplet0IP = "droplet_foo_ip"
+ droplet1IP = "droplet_bar_ip"
+ loadBalancerIP = "load_balancer_ip"
You can apply this plan to save these new output values to the Terraform
state, without changing any real infrastructure.
─────────────────────────────────────────────────────────────────────────────
يخبرك هذا المخرج أنه لن يتم إجراء تغييرات في البنية التحتية، فقط سيتم إخراج ما تمت طباعته من الكومة.
استخدم مفاتيح السهم لتحديد الموافقة، ثم اضغط ENTER
. في نهاية الإخراج من وحدة التحكم، يجب أن ترى شيئًا مماثلاً للتالي:
Outputinfra
droplet0IP = droplet_foo_ip
droplet1IP = droplet_bar_ip
loadBalancerIP = load_balancer_ip
الآن، في كل مرة تقوم فيها بتشغيل cdktf deploy
أو cdktf output
، يتم طباعة عنوان IP للـ Droplets وموزعات الأحمال في إخراج وحدة التحكم، مما يُزيل الحاجة إلى الوصول إلى تلك المعلومات من وحدة التحكم الرقمية.
لقد قمت الآن بتوفير Droplets اثنين وموزع أحمال وتأكدت من أنها تعمل. يمكنك استخدام مشروع CDKTF الذي قمت بتطويره كقاعدة لتحديد بنية تحتية أكثر تطورًا (يمكنك العثور على تنفيذ مرجعي في do-community / digitalocean-cdktf-typescript
).
الموارد المقدمة في هذا البرنامج التعليمي ستتكبد تكلفة. إذا كنت لا تنوي استخدام البنية التحتية التي تم إنشاؤها، يجب عليك تدميرها. في الخطوة التالية والأخيرة، ستقوم بتنظيف المشروع عن طريق تدمير الموارد التي تم إنشاؤها في هذا البرنامج التعليمي.
الخطوة 9 — تدمير البنية التحتية الخاصة بك
في هذه الخطوة، ستقوم بإزالة جميع الموارد التي تم إنشاؤها في هذا البرنامج التعليمي.
ما زالت داخل الدليل infra/
، قم بتشغيل cdktf destroy
:
يجب أن ترى نتائج مشابهة للتالي:
Outputinfra Initializing the backend...
infra Initializing provider plugins...
infra - Reusing previous version of digitalocean/digitalocean from the dependency lock file
infra - Using previously-installed digitalocean/digitalocean v2.19.0
infra Terraform has been successfully initialized!
infra digitalocean_droplet.bar (bar): Refreshing state... [id=298041598]
digitalocean_droplet.foo (foo): Refreshing state... [id=298041600]
infra digitalocean_loadbalancer.lb (lb): Refreshing state... [id=4f9ae2b7-b649-4fb4-beed-96b95bb72dd1]
infra Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
infra # digitalocean_droplet.bar (bar) will be destroyed
- resource "digitalocean_droplet" "bar" {
- backups = false -> null
- created_at = "2022-05-02T10:04:16Z" -> null
- disk = 25 -> null
- graceful_shutdown = false -> null
- id = "298041598" -> null
- image = "ubuntu-20-04-x64" -> null
- ipv4_address = "droplet_bar_public_ip" -> null
- ipv4_address_private = "droplet_bar_private_ip" -> null
- ipv6 = false -> null
- locked = false -> null
- memory = 1024 -> null
- monitoring = false -> null
- name = "bar" -> null
- price_hourly = 0.00744 -> null
- price_monthly = 5 -> null
- private_networking = true -> null
- region = "lon1" -> null
- resize_disk = true -> null
- size = "s-1vcpu-1gb" -> null
- ssh_keys = [
- "34377800",
] -> null
- status = "active" -> null
- tags = [] -> null
- urn = "do:droplet:298041598" -> null
- user_data = "f9b1d9796d069fe504ce0d89439b6b664b14b1a1" -> null
- vcpus = 1 -> null
- volume_ids = [] -> null
- vpc_uuid = "bed80b32-dc82-11e8-83ec-3cfdfea9f3f0" -> null
}
# سيتم تدمير digitalocean_droplet.foo (foo)
- resource "digitalocean_droplet" "foo" {
- backups = false -> null
- created_at = "2022-05-02T10:04:16Z" -> null
- disk = 25 -> null
- graceful_shutdown = false -> null
- id = "298041600" -> null
- image = "ubuntu-20-04-x64" -> null
- ipv4_address = "droplet_foo_public_ip" -> null
- ipv4_address_private = "droplet_foo_private_ip" -> null
- ipv6 = false -> null
- locked = false -> null
- memory = 1024 -> null
- monitoring = false -> null
- name = "foo" -> null
- price_hourly = 0.00744 -> null
- price_monthly = 5 -> null
- private_networking = true -> null
- region = "lon1" -> null
- resize_disk = true -> null
- size = "s-1vcpu-1gb" -> null
- ssh_keys = [
- "34377800",
] -> null
- status = "active" -> null
- tags = [] -> null
- urn = "do:droplet:298041600" -> null
- user_data = "f9b1d9796d069fe504ce0d89439b6b664b14b1a1" -> null
- vcpus = 1 -> null
- volume_ids = [] -> null
- vpc_uuid = "bed80b32-dc82-11e8-83ec-3cfdfea9f3f0" -> null
}
# سيتم تدمير digitalocean_loadbalancer.lb (lb)
- resource "digitalocean_loadbalancer" "lb" {
- algorithm = "round_robin" -> null
- disable_lets_encrypt_dns_records = false -> null
- droplet_ids = [
- 298041598,
- 298041600,
] -> null
- enable_backend_keepalive = false -> null
- enable_proxy_protocol = false -> null
- id = "4f9ae2b7-b649-4fb4-beed-96b95bb72dd1" -> null
- ip = "load_balancer_ip" -> null
- name = "default" -> null
- redirect_http_to_https = false -> null
- region = "lon1" -> null
- size_unit = 1 -> null
- status = "active" -> null
- urn = "do:loadbalancer:4f9ae2b7-b649-4fb4-beed-96b95bb72dd1" -> null
- vpc_uuid = "bed80b32-dc82-11e8-83ec-3cfdfea9f3f0" -> null
- forwarding_rule {
- entry_port = 80 -> null
- entry_protocol = "http" -> nul
infra l
- target_port = 80 -> null
- target_protocol = "http" -> null
- tls_passthrough = false -> null
}
- healthcheck {
- check_interval_seconds = 10 -> null
- healthy_threshold = 5 -> null
- path = "/" -> null
- port = 80 -> null
- protocol = "http" -> null
- response_timeout_seconds = 5 -> null
- unhealthy_threshold = 3 -> null
}
- sticky_sessions {
- cookie_ttl_seconds = 0 -> null
- type = "none" -> null
}
}
Plan: 0 to add, 0 to change, 3 to destroy.
─────────────────────────────────────────────────────────────────────────────
Saved the plan to: plan
To perform exactly these actions, run the following command to apply:
terraform apply "plan"
Please review the diff output above for infra
❯ Approve Applies the changes outlined in the plan.
Dismiss
Stop
هذه المرة، بدلاً من عرض +
بجانب كل مورد، يظهر -
، مما يشير إلى أن CDKTF يخطط لتدمير المورد. قم بمراجعة التغييرات المقترحة، ثم استخدم مفاتيح الأسهم لتحديد الموافقة واضغط على ENTER
. سيتصل الآن موفر DigitalOcean بواجهة برمجة التطبيقات (API) لديجيتال أوشن لتدمير الموارد.
Outputinfra digitalocean_loadbalancer.lb (lb): Destroying... [id=4f9ae2b7-b649-4fb4-beed-96b95bb72dd1]
infra digitalocean_loadbalancer.lb (lb): Destruction complete after 1s
infra digitalocean_droplet.bar (bar): Destroying... [id=298041598]
digitalocean_droplet.foo (foo): Destroying... [id=298041600]
تم حذف موزع الحمل أولاً لأنه ليس لديه تبعيات (لا تشير موارد أخرى إلى موزع الحمل في مدخلاتها). نظرًا لأن موزع الحمل يشير إلى الـ Droplets، لا يمكن تدميرها إلا بعد تدمير موزع الحمل.
بعد تدمير الموارد، سترى السطر التالي مطبوعًا في النتيجة:
OutputDestroy complete! Resources: 3 destroyed.
الاستنتاج
في هذا البرنامج التعليمي، استخدمت CDKTF لتوفير وتدمير صفحة ويب موازنة الحمل، تتكون من قطرات DigitalOcean اثنين تعمل خوادم NGINX، تخدم وراء موازن الحمل. كما قمت بإخراج معلومات حول الموارد على الطرفية.
CDKTF هو طبقة تجريد فوق Terraform. فهم جيد لـ Terraform مفيد في فهم CDKTF. إذا كنت ترغب في معرفة المزيد عن Terraform، يمكنك قراءة كيفية إدارة البنية التحتية باستخدام Terraform سلسلة، التي تغطي Terraform بعمق.
يمكنك أيضًا التحقق من توثيق CDK لـ Terraform الرسمي و البرامج التعليمية لمعرفة المزيد عن CDKTF.