שימוש בהפניות

כשמגדירים את המאפיינים של התבניות או ההגדרות, אפשר להשתמש בהפניות למאפיינים של משאבים אחרים במקום לספק ערכים ישירות. לדוגמה, אם רוצים ליצור מנהל קבוצת מופעים שמשתמש בתבנית של הגדרות מכונה מאותו פריסה, במקום להקליד במפורש את הקישור המלא לתבנית של הגדרות המכונה, אפשר להשתמש בהפניה עם התחביר $(ref.instance-template.selfLink).

בעזרת הפניות אתם יכולים:

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

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

    $(ref.network-name.selfLink)
    

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

כשיוצרים הפניה למשאב, נוצרת גם תלות בין המשאבים. לדוגמה, בקטע הקוד הבא, sandbox-vm משתמש בהפניה ל-network-a:

resources:
- name: sandbox-vm
  type: compute.v1.instance
  properties:
    network: $(ref.network-a.selfLink)
    ...
...
- name: network-a
  type: compute.v1.network
  properties:
    ...

כשפורסים את ההגדרה הזו, Deployment Manager יוצר את network-a לפני sandbox-vm, כדי שאפשר יהיה לפתור את ההפניה. אם אחת מההפניות לא מתורגמת לכתובת, הפריסה נכשלת.

אפשר להשתמש בהפניות גם בהגדרות וגם בתבניות.

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

יצירת הפניות בקובצי תצורה

מצהירים על הפניות בהגדרה באמצעות הפורמט הבא:

$(ref.RESOURCE_NAME.PROPERTY)

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

$(ref.a-new-network.selfLink)
# 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: the-first-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/MY_PROJECT/zones/us-central1-f/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    # The resource's "network value" has been replaced with a
    # reference to the new network's "selfLink" property. The network 
    # resource has been added to the end of this file.
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
- name: the-second-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/MY_PROJECT/zones/us-central1-f/machineTypes/g1-small
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    # As in the resource above, the "network" value has been replaced with 
    # the new network's "selfLink" property. 
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
# The following network is a new resource added to the "two-vms.yaml" file.
- name: a-new-network
  type: compute.v1.network
  properties:
    routingConfig:
      routingMode: REGIONAL
    autoCreateSubnetworks: true

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

יצירת הפניות בתבניות

בקובצי תבניות, לפני ההפניה כולה צריך להוסיף $, ואז להוסיף אותה בין סוגריים:

$(ref.RESOURCE_NAME.PROPERTY)

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

אלה כמה דוגמאות להצהרה על הפניות בתבניות:

Jinja

  • הפניה שכוללת משתנה סביבה

    network: $(ref.{{ env["deployment"] }}-network.selfLink)
    
  • הפניה לערך במערך

    subnetwork: $(ref.{{ env["deployment"] }}-vm.networkInterfaces[2].subnetwork)
    
  • הפניה שכוללת מאפיין של תבנית

    network: $(ref.{{ properties["network"] }}.selfLink)
    
  • הפניה באמצעות פרמטר Jinja

    network: $(ref.{{ NETWORK_NAME }}.selfLink)
    
  • הפניה בפלטים

      outputs:
      - name: UrlToService
        value: http://$(ref.{{ env["deployment"] }}-network.networkInterfaces[0].accessConfigs[0].natIp):8080/
    

Python

  • הפניה שכוללת משתנה סביבה

    'network': '$(ref.' + context.env['deployment'] + '-network.selfLink)'
    
  • הפניה לערך במערך

    'subnetwork': '$(ref.' + context.env['deployment'] + '-vm.networkInterfaces[2].subnetwork)'
    
  • הפניה שכוללת מאפיין של תבנית

    'network': '$(ref.' + context.properties['network'] + '.selfLink)'
    
  • הפניה באמצעות פרמטר Python

    'value': '$(ref.' + base_name + '.networkInterfaces[0].networkIP)'
    
  • הפניה בפלטים

    outputs = [{'name': 'UrlToService',
                'value': '$(ref.' + context.env['deployment'] + '-network.networkInterfaces[0].accessConfigs[0].natIP):8080'}]
    

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