1. نظرة عامة
يشرح لك هذا المختبر كيفية استخدام Pulumi، وهي أداة "البنية الأساسية كرمز" لتوفير موارد Google Cloud وإدارتها.
ما ستتعرّف عليه
ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:
- تثبيت Pulumi وإعداده
- كتابة برنامج YAML لتصميم البنية الأساسية على Google Cloud
- توفير موارد السحابة الإلكترونية وإدارتها باستخدام Pulumi
- استخدِم pulumi convert لتحويل برنامج YAML إلى برنامج Python.
2. الإعداد والمتطلبات
إعداد البيئة حسب وتيرة الطالب واحتياجاته
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديله في أي وقت.
- يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تُنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة محتواها. في معظم ورشات عمل رموز البرامج، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم
PROJECT_ID
). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة وسيظلّ ساريًا طوال مدة المشروع. - يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. من المفترض ألا تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو تكلفة قليلة جدًا. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
3- إعداد البنية الأساسية
تثبيت Pulumi وإعداده
في Cloud Shell، شغِّل الأمر التالي لتثبيت Pulumi
curl -fsSL https://get.pulumi.com | sh
أضِف Pulumi إلى المسار واطّلِع على رسالة المساعدة من Pulumi.
export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h
شغِّل الأوامر التالية لضبط رقم تعريف المشروع والسماح بالوصول. يجب اتباع الإرشادات المقدمة في الأوامر
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
في Cloud Shell، أنشئ حزمة GCS واستخدِمها كخلفية
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
إنشاء مشروع جديد
في Cloud Shell، أنشئ الدليل الجذري للمشروع.
mkdir pulumi-lab && cd pulumi-lab
تحديد ملف المشروع(نقطة الدخول إلى Pulumi)
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: yaml
main: yaml-repo/
EOT
تحديد موارد YAML
إنشاء دليل لتضمين تعريفات موارد السحابة الإلكترونية بتنسيق yaml
mkdir yaml-repo
أنشئ ملف yaml-repo/Pulumi.yaml
باستخدام تعريفات الموارد التالية.
- دلو
- ربط إدارة الهوية وإمكانية الوصول
- كائن نصي يتضمن السلسلة "Hello World!"
- وبعض النتائج
resources:
# Create a GCP resource (Storage Bucket)
my-bucket:
type: gcp:storage:Bucket
properties:
location: US
website:
mainPageSuffix: index.html
uniformBucketLevelAccess: true
my-bucket-binding:
type: gcp:storage:BucketIAMBinding
properties:
bucket: ${my-bucket.name}
role: "roles/storage.objectViewer"
members: ["allUsers"]
index-object:
type: gcp:storage:BucketObject
properties:
bucket: ${my-bucket}
source:
fn::stringAsset: Hello World!
outputs:
bucketName: ${my-bucket.url}
نشر الموارد
بدء الحزمة وضبطها
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
تحقَّق من إعدادات الحزمة ومن المفترض أن يظهر لك المفتاح gcp:project مع رقم تعريف مشروعك كقيمة.
pulumi config
في هذه المرحلة، من المفترض أن تبدو بنية الدليل على النحو التالي:
├── Pulumi.dev.yaml ├── Pulumi.yaml └── yaml-repo └── Pulumi.yaml
نشر الحزمة
pulumi up
يُقيّم هذا الأمر برنامجك ويحدّد تعديلات الموارد التي يجب إجراؤها. أولاً، يتم عرض معاينة توضّح التغييرات التي سيتم إجراؤها عند تنفيذ الأمر.
(الإخراج)
Previewing update (dev): Downloading plugin gcp v6.44.0: 45.69 MiB / 45.69 MiB [=============] 100.00% 1s Type Name Plan + pulumi:pulumi:Stack pulumi-lab-dev create + ├─ gcp:storage:Bucket my-bucket create + ├─ gcp:storage:BucketObject index-object create + └─ gcp:storage:BucketIAMBinding my-bucket-binding create Outputs: bucketName: output<string> Resources: + 4 to create Do you want to perform this update? [Use arrows to move, type to filter] yes > no details
انقر على نعم وسيتم توفير الموارد. يجب أن تبدو مخرجاتك على هذا النحو
Do you want to perform this update? yes Updating (dev): Type Name Status + pulumi:pulumi:Stack pulumi-lab-dev created (3s) + ├─ gcp:storage:Bucket my-bucket created (1s) + ├─ gcp:storage:BucketObject index-object created (0.78s) + └─ gcp:storage:BucketIAMBinding my-bucket-binding created (5s) Outputs: bucketName: "gs://my-bucket-874aa08" Resources: + 4 created Duration: 11s
سيؤدي تنفيذ الأمر التالي إلى طباعة النتائج التي تم تحديدها.
pulumi stack output
شغِّل الأمر التالي للتحقق من التغيير
gsutil ls $(pulumi stack output bucketName)
ستظهر النتيجة على النحو التالي:
(الناتج)
gs://my-bucket-11a9046/index-object-77a5d80
4. تحويل ملف YAML إلى ملف Python
لنحول المثال أعلاه إلى برنامج Pulumi Python.
pulumi convert --language python --out ./py-repo
فحص الرمز الذي تم إنشاؤه في py-repo
cat py-repo/__main__.py
(الناتج)
import pulumi import pulumi_gcp as gcp my_bucket = gcp.storage.Bucket("my-bucket", location="US", website=gcp.storage.BucketWebsiteArgs( main_page_suffix="index.html", ), uniform_bucket_level_access=True) my_bucket_binding = gcp.storage.BucketIAMBinding("my-bucket-binding", bucket=my_bucket.name, role="roles/storage.objectViewer", members=["allUsers"]) index_object = gcp.storage.BucketObject("index-object", bucket=my_bucket.id, source=pulumi.StringAsset("Hello World!")) pulumi.export("bucketName", my_bucket.url) .......
تفعيل بيئة Python الافتراضية
source py-repo/bin/activate
عدِّل ملف المشروع Pulumi.yaml للإشارة إلى برنامج python. يُرجى ملاحظة أنّه تم تغيير وقت التشغيل والإدخال الرئيسي.
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: python
main: py-repo/
EOT
حاوِل إعادة نشر الحزمة واختَر نعم.
pulumi up
يجب ألا يتم إجراء أي تغييرات، ويجب أن تبدو النتائج مشابهة لهذه
(output)
Previewing update (dev): Type Name Plan pulumi:pulumi:Stack pulumi-lab-dev Resources: 4 unchanged Do you want to perform this update? yes Updating (dev): Type Name Status pulumi:pulumi:Stack pulumi-lab-dev Outputs: bucketName: "gs://my-bucket-c2b49ad" Resources: 4 unchanged Duration: 6s
5- حذف الموارد
حذف الموارد التي تم إنشاؤها
pulumi destroy
سيظهر التأكيد على النحو التالي:
Previewing update (dev): Type Name Plan pulumi:pulumi:Stack pulumi-lab-dev Resources: 4 unchanged Do you want to perform this update? [Use arrows to move, type to filter] yes > no details Do you want to perform this destroy? yes Destroying (dev): Type Name Status - pulumi:pulumi:Stack pulumi-lab-dev deleted - ├─ gcp:storage:BucketIAMBinding my-bucket-binding deleted (5s) - ├─ gcp:storage:BucketObject index-object deleted (1s) - └─ gcp:storage:Bucket my-bucket deleted (0.73s) Outputs: - bucketName: "gs://my-bucket-874aa08" Resources: - 4 deleted Duration: 10s
6- تهانينا!
تهانينا، لقد أنهيت الدرس.