Ketika membuat deployment, Anda mungkin ingin mengekspos properti utama konfigurasi atau template Anda agar dapat digunakan oleh template atau pengguna lain. Misalnya, Anda mungkin ingin mengekspos alamat IP database yang dibuat dalam template sehingga pengguna dapat dengan mudah merujuk IP saat mengonfigurasi template mereka sendiri.
Anda dapat menggunakan bagian outputs dalam template atau konfigurasi untuk
menentukan daftar key-value pair yang dapat dipanggil pengguna. Di bagian output,
Anda menentukan kunci arbitrer dan menetapkan nilai kunci ke
referensi,
properti template,
atau variabel lingkungan.
Pengguna dapat menggunakan output untuk mengakses informasi penting tentang resource
yang dibuat oleh template. Misalnya, Anda dapat mendeklarasikan output bernama databaseIP
yang mereferensikan alamat IP instance yang menghosting database, dan pengguna dapat mereferensikan output tersebut dalam template lain pada deployment yang sama.
Sebelum memulai
- Jika Anda ingin menggunakan contoh command line dalam panduan ini, instal alat command line`gcloud`.
- Jika Anda ingin menggunakan contoh API dalam panduan ini, siapkan akses API.
- Memahami cara membuat konfigurasi dasar.
Contoh
Berikut adalah contoh template dengan output:
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
Bagian output mendeklarasikan dua properti: databaseIp
dan databasePort
.
databaseIp
menggunakan referensi yang di-resolve ke alamat IP jaringan
resource master, sedangkan databasePort
adalah nilai statis. Di template lain,
Anda dapat mengimpor mongodb.jinja
, menggunakan template sebagai jenis, dan memanggil
output. Contoh:
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)
Mendeklarasikan output
Deklarasikan output dalam template atau konfigurasi dengan menentukan
bagian outputs:
pada tingkat yang sama dengan bagian resources:
. Kunci output harus unik dalam template atau konfigurasi.
Misalnya, contoh bagian outputs:
mungkin terlihat seperti ini:
... outputs: - name: databaseIp value: $(ref.my-first-vm.networkInterfaces[0].accessConfigs[0].natIP) - name: machineType value: {{ properties['machineType'] }} - name: databasePort value: 88
Berikut tampilan output dalam template lengkap:
Nilai output dapat berupa:
- {i>String<i} statis
- Referensi ke properti
- Properti template
- Variabel lingkungan
Menggunakan output dari template
Untuk menggunakan output yang telah ditentukan dalam template, impor dan gunakan template yang berisi output sebagai jenis. Misalnya, untuk menggunakan output yang ditentukan dalam template bernama template_with_outputs.jinja
, output harus diimpor dan digunakan untuk membuat resource:
Untuk memanggil output, gunakan format berikut:
$(ref.RESOURCE.OUTPUT)
RESOURCE
adalah nama resource yang dibuat oleh template. Pada contoh di atas, nilainya adalahmy-first-vm
.OUTPUT
adalah output yang dideklarasikan dalam template. Pada contoh di atas, nilainya adalahdatabaseIp
dandatabasePort
. Ini adalah sintaksis yang sama dengan yang Anda gunakan untuk mendeklarasikan referensi. Anda juga dapat mereferensikan item daftar, misalnya:$ref.template.property[0]
.
Saat Anda men-deploy konfigurasi, Deployment Manager akan memperluas konfigurasi, lalu mengganti referensi ke output dengan nilai output.
Mendeskripsikan output dalam skema
Untuk template yang memiliki skema yang menyertainya, Anda dapat mendeskripsikan properti output secara lebih mendetail. Deployment Manager tidak menerapkan atau memvalidasi informasi apa pun di bagian output, tetapi akan sangat membantu jika menggunakan bagian ini untuk memberikan informasi lebih lanjut tentang output yang relevan, demi kepentingan pengguna yang menggunakan template Anda.
Di file skema, berikan bagian output yang cocok dengan output di template Anda. Contoh:
...
outputs:
databaseIp:
description: Reference to ip address of your new cluster
type: string
databasePort:
description: Port to talk on
type: integer
Pengguna dapat merujuk file skema Anda untuk memahami penggunaan dan jenis output Anda.
Mencari nilai output akhir
Setelah Anda men-deploy template yang menggunakan output, lihat nilai output akhir dengan
melihat tata letak konfigurasi
deployment. Nilai output akhir ditunjukkan oleh properti finalValue
. Semua nilai output disertakan dalam kolom ini, termasuk nilai output
dari template bertingkat. Contoh:
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
Menghindari dependensi sirkular
Berhati-hatilah saat membuat template ketika dua resource atau lebih bergantung pada output satu sama lain. Deployment Manager tidak mencegah struktur ini, tetapi jika output menyebabkan dependensi sirkular, deployment tidak akan berhasil di-deploy. Misalnya, cuplikan berikut diterima oleh Deployment Manager tetapi jika konten template menyebabkan dependensi sirkular, deployment akan gagal:
resources:
- name: frontend
type: frontend.jinja
properties:
ip: $(ref.backend.ip)
- name: backend
type: backend.jinja
properties:
ip: $(ref.frontend.ip)
Sebagai contoh dependensi sirkular dengan deployment gagal, asumsikan frontend.jinja dan backend.jinja terlihat seperti ini:
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)
Ingat bahwa kedua resource menggunakan properti output IP dari resource yang berlawanan:
resources:
- name: frontend
type: frontend.jinja
properties:
ip: $(ref.backend.ip)
- name: backend
type: backend.jinja
properties:
ip: $(ref.frontend.ip)
Namun, tidak ada nilai IP yang dapat diisi karena kedua properti ini bergantung pada keberadaan resource lain, sehingga menghasilkan dependensi sirkular. Berikut adalah template yang sama, yang telah diperluas sepenuhnya:
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 akan menampilkan error jika Anda mencoba menjalankan konfigurasi:
code: u'CONDITION_NOT_MET'
message: u'A dependency cycle was found amongst backend, frontend.'>]>
Namun, template ini akan berfungsi jika:
- frontend.jinja membuat dua {i>instance<i} mesin virtual, vm-1 dan vm-2.
- backend.jinja membuat vm-3 dan vm-4.
- {i>vm-1<i} mengekspos IP eksternalnya sebagai {i>output<i} dan vm-4 menggunakan {i>output<i} itu.
- {i>vm-3<i} mengekspos IP eksternal sebagai {i>output<i}, vm-2 menggunakan {i>output<i} tersebut.
Langkah selanjutnya
- Membuat deployment.
- Pelajari template lebih lanjut.