定义模板属性

使用模板的一大优势在于能够创建和定义自定义模板属性。模板属性指的是您在模板文件中定义的任意变量。使用相关模板的任何配置文件或模板文件都可以提供模板属性值,无需直接更改模板。这让您可以提取属性,从而无需更新基本模板,即可更改每个唯一配置的属性值。

例如,以下代码行指定了机器类型网址中的模板属性:

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-9
    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-9'
            }
        }],
        '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 可以直接在 gcloud 命令行工具中设置模板属性值,而不是提供导入模板的父文件中的这些值。您可以跳过创建顶层 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-9
    networkInterfaces:
    - network: global/networks/default

gcloud 命令行工具中,您可以直接传入此模板文件,并在命令行中提供模板属性值。例如,以下请求会传入模板,并直接在命令行中指定 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 Console 或 gcloud 工具确认是否已创建部署。如需了解如何查看部署,请阅读查看清单

后续步骤