建立基本範本

對簡單的工作負載而言,基本的設定檔可能已經足夠,但對於較複雜的架構或您打算重複使用的設定而言,您可以將設定拆分為範本。

範本是一個獨立檔案,可匯入並做為設定中的類型。您可以在設定中使用任意數量的範本,Deployment Manager 會以遞迴方式展開任何匯入的範本以建立完整的設定。

範本可讓您將設定分成不同的部分,讓您可以在不同的部署作業中使用和重複使用這些部分。您可以根據需要製作一般或特定的範本。使用範本時,您還可以利用範本屬性、環境變數、模組和其他範本功能等特點來建立動態設定和範本檔案。

事前準備

範本語法

範本可以使用 Jinja 2.8Python 2.7 編寫。Jinja 可更密切地對應 YAML 語法,因此如果您更熟悉 YAML 的話,使用 Jinja 編寫範本可能會更容易。

您也可以使用 Python 編寫範本檔案,並利用 Python 來透過程式產生範本的各個部分。例如,您可以使用 Python 程式庫將範本定義格式化。如果您熟悉 Python,這可能是較佳的格式。

Deployment Manager 接受 Jinja 和 Python 檔案,因此要使用何種語法純屬個人偏好問題。此外,您也可以混和使用不同的範本,以及選擇使用 Jinja 或 Python 編寫不同的範本,並將兩種範本匯入同一個設定中。

建立基本範本

範本是您使用 Jinja 或 Python 編寫所建立的檔案。舉例來說,請考量下列的設定檔:

# 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: vm-created-by-deployment-manager
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: global/networks/default

這項設定有效,但您可以將不同部分拆分為可以重複使用的個別範本檔案,藉此進一步簡化設定。如要根據上述設定建立範本,請擷取相關資源的區段,並建立新的 Jinja 或 Python 檔案。

Jinja

- name: vm-template
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: global/networks/default

Python

Python 範本只有兩項要求:

  • 範本必須定義一個名為 GenerateConfig()generate_config() 的方法。如果在同一個範本中使用這兩種方法名稱,系統將會優先採用 generate_config() 方法。
  • 該方法必須傳回有效的 YAML 設定。

除此之外,您也可以決定是否要產生範本的內容。

範例

resources.append({
    'name': 'vm-template',
    'type': 'compute.v1.instance',
    'properties': {
        'zone': 'us-central1-a',
        'machineType': 'zones/us-central1-a/machineTypes/n1-standard-1',
        'disks': [{
            'deviceName': 'boot',
            'type': 'PERSISTENT',
            'boot': True,
            'autoDelete': True,
            'initializeParams': {
                'sourceImage':
                    'projects/debian-cloud/global/images/family/debian-9'
            }
        }],
        'networkInterfaces': [{
            'network': 'global/networks/default'
        }]
    }
})

如需完整的 Python 範例,請參閱 Deployment Manager GitHub 存放區

匯入範本

建立範本後,請將其匯入設定檔以便使用。如要匯入範本,請在設定中加入 imports 區段,再加上目前目錄的相對或絕對路徑。例如,您可以將下列指令行新增至設定頂端,以便匯入前一步驟中的虛擬機器範本:

imports:
  - path: path/to/my_vm_template.jinja

如果您的檔案路徑很長,您可以提供選用的 name 屬性來做為該檔案的別名。您稍後可以使用此名稱來參照該範本。如果您未提供名稱,則可以使用 path 來參照該範本。

imports:
  - path: path/to/my_vm_template.jinja
    name: my_renamed_template.jinja

無論範本是使用 Jinja 或 Python 編寫,您都可以混和搭配匯入多個範本:

imports:
  - path: path/to/my_vm_template.jinja
    name: my_renamed_template.jinja
  - path: special_vm.py

如果您的範本使用其他範本做為依附元件,請也在設定中匯入該相依範本:

imports:
  - path: path/to/my_vm_template.jinja
  - path: special_vm.py
  - path: base_vm.jinja

您也可以匯入文字檔案以內嵌內容。例如,如果使用以下字串建立名為 resource_type.txt 的檔案:

compute.v1.instance

請將其匯入您的設定並提供內嵌內容,如下所示:

imports:
- path: resource_type.txt

resources:
- name: my-vm
  type: {{ imports["resource_type.txt"] }} # Resolves to "compute.v1.instance"
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

部署範本

匯入範本後,請將該範本做為設定中的類型:

Jinja

imports:
- path: vm-template.jinja

resources:
- name: my-vm
  type: vm-template.jinja

Python

imports:
- path: vm-template.py

resources:
- name: my-vm
  type: vm-template.py

如果您未為範本提供名稱,請使用範本路徑來呼叫範本:

imports:
- path: path/to/my_vm_template.jinja

resources:
- name: my-first-virtual-machine
  type: path/to/my_vm_template.jinja

使用指令列工具直接部署範本

Deployment Manager 提供在 gcloud 指令列工具中直接部署範本的功能,而不是建立頂層設定檔。

舉例來說,下列要求會部署名為 vm_template.jinja 的範本:

gcloud deployment-manager deployments create a-single-vm --template vm_template.jinja

如果您的範本具有範本屬性,您也可以使用 --properties 標記在指令列上設定這些屬性:

gcloud deployment-manager deployments create my-igm \
    --template vm_template.jinja \
    --properties zone:us-central1-a

請注意下列事項:

  • 系統會將所有值剖析為 YAML 值。例如,version: 3 會以整數的形式傳入。如果要將其指定為字串,請用逸出的單引號將值括住,即 version: \'3\'

  • 布林值不區分大小寫,因此系統會將 TRUEtrueTrue 視為相同的值。

  • 您必須傳入範本定義的所有必要屬性,而不能只提供那些屬性的子集。如果某些屬性具有預設值,則可以在指令列中省略該屬性。

如要指定多個屬性,請提供以逗號分隔的鍵/值組合。這些組合的指定順序並不重要。例如:

gcloud deployment-manager deployments create my-igm 
--template vm_template.jinja
--properties zone:us-central1-a,machineType:n1-standard-1,image:debian-9

執行此指令後,Deployment Manager 便會使用您提供的範本建立部署作業。您可以使用 Google Cloud Platform 主控台或 gcloud 工具來確認是否已建立部署作業。如要瞭解如何查看部署作業,請參閱查看資訊清單

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Deployment Manager Documentation