חשיפת מידע באמצעות פלטים

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

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

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

דוגמה

זוהי תבנית לדוגמה עם פלט:

mongodb.jinja
{% set MASTER = env["name"] + "-" + env["deployment"] + "-mongodb" %}
resources:
- name: {{ MASTER }}
  type: instance
  ...
outputs:
- name: databaseIp
  value: $(ref.{{ MASTER }}.network[0].ip)  # Treated as a string during expansion
- name: databasePort
  value: 88

בקטע outputs מוצהרים שני מאפיינים: databaseIp ו-databasePort. ‫databaseIp משתמש בהפניה שמפוענחת לכתובת ה-IP ברשת של משאב האב, ואילו databasePort הוא ערך סטטי. בתבנית אחרת, אפשר לייבא את mongodb.jinja, להשתמש בתבנית כסוג ולקרוא לפלט. לדוגמה:

imports:
- path: example/path/to/mongodb.jinja
  name: mongodb.jinja

resources:
- name: my_mongo
  type: mongodb.jinja
  properties:
    size: 100

- name: my_instance
  type: compute.v1.instance
  properties:
    
    databaseIp: $(ref.my_mongo.databaseIp)
    databasePort: $(ref.my_mongo.databasePort)

הצהרה על פלט

מגדירים פלט בתבנית או בהגדרה על ידי הגדרת קטע outputs: באותה רמה כמו הקטע resources:. מפתחות הפלט צריכים להיות ייחודיים בתבנית או בהגדרה.

לדוגמה, קטע outputs: לדוגמה יכול להיראות כך:

...
outputs:
- name: databaseIp
  value: $(ref.my-first-vm.networkInterfaces[0].accessConfigs[0].natIP)
- name: machineType
  value: {{ properties['machineType'] }}
- name: databasePort
  value: 88

כך הפלט עשוי להיראות בתבנית מלאה:

{#
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: my-first-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/{{ properties['machineType'] }}
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

# Declare outputs here
outputs:
- name: databaseIp
  value: $(ref.my-first-vm.networkInterfaces[0].accessConfigs[0].natIP)
- name: machineType
  value: {{ properties['machineType'] }}
- name: databasePort
  value: 88


ערכי הפלט יכולים להיות:

שימוש בפלט מתבניות

כדי להשתמש בפלט שהוגדר בתבנית, מייבאים את התבנית שמכילה את הפלט ומשתמשים בה כסוג. לדוגמה, כדי להשתמש בפלטים שהוגדרו בתבנית שנקראת template_with_outputs.jinja, צריך לייבא אותה ולהשתמש בה כדי ליצור משאב:

# 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.
imports:
- path: template_with_outputs.jinja
  name: template.jinja

resources:
- name: my-first-vm
  type: template.jinja
  properties:
    machineType: n1-standard-1

outputs:
- name: databaseIp
  value: $(ref.my-first-vm.databaseIp)
- name: machineType
  value: $(ref.my-first-vm.machineType)
- name: databasePort
  value: $(ref.my-first-vm.databasePort)


כדי לקרוא לפלט, משתמשים בפורמט הבא:

$(ref.RESOURCE.OUTPUT)
  • RESOURCE הוא שם המשאב שנוצר על ידי התבנית. בדוגמה שלמעלה, זה my-first-vm.

  • OUTPUT הוא הפלט שמוגדר בתבנית. בדוגמה שלמעלה, זה יהיה databaseIp ו-databasePort. זהו אותו תחביר שבו משתמשים כדי להצהיר על הפניות. אפשר גם להפנות לפריטים ברשימה, למשל: $ref.template.property[0].

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

תיאור פלטים בסכימות

בתבניות שיש להן סכימות נלוות, אפשר להוסיף פרטים נוספים על מאפייני הפלט. ‫Deployment Manager לא אוכף או מאמת מידע כלשהו בקטע של הפלט, אבל כדאי להשתמש בקטע הזה כדי לספק מידע נוסף על פלטים רלוונטיים, לטובת משתמשים שמשתמשים בתבניות שלכם.

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

...
outputs:
  databaseIp:
    description: Reference to ip address of your new cluster
    type: string
  databasePort:
    description: Port to talk on
    type: integer

המשתמשים יכולים לעיין בקובץ הסכימה כדי להבין את השימוש ואת הסוג של הפלט.

חיפוש ערכי פלט סופיים

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

layout: |
  resources:
  - name: vm_template
    outputs:
    - finalValue: 104.197.69.69
      name: databaseIp
      value: $(ref.vm-test.networkInterfaces[0].accessConfigs[0].natIP)
    properties:
      zone: us-central1-a
    resources:
    - name: datadisk-example-instance
      type: compute.v1.disk
    - name: vm-test
      type: compute.v1.instance
    type: vm_template.jinja
name: manifest-1455057116997

הימנעות מתלות מעגלית

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

resources:
- name: frontend
  type: frontend.jinja
  properties:
    ip: $(ref.backend.ip)
- name: backend
  type: backend.jinja
  properties:
    ip: $(ref.frontend.ip)

כדוגמה לתלות מעגלית שגורמת לפריסה להיכשל, נניח שגם frontend.jinja וגם backend.jinja נראים כך:

resources:
- name: {{ env['name'] }}
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    ...
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          export IP={{ properties["ip"] }}
      ...

outputs:
- name: ip
  value: $(ref.{{ env['name'] }}.networkInterfaces[0].accessConfigs[0].natIP)

נזכיר ששני המשאבים השתמשו במאפיין הפלט של כתובת ה-IP מהמשאב הנגדי:

resources:
- name: frontend
  type: frontend.jinja
  properties:
    ip: $(ref.backend.ip)
- name: backend
  type: backend.jinja
  properties:
    ip: $(ref.frontend.ip)

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

resources:
- name: frontend
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    ...
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          export IP=$(ref.backend.networkInterfaces[0].accessConfigs[0].natIP)
- name: backend
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    ...
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          export IP=$(ref.frontend.networkInterfaces[0].accessConfigs[0].natIP)

אם מנסים להריץ הגדרה, Deployment Manager מחזיר שגיאה:

 code: u'CONDITION_NOT_MET'
 message: u'A dependency cycle was found amongst backend, frontend.'>]>

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

  1. ‫frontend.jinja יצר שתי מכונות וירטואליות, vm-1 ו-vm-2.
  2. ‫backend.jinja יצר את vm-3 ואת vm-4.
  3. המכונה הווירטואלית vm-1 חשפה את כתובת ה-IP החיצונית שלה כפלט, והמכונה הווירטואלית vm-4 השתמשה בפלט הזה.
  4. המכונה הווירטואלית vm-3 חשפה כתובת IP חיצונית כפלט, והמכונה הווירטואלית vm-2 השתמשה בפלט הזה.

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