创建基本模板

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

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

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

如需查看可在您自己的部署中使用的模板的示例,请参阅 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-11
    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-11
    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-11'
            }
        }],
        '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 能在 Google Cloud CLI 中直接部署模板,而不是创建顶层配置文件。

例如,以下请求部署了名为 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 会利用您提供的模板创建部署。您可以使用 控制台或 gcloud CLI Google Cloud 来确认部署已创建。如需了解如何查看 部署,请阅读 查看清单

后续步骤