创建基本模板

对于简单工作负载而言,基本配置文件可能已足够,但对于更为复杂的架构或打算重复使用的配置,您可以将配置拆分为多个模板。

模板是指导入到配置中并用作类型的独立文件。您可以在配置中使用任意数量的模板。

您可以借助模板将配置分成不同的部分,以便使用并在不同的部署中重复使用。模板可以根据需要进行通用化或具体化。另外,借助模板,您还可以利用模板属性、环境变量、模块和其他模板功能等来创建动态配置和模板文件。

如需查看可在您自己的部署中使用的模板的示例,请参阅 Deployment Manager GitHub 代码库

准备工作

模板语法

模板可以采用 Jinja 2.10.xPython 3.x 编写。Jinja 更接近 YAML 语法,因此如果您更熟悉 YAML,在 Jinja 中编写模板会更加容易。

您还可以使用 Python 编写模板文件,并利用 Python 以编程方式生成模板的各个部分。例如,您可以使用 Python 库来格式化模板定义。如果您熟悉 Python,此格式可能更适合您。

Deployment Manager 接受 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 文件。

以下摘要显示了可简化部署的模板部分。要查看完整模板,请点击在 GitHub 上查看

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(context)generate_config(context) 的方法。如果您在同一模板中同时使用这两个方法名称,则 generate_config() 方法的优先级更高。

    context 对象包含关于部署和环境的元数据,比如部署名称,当前项目等。详细了解如何使用特定于部署的环境变量

  • 该方法必须返回 Python 字典

除此之外,您可以自行生成模板的内容。

示例

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 Console 或 gcloud 工具确认是否已创建部署。如需了解如何查看部署,请阅读查看清单

后续步骤