模板组合¶
在编写复杂的模板时,建议将模板分解为单独的较小模板。然后可以使用模板资源将它们组合在一起。这是一种使用模板定义资源,从而使用多个模板组合一个逻辑堆栈的机制。
模板资源提供类似于 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 而不是模板资源标识符。