از Pulumi در Google Cloud با YAML استفاده کنید

۱. مرور کلی

این آزمایشگاه به شما آموزش می‌دهد که چگونه از Pulumi ، ابزاری برای زیرساخت به عنوان کد، برای تأمین و مدیریت منابع Google Cloud استفاده کنید.

آنچه یاد خواهید گرفت

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه موارد زیر را انجام دهید:

  • نصب و پیکربندی پولومی
  • نوشتن برنامه YAML برای مدل‌سازی زیرساخت خود در Google Cloud
  • تأمین و مدیریت منابع ابری با استفاده از Pulumi
  • از pulumi convert برای تبدیل برنامه YAML به برنامه پایتون استفاده کنید

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

۳. راه‌اندازی زیرساخت

نصب و پیکربندی Pulumi

در Cloud Shell، دستور زیر را برای نصب Pulumi اجرا کنید.

curl -fsSL https://get.pulumi.com | sh

پولومی را به مسیر اضافه کنید و پیام کمک از پولومی را مشاهده کنید

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 bucket ایجاد کنید و از آن به عنوان backend استفاده کنید.

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 را با تعاریف منابع زیر ایجاد کنید.

  1. سطل
  2. اتصال IAM
  3. یک شیء متنی با رشته "Hello World!"
  4. و برخی خروجی‌ها
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

۴. تبدیل YAML به پایتون

بیایید مثال بالا را به یک برنامه پایتون Pulumi تبدیل کنیم.

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)
.......

فعال کردن محیط مجازی پایتون

source py-repo/bin/activate

فایل پروژه Pulumi.yaml را به‌روزرسانی کنید تا به برنامه پایتون اشاره کند. توجه داشته باشید که زمان اجرا و ورودی اصلی تغییر کرده‌اند.

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

۵. منابع را حذف کنید

منابع ایجاد شده را حذف کنید

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

۶. تبریک می‌گویم!

تبریک می‌گویم، آزمایشگاه را تمام کردید!