Memahami template yang dapat digunakan kembali

Saat mengembangkan aplikasi, Anda kemungkinan besar memerlukan arsitektur yang kompleks. Agar deployment lebih mudah direplikasi dan dipecahkan masalahnya, sebaiknya bagi konfigurasi menjadi template.

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

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

Template Python

Jika Anda memilih untuk menulis template dalam 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 ini harus menampilkan kamus Python.

Memeriksa template contoh

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 virtual machine (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 dalam 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 ditentukan menggunakan kolom name yang disediakan dalam template, bukan nama dalam file konfigurasi.

Misalnya, dalam hal 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 nama resource.

Menyimpan konfigurasi dan men-deploynya

Untuk men-deploy konfigurasi, jalankan perintah ini:

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

Untuk melihat deployment, jalankan perintah ini:

gcloud deployment-manager deployments describe deployment-with-templates

Ke depannya: menggunakan beberapa template

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

Menghapus deployment

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

gcloud deployment-manager deployments delete deployment-with-templates