Memahami template yang dapat digunakan kembali

Saat mengembangkan aplikasi, Anda kemungkinan besar memerlukan arsitektur yang kompleks. Agar deployment lebih mudah direplikasi dan memecahkan masalah, sebaiknya Anda memecah konfigurasi menjadi template.

Template adalah file terpisah yang mendefinisikan sekumpulan resource. Anda dapat menggunakan kembali template di berbagai deployment, yang akan menciptakan konsistensi di seluruh deployment yang kompleks.

Anda dapat menggunakan Python atau Jinja2 untuk membuat template untuk Deployment Manager. Sebaiknya gunakan template Python karena Python memungkinkan fleksibilitas yang lebih besar dan lebih banyak fitur seiring skala aplikasi Anda.

Template Python

Jika Anda memilih untuk menulis template di Python, template Anda harus memenuhi persyaratan berikut:

  • Template harus ditulis dalam Python 3.x

  • Template harus menentukan metode yang disebut GenerateConfig(context) atau generate_config(context). Jika Anda menggunakan kedua nama metode dalam template yang sama, metode generate_config() akan diprioritaskan.

    Objek context berisi metadata tentang deployment dan lingkungan Anda, seperti nama deployment, project saat ini, dan sebagainya. Anda akan menggunakan variabel khusus deployment ini di langkah-langkah berikutnya.

  • Metode tersebut harus menampilkan kamus Python.

Memeriksa contoh template

Dari repositori contoh, buka vm-template.py:

cd deploymentmanager-samples/examples/v2/step_by_step_guide/step5_create_a_template/python

nano vm-template.py  # use your preferred text editor

Template ini menentukan mesin virtual (VM) pertama dari contoh sebelumnya:

# 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.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(unused_context):
  """Creates the first virtual machine."""

  resources = [{
      'name': 'the-first-vm',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': 'us-central1-f',
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/MY_PROJECT',
                                  '/zones/us-central1-f/',
                                  'machineTypes/f1-micro']),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-11'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Buka template kedua, vm-template-2.py, yang menentukan VM kedua:

# 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.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(unused_context):
  """Creates the second virtual machine."""

  resources = [{
      'name': 'the-second-vm',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': 'us-central1-f',
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/MY_PROJECT',
                                  '/zones/us-central1-f/',
                                  'machineTypes/g1-small']),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global',
                                          '/images/family/debian-11'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Di kedua template, ganti MY_PROJECT dengan project ID Anda.

Mengimpor template

Setelah membuat template, Anda harus mengimpornya ke konfigurasi. Buka two-vms.yaml baru:

cd deploymentmanager-samples/examples/v2/step_by_step_guide/step5_create_a_template/python

nano two-vms.yaml  # use your preferred text editor

File konfigurasi ini memiliki bagian imports baru yang memanggil dua template VM, vm-template.py dan vm-template-2.py:

# 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: vm-template.py
- path: vm-template-2.py

# In the resources section below, the properties of the resources are replaced
# with the names of the templates.
resources:
- name: vm-1
  type: vm-template.py
- name: vm-2
  type: vm-template-2.py
- name: a-new-network
  type: compute.v1.network
  properties:
    routingConfig:
      routingMode: REGIONAL
    autoCreateSubnetworks: true

Catatan tentang nama resource

Saat Anda menggunakan template, nama resource ditetapkan menggunakan kolom name yang disediakan dalam template, bukan nama dalam file konfigurasi.

Misalnya, dalam kasus ini, instance VM dibuat menggunakan nama dalam template, the-first-vm dan the-second-vm. Nilai vm-1 dan vm-2, yang ditentukan dalam konfigurasi, digunakan untuk memberi nama pembuatan instance template, tetapi bukan merupakan nama resource.

Menyimpan konfigurasi Anda dan men-deploy-nya

Untuk men-deploy konfigurasi, jalankan perintah ini:

gcloud deployment-manager deployments create deployment-with-templates --config two-vms.yaml

Untuk melihat deployment Anda, jalankan perintah ini:

gcloud deployment-manager deployments describe deployment-with-templates

Rencana ke depan: menggunakan beberapa template

Pada langkah berikutnya, Anda akan menggabungkan template sehingga konfigurasi hanya memanggil satu template untuk men-deploy semua resource.

Menghapus deployment Anda

Sebelum melanjutkan, sebaiknya Anda menghapus deployment untuk menghindari biaya. Anda tidak memerlukan deployment ini untuk langkah berikutnya. Jalankan perintah berikut untuk menghapus deployment:

gcloud deployment-manager deployments delete deployment-with-templates