יצירת תבנית בסיסית

קובץ הגדרה בסיסי יכול להספיק לעומסי עבודה פשוטים, אבל לארכיטקטורות מורכבות יותר או להגדרות שאתם מתכננים לעשות בהן שימוש חוזר, אתם יכולים לפצל את ההגדרה לתבניות.

תבנית היא קובץ נפרד שמייבאים ומשתמשים בו כסוג בהגדרה. אפשר להשתמש בכמה תבניות שרוצים בהגדרה.

תבניות מאפשרות לכם לפצל את ההגדרה לחלקים שונים שבהם תוכלו להשתמש שוב ושוב בפריסות שונות. התבניות יכולות להיות כלליות או ספציפיות, בהתאם לצורך. בעזרת תבניות, אתם יכולים גם ליהנות מתכונות כמו מאפייני תבניות, משתני סביבה, מודולים ופונקציות אחרות של תבניות כדי ליצור קובצי הגדרה ותבניות דינמיים.

דוגמאות לתבניות שאפשר להשתמש בהן בפריסות שלכם זמינות במאגר GitHub של Deployment Manager.

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

תחביר התבנית

אפשר לכתוב תבניות ב-Jinja 2.10.x או ב-Python 3.x. ‫Jinja דומה יותר לתחביר של YAML, ולכן אם אתם מכירים יותר את YAML, יכול להיות שיהיה לכם קל יותר לכתוב תבניות ב-Jinja.

אפשר גם לכתוב קובצי תבניות ב-Python ולהשתמש ב-Python כדי ליצור באופן פרוגרמטי חלקים מהתבניות. לדוגמה, אפשר להשתמש בספריות Python כדי לעצב הגדרות של תבניות. אם אתם מכירים את Python, יכול להיות שהפורמט הזה יתאים לכם יותר.

‫Deployment Manager מקבל תבניות Jinja ו-Python. אפשר לייבא תבניות בשתי השפות באותה הגדרה.

יצירת תבנית בסיסית

תבנית היא קובץ שאתם יוצרים, שנכתב ב-Jinja או ב-Python. לדוגמה, קובץ ההגדרות הבא:

# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

resources:
- name: vm-created-by-deployment-manager
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default

ההגדרה הזו תקינה, אבל אפשר לפשט אותה עוד יותר על ידי פיצול החלקים השונים לקובצי תבנית נפרדים שניתנים לשימוש חוזר. כדי ליצור תבנית על סמך ההגדרה שלמעלה, מוציאים את הקטע של המשאב הרלוונטי ויוצרים קובץ Jinja או Python חדש.

בקטעי הקוד הבאים מוצגים החלקים בתבניות שיכולים לפשט את הפריסה. כדי לראות את התבניות המלאות, לוחצים על הצגה ב-GitHub.

Jinja

- name: vm-template
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default

Python

תבניות Python צריכות לעמוד בדרישות הבאות:

  • בתבנית צריך להגדיר שיטה בשם GenerateConfig(context) או generate_config(context). אם משתמשים בשני שמות השיטות באותו תבנית, השיטה generate_config() מקבלת עדיפות.

    אובייקט context מכיל מטא-נתונים על הפריסה והסביבה שלכם, כמו שם הפריסה, הפרויקט הנוכחי וכן הלאה. מידע נוסף על שימוש במשתני סביבה ספציפיים לפריסה

  • השיטה צריכה להחזיר מילון Python.

מעבר לכך, אתם אחראים ליצירת התוכן של התבנית.

דוגמה

resources.append({
    'name': 'vm-template',
    'type': 'compute.v1.instance',
    'properties': {
        'zone': 'us-central1-a',
        'machineType': 'zones/us-central1-a/machineTypes/n1-standard-1',
        'disks': [{
            'deviceName': 'boot',
            'type': 'PERSISTENT',
            'boot': True,
            'autoDelete': True,
            'initializeParams': {
                'sourceImage':
                    'projects/debian-cloud/global/images/family/debian-11'
            }
        }],
        'networkInterfaces': [{
            'network': 'global/networks/default'
        }]
    }
})

הדוגמה המלאה ב-Python זמינה במאגר GitHub של Deployment Manager.

ייבוא התבנית

אחרי שיוצרים תבנית, מייבאים אותה לקובץ ההגדרות כדי להשתמש בה. כדי לייבא תבנית, מוסיפים קטע imports להגדרה, ואחריו את הנתיב היחסי או המוחלט מהספרייה הנוכחית. לדוגמה, אפשר לייבא את תבנית המכונה הווירטואלית מהשלב הקודם על ידי הוספת השורה הבאה לחלק העליון של ההגדרה:

imports:
  - path: path/to/my_vm_template.jinja

אם נתיב הקובץ ארוך, אפשר לספק מאפיין name אופציונלי בתור כינוי לקובץ. אפשר להשתמש בשם הזה כדי להפנות לתבנית בהמשך. אם לא תספקו את השם, אפשר להפנות לתבנית באמצעות התג path.

imports:
  - path: path/to/my_vm_template.jinja
    name: my_renamed_template.jinja

אתם יכולים לשלב בין ייבוא של כמה תבניות, בלי קשר לסוג התבנית (Jinja או Python):

imports:
  - path: path/to/my_vm_template.jinja
    name: my_renamed_template.jinja
  - path: special_vm.py

אם התבנית שלכם משתמשת בתבניות אחרות כתלות, צריך לייבא גם את התבניות התלויות בהגדרות:

imports:
  - path: path/to/my_vm_template.jinja
  - path: special_vm.py
  - path: base_vm.jinja

אפשר גם לייבא קובצי טקסט כדי להוסיף את התוכן שלהם בתוך המסמך. לדוגמה, אם יוצרים קובץ בשם resource_type.txt עם המחרוזת הבאה:

compute.v1.instance

מייבאים אותו להגדרה ומספקים את התוכן בתוך השורה, באופן הבא:

imports:
- path: resource_type.txt

resources:
- name: my-vm
  type: {{ imports["resource_type.txt"] }} # Resolves to "compute.v1.instance"
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

פריסת תבניות

אחרי שמייבאים תבנית, משתמשים בה כסוג בהגדרה:

Jinja

imports:
- path: vm-template.jinja

resources:
- name: my-vm
  type: vm-template.jinja

Python

imports:
- path: vm-template.py

resources:
- name: my-vm
  type: vm-template.py

אם לא ציינתם שם לתבנית, קוראים לתבנית באמצעות נתיב התבנית:

imports:
- path: path/to/my_vm_template.jinja

resources:
- name: my-first-virtual-machine
  type: path/to/my_vm_template.jinja

פריסת תבניות ישירות באמצעות כלי שורת הפקודה

במקום ליצור קובץ הגדרה ברמה העליונה, Deployment Manager מאפשר לפרוס תבנית ישירות ב-Google Cloud CLI.

לדוגמה, הבקשה הבאה פורסת תבנית בשם vm-template.jinja:

gcloud deployment-manager deployments create a-single-vm --template vm-template.jinja

אם בתבנית יש מאפייני תבנית, אפשר להגדיר אותם בשורת הפקודה באמצעות הדגל --properties:

gcloud deployment-manager deployments create my-igm \
    --template vm-template.jinja \
    --properties zone:us-central1-a

חשוב לזכור:

  • כל הערכים מנותחים כערכי YAML. לדוגמה, הערך version: 3 מועבר כמספר שלם. אם רוצים לציין אותו כמחרוזת, צריך להוסיף גרשיים בודדים עם תו בריחה סביב הערך, version: \'3\'.

  • ערכים בוליאניים לא תלויי-רישיות, ולכן המערכת מתייחסת ל-TRUE, ל-true ול-True באותו אופן.

  • צריך להעביר את כל המאפיינים הנדרשים שמוגדרים בתבנית. אי אפשר לספק רק קבוצת משנה של הנכסים. אם למאפיינים מסוימים יש ערכי ברירת מחדל, אפשר להשמיט את המאפיין משורת הפקודה.

כדי לציין כמה מאפיינים, צריך לספק צמדים של מפתח:ערך שמופרדים בפסיקים. לא משנה באיזה סדר מציינים את הזוגות. לדוגמה:

gcloud deployment-manager deployments create my-igm 
--template vm-template.jinja
--properties zone:us-central1-a,machineType:n1-standard-1,image:debian-9

אחרי שמריצים את הפקודה הזו, Deployment Manager יוצר פריסה באמצעות התבנית שסיפקתם. אפשר לוודא שהפריסה נוצרה באמצעות מסוף Google Cloud או ה-CLI של gcloud. מידע על צפייה בפריסה מופיע במאמר צפייה במניפסט.

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