1. نظرة عامة
يعلّمك هذا المختبر كيفية استخدام Pulumi، وهي أداة "البنية التحتية كرمز" لتوفير موارد Google Cloud وإدارتها.
ما ستتعلمه
في هذه الميزة الاختبارية، ستتعرّف على كيفية تنفيذ ما يلي:
- تثبيت Pulumi وإعداده
- كتابة برنامج YAML لنمذجة البنية الأساسية على Google Cloud
- توفير موارد السحابة الإلكترونية وإدارتها باستخدام Pulumi
- استخدِم pulumi convert لتحويل برنامج YAML إلى برنامج Python
2. الإعداد والمتطلبات
إعداد البيئة بوتيرة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع 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 مع تعريفات الموارد التالية
- الحزمة
- ربط IAM
- كائن نصي يتضمّن السلسلة "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
يجب ألا تكون هناك أي تغييرات، ويجب أن تبدو النتيجة مشابهة لما يلي
(الناتج)
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. تهانينا!
تهانينا، لقد أكملت الدرس التطبيقي.