כשיוצרים פריסה, יכול להיות שתרצו לחשוף מאפייני מפתח של ההגדרות או התבניות שלכם כדי שתבניות או משתמשים אחרים יוכלו להשתמש בהם. לדוגמה, יכול להיות שתרצו לחשוף את כתובת ה-IP של מסד נתונים שנוצר בתבנית, כדי שהמשתמשים יוכלו להשתמש בכתובת ה-IP בקלות כשהם מגדירים תבניות משלהם.
אתם יכולים להשתמש בקטע outputs בתבנית או בהגדרה כדי להגדיר רשימה של צמדים של מפתח וערך שהמשתמשים יכולים להפעיל. בקטע הפלט, מגדירים מפתחות שרירותיים ומקצים להם ערך של הפניה, של מאפיין של תבנית או של משתנה סביבה.
המשתמשים יכולים להשתמש בפלט כדי לגשת למידע חשוב על משאבים שנוצרו על ידי התבנית. לדוגמה, אפשר להצהיר על פלט בשם databaseIP שמפנה לכתובת ה-IP של מופע שמארח מסד נתונים, ומשתמשים יכולים להפנות לפלט הזה בתבניות אחרות באותו פריסה.
לפני שמתחילים
- אם רוצים להשתמש בדוגמאות לשורת הפקודה במדריך הזה, צריך להתקין את כלי שורת הפקודה`gcloud`.
- כדי להשתמש בדוגמאות ל-API במדריך הזה, צריך להגדיר גישה ל-API.
- איך יוצרים הגדרה בסיסית
דוגמה
זוהי תבנית לדוגמה עם פלט:
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
כך הפלט עשוי להיראות בתבנית מלאה:
ערכי הפלט יכולים להיות:
- מחרוזת סטטית
- קובץ עזר לנכס
- מאפיין תבנית
- משתנה סביבה
שימוש בפלט מתבניות
כדי להשתמש בפלט שהוגדר בתבנית, מייבאים את התבנית שמכילה את הפלט ומשתמשים בה כסוג. לדוגמה, כדי להשתמש בפלטים שהוגדרו בתבנית שנקראת template_with_outputs.jinja, צריך לייבא אותה ולהשתמש בה כדי ליצור משאב:
כדי לקרוא לפלט, משתמשים בפורמט הבא:
$(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.'>]>
עם זאת, התבנית הזו תפעל אם:
- frontend.jinja יצר שתי מכונות וירטואליות, vm-1 ו-vm-2.
- backend.jinja יצר את vm-3 ואת vm-4.
- המכונה הווירטואלית vm-1 חשפה את כתובת ה-IP החיצונית שלה כפלט, והמכונה הווירטואלית vm-4 השתמשה בפלט הזה.
- המכונה הווירטואלית vm-3 חשפה כתובת IP חיצונית כפלט, והמכונה הווירטואלית vm-2 השתמשה בפלט הזה.