模板组合

在编写复杂的模板时,建议将模板分解为单独的较小模板。然后可以使用模板资源将它们组合在一起。这是一种使用模板定义资源,从而使用多个模板组合一个逻辑堆栈的机制。

模板资源提供类似于 AWS::CloudFormation::Stack 资源的功能,但同时也提供了一种

  • 定义新的资源类型并构建自己的资源库。

  • 覆盖现有资源类型的默认行为。

为了实现这一点

  • 编排客户端获取关联的模板文件,并在 files 部分将其传递到 POST stacks/ API 请求中。

  • 编排引擎中的环境管理资源类型到模板创建的映射。

  • 编排引擎将模板参数转换为资源属性。

以下示例说明了如何使用自定义模板来定义新型资源。这些示例使用存储在 my_nova.yaml 文件中的自定义模板

heat_template_version: 2015-04-30

parameters:
  key_name:
    type: string
    description: Name of a KeyPair

resources:
  server:
    type: OS::Nova::Server
    properties:
      key_name: {get_param: key_name}
      flavor: m1.small
      image: ubuntu-trusty-x86_64

将模板文件名用作类型

以下模板将 my_nova.yaml 文件定义为资源 type 属性的值

heat_template_version: 2015-04-30

resources:
  my_server:
    type: my_nova.yaml
    properties:
      key_name: my_key

my_nova.yaml 模板的 key_name 参数从新模板的 key_name 属性获取其值。

注意

上述对 my_nova.yaml 的引用假定它位于同一目录中。您可以使用以下任何一种形式

  • 相对路径 (my_nova.yaml)

  • 绝对路径 (file:///home/user/templates/my_nova.yaml)

  • Http URL (http://example.com/templates/my_nova.yaml)

  • Https URL (https://example.com/templates/my_nova.yaml)

要创建堆栈,请运行

$ openstack stack create -t main.yaml stack1

定义新的资源类型

您可以在环境文件中将名称与 my_nova.yaml 模板关联。如果编排模块已经知道该名称,则您的新资源将覆盖默认资源。

在以下示例中,一个新的 OS::Nova::Server 资源覆盖了同名的默认资源。

一个 env.yaml 环境文件包含新资源的定义

resource_registry:
  "OS::Nova::Server": my_nova.yaml

注意

有关环境文件的更多详细信息,请参阅 环境

现在您可以在新的模板中使用新的 OS::Nova::Server

heat_template_version: 2015-04-30

resources:
  my_server:
    type: OS::Nova::Server
    properties:
      key_name: my_key

要创建堆栈,请运行

$ openstack stack create -t main.yaml -e env.yaml example-two

访问嵌套属性

模板资源具有隐式属性。访问嵌套属性需要 heat_template_version 2014-10-16 或更高版本。可以通过以下方式访问它们

heat_template_version: 2015-04-30

resources:
  my_server:
    type: my_nova.yaml

outputs:
  test_out:
    value: {get_attr: [my_server, resource.server, first_address]}

使您的模板资源更“透明”

注意

自 2015.1 (Kilo) 起可用。

如果您希望能够返回内部资源之一的 ID,而不是嵌套堆栈的标识符,您可以将特殊的保留输出 OS::stack_id 添加到您的模板资源

heat_template_version: 2015-04-30

resources:
  server:
    type: OS::Nova::Server

outputs:
  OS::stack_id:
    value: {get_resource: server}

现在,当您从外部模板使用 get_resource 时,heat 将使用 nova 服务器 ID 而不是模板资源标识符。