定義範本屬性

能夠建立和定義自訂範本屬性是使用範本的優點之一。範本屬性是您在範本檔案中定義的任意變數。使用範本的任何設定檔或範本檔都可以提供範本屬性值,因此無需直接變更範本。如此一來,您就能提取屬性,進而變更每個專屬設定的屬性值,而不用更新基礎範本。

舉例來說,下列指令會在機器類型的網址中指定範本屬性:

machineType: zones/{{ properties["zone"] }}/machineTypes/n1-standard-1

在使用此範本的設定中,您可以在範本的 properties 區段設定 zone 的值。

imports:
- path: vm_template.jinja

resources:
- name: my-vm
  type: vm_template.jinja
  properties:
    zone: us-central1-a

Deployment Manager 會將 zone 的值傳入基礎範本。

事前準備

建立範本屬性

如何建立範本屬性:

Jinja

在 Jinja 中,使用下列語法來定義屬性:

{{ properties["PROJECT_NAME"] }}

例如:

- name: vm-{{ env["deployment"] }}
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/{{ properties["zone"] }}/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default

Python

在 Python 中,使用下列語法來定義屬性:

  context.properties["PROPERTY_NAME"]

例如:

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

})

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

在頂層設定中為範本屬性設定值

在頂層設定中,您可以使用下列語法來設定範本屬性值:

imports:
- path: vm_template.jinja

resources:
- name: my-vm
  type: vm_template.jinja
  properties:
    zone: us-central1-a

您必須為範本中的所有範本屬性設定值。舉例來說,如果範本含有 zoneimagenetwork 範本屬性,則您必須在頂層設定中定義這三項屬性的值。

如果某些範本屬性含有預設值,請考慮使用結構定義來設定這些預設值。如果預設值適用於部署作業,則可以在頂層設定中略過具有預設值的範本屬性。

在指令列中設定範本屬性的值

Deployment Manager 可讓您在 Google Cloud CLI 中直接設定這些值,因此無需在匯入範本的上層檔案中提供範本屬性的值。您可以略過建立頂層 YAML 檔案;Deployment Manager 會根據要求中的資訊自動為部署作業產生頂層設定。

比方說,假設您擁有下列範本,其中的範本屬性名為 zone

- name: vm-{{ env["deployment"] }}
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/{{ properties["zone"] }}/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default

您可以使用 Google Cloud CLI 直接傳入此範本檔案,並在指令列中提供範本屬性的值。比方說,下列要求會傳入範本,並直接在指令列中指定 zone 屬性:

gcloud deployment-manager deployments create a-single-vm --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 控制台或 gcloud CLI 確認是否已建立部署。如要瞭解如何查看部署作業,請參閱查看資訊清單

相關資源