יצירת תמונות של מכונות וירטואליות באמצעות Packer

‫Packer הוא כלי בקוד פתוח ליצירת תמונות זהות של מכונות וירטואליות (VM) למספר פלטפורמות, מתוך הגדרת מקור יחידה. בדף הזה מוסבר איך להשתמש ב-Packer וב-Cloud Build כדי ליצור תמונת מצב של מכונה וירטואלית לשימוש ב-Compute Engine.

לפני שמתחילים

ההוראות בדף הזה מניחות שאתם מכירים את Packer. בנוסף:

  • חשוב שקוד המקור יהיה בהישג יד, כולל תבנית Packer.
  • יש לכם מאגר Docker ב-Artifact Registry או שאתם יוצרים מאגר חדש.
  • כדי להשתמש בפקודות gcloud שבדף הזה, צריך להתקין את Google Cloud CLI.
  • מפעילים את ממשקי ה-API הבאים:

    gcloud services enable compute.googleapis.com
    gcloud services enable servicemanagement.googleapis.com
    gcloud services enable storage-api.googleapis.com
    gcloud services enable artifactregistry.googleapis.com
    

הרשאות IAM נדרשות

יצירת תמונה של Packer builder

‫Cloud Build מספק קובץ אימג' של Packer community builder שבו אפשר להשתמש כדי להפעיל פקודות packer ב-Cloud Build. לפני שמשתמשים ב-builder הזה בקובץ תצורת Cloud Build, צריך ליצור את קובץ האימג' ולהעביר אותו בדחיפה ל-Artifact Registry:

  1. משכפלים את המאגר cloud-builders-community:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. עוברים אל קובץ האימג' של ה-builder של Packer:

    cd cloud-builders-community/packer
    
  3. שולחים את ה-builder לפרויקט:

    gcloud builds submit . --config cloudbuild.yaml --substitutions=_AR_HOST=[LOCATION]-docker.pkg.dev,_AR_REPO=[REPOSITORY]
    

    כאשר:

    • ‫[LOCATION] הוא האזור של מאגר Artifact Registry.
    • ‫[REPOSITORY] הוא השם של מאגר Artifact Registry.

יצירת תבנית Packer

יוצרים קובץ חדש בשם packer.pkr.hcl ומוסיפים את הגדרות התבנית.

הדוגמה הבאה מציגה תבנית Packer ‏ (packer.pkr.hcl) שמוגדרת ליצירת תמונת מכונה וירטואלית ב-Compute Engine:

packer {
  required_plugins {
    googlecompute = {
      version = ">= 1.1.1"
      source  = "github.com/hashicorp/googlecompute"
    }
  }
}

variable "image_name" {
  type    = string
  description = "The name of the output VM image"
  default = "my-packer-image"
}
variable "project_id" {
  type    = string
  description = "The GCP project ID"
}
variable "image_family" {
  type    = string
  description = "The family of the output VM image"
  default = "my-image-family"
}
variable "image_zone" {
  type    = string
  description = "The zone to build the image in"
  default = "us-central1-a"
}

source "googlecompute" "gce" {
  project_id          = var.project_id
  source_image_family = "ubuntu-2004-lts"
  source_image_project_ids = ["ubuntu-os-cloud"]
  zone                = var.image_zone
  ssh_username        = "packer"
  machine_type        = "e2-small"
  image_name          = "${var.image_name}-"
  image_family        = var.image_family
}

build {
  name    = "gce-vm-image"
  sources = ["sources.googlecompute.gce"]

  provisioner "shell" {
    inline = [
      "echo 'Provisioning image...'",
      "sudo apt-get update",
      "sudo apt-get install -y nginx"
    ]
  }
}

שימוש ב-Packer builder

  1. מוודאים שיש לכם את תבנית Packer (לדוגמה, packer.pkr.hcl) יחד עם קוד המקור.

  2. בתיקיית השורש של הפרויקט, יוצרים קובץ הגדרות build בשם cloudbuild.yaml או cloudbuild.json.

  3. בקובץ הגדרות ה-build, מוסיפים שלב build להפעלת הפקודה packer build:

    YAML

    steps:
    - name: '[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY]/packer'
      args:
      - build
      - -var
      - image_name=[IMAGE_NAME]
      - -var
      - project_id=[PROJECT_ID]
      - -var
      - image_family=[IMAGE_FAMILY]
      - -var
      - image_zone=[IMAGE_ZONE]
      - packer.pkr.hcl
    

    JSON

    {
      "steps": [
       {
          "name": "[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY]/packer",
          "args": [
            "build",
            "-var",
            "image_name=[IMAGE_NAME]",
            "-var",
            "project_id=[PROJECT_ID]",
            "-var",
            "image_family=[IMAGE_FAMILY]",
            "-var",
            "image_zone=[IMAGE_ZONE]",
            "packer.pkr.hcl"
           ]
        }
       ]
    }
    

    כאשר:

    • ‫[LOCATION] הוא האזור של מאגר Artifact Registry.
    • ‫[PROJECT_ID] הוא מזהה הפרויקט. Google Cloud
    • ‫[REPOSITORY] הוא השם של מאגר Artifact Registry.
    • ‫[IMAGE_NAME] הוא השם של קובץ האימג' של המכונה הווירטואלית שאתם בונים.
    • ‫[IMAGE_FAMILY] הוא משפחת התמונות של תמונת ה-VM.
    • ‫[IMAGE_ZONE] הוא אזור התמונה.
  4. מריצים את ה-build באמצעות קובץ התצורה של ה-build:

    gcloud builds submit --region=[REGION] --config [CONFIG_FILE_PATH] [SOURCE_DIRECTORY]
    

    כאשר:

    • ‫[CONFIG_FILE_PATH] הוא הנתיב לקובץ התצורה של ה-build.
    • ‫[SOURCE_DIRECTORY] הוא הנתיב או כתובת ה-URL של קוד המקור.
    • ‫[REGION] הוא אחד מאזורי הבנייה הנתמכים.

    אם לא מציינים [CONFIG_FILE_PATH] ו-[SOURCE_DIRECTORY] בפקודה gcloud builds submit, ‏ Cloud Build מניח שקובץ ההגדרות וקוד המקור נמצאים בספריית העבודה הנוכחית.

אחרי שהתמונות נוצרות, אפשר לראות אותן בדף התמונות של Compute Engine במסוף Google Cloud .

המאמרים הבאים