Heat Orchestration Template (HOT) 指南

HOT 是 heat 支持的模板格式,以及另一种模板格式,即 Heat CloudFormation 兼容格式 (CFN)。本指南面向模板作者,并解释如何基于示例编写 HOT 模板。HOT 的详细规范可以在 Heat Orchestration Template (HOT) 规范 中找到。

状态

HOT 正在逐渐超越 CFN 的功能。每当 HOT 实现新功能时,本指南将定期更新。

编写一个 “Hello World” HOT 模板

本节介绍如何编写 HOT 模板,从非常基本的步骤开始,然后通过示例逐步深入。

最基本的模板

您可以想到的最基本的模板可能只包含一个资源定义,仅使用预定义的属性(以及强制性的 Heat 模板版本标签)。例如,下面的模板可用于简单地部署单个计算实例。

heat_template_version: 2015-04-30

description: Simple template to deploy a single compute instance

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      key_name: my_key
      image: F18-x86_64-cfntools
      flavor: m1.small

每个 HOT 模板都必须包含 heat_template_version 键,以及 HOT 的有效版本,例如 2015-10-15(请参阅 Heat 模板版本 以获取所有版本的列表)。虽然 description 是可选的,但包含一些描述用户可以使用模板的有用文本是一个好的做法。如果您想提供更长的描述,而无法适应单行,则可以在 YAML 中提供多行文本,例如

description: >
  This is how you can provide a longer description
  of your template that goes over several lines.

resources 部分是必需的,并且必须包含至少一个资源定义。在上面的示例中,计算实例使用固定值定义了 ‘key_name’、‘image’ 和 ‘flavor’ 参数。

请注意,所有这些元素,即具有给定名称的密钥对、镜像和 flavor 必须存在于使用模板的 OpenStack 环境中。通常,通过定义一组 input parameters 而不是硬编码这些值,可以使模板更易于重用。

模板输入参数

在 HOT 模板的 parameters 部分中定义的输入参数(请参阅 Parameters 部分)允许用户在部署期间自定义模板。例如,这允许提供自定义密钥对名称或镜像 ID 以用于部署。从模板作者的角度来看,这有助于通过避免硬编码假设来使模板更易于重用。

坚持使用上面的示例,让用户提供他们自定义的密钥对、提供他们自己的镜像,并为计算实例选择 flavor 是有意义的。可以通过如下扩展初始模板来实现

heat_template_version: 2015-04-30

description: Simple template to deploy a single compute instance

parameters:
  key_name:
    type: string
    label: Key Name
    description: Name of key-pair to be used for compute instance
  image_id:
    type: string
    label: Image ID
    description: Image to be used for compute instance
  instance_type:
    type: string
    label: Instance Type
    description: Type of instance (flavor) to be used

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      key_name: { get_param: key_name }
      image: { get_param: image_id }
      flavor: { get_param: instance_type }

在上面的示例中,定义了三个输入参数,需要在部署时由用户提供。相应资源属性的固定值已被替换为通过 get_param 函数对相应输入参数的引用(请参阅 Intrinsic 函数)。

您还可以为输入参数定义默认值,如果用户在部署期间未提供相应的参数,则将使用这些默认值。例如,以下 instance_type 参数的定义,除非用户另有指定,否则将选择 ‘m1.small’ flavor。

parameters:
  instance_type:
    type: string
    label: Instance Type
    description: Type of instance (flavor) to be used
    default: m1.small

可以为参数指定的另一个选项是隐藏其值,当用户请求从模板部署的堆栈的信息时。这通过 hidden 属性实现,例如,当请求用户输入的密码时很有用

parameters:
  database_password:
    type: string
    label: Database Password
    description: Password to be used for database
    hidden: true

限制用户输入

在某些情况下,您可能希望限制用户可以提供的输入参数的值。例如,您可能知道在计算实例中运行的软件需要一定量的资源,因此您可能希望限制上面介绍的 instance_type 参数。HOT 模板中的参数可以通过添加 constraints 部分来限制(请参阅 Parameter Constraints)。例如,以下内容将仅允许提供三个值作为 instance_type 参数的输入

parameters:
  instance_type:
    type: string
    label: Instance Type
    description: Type of instance (flavor) to be used
    constraints:
      - allowed_values: [ m1.medium, m1.large, m1.xlarge ]
        description: Value must be one of m1.medium, m1.large or m1.xlarge.

constraints 部分允许定义必须由用户输入满足的所有约束的列表。例如,以下约束列表可用于清楚地指定用户提供的密码的格式要求

parameters:
  database_password:
    type: string
    label: Database Password
    description: Password to be used for database
    hidden: true
    constraints:
      - length: { min: 6, max: 8 }
        description: Password length must be between 6 and 8 characters.
      - allowed_pattern: "[a-zA-Z0-9]+"
        description: Password must consist of characters and numbers only.
      - allowed_pattern: "[A-Z]+[a-zA-Z0-9]*"
        description: Password must start with an uppercase character.

请注意,您可以定义相同类型的多个约束。特别是在允许的模式的情况下,这不仅可以使正则表达式简单易于维护,还可以使向用户呈现的错误消息精确。

提供模板输出

除了通过输入参数进行模板自定义外,您通常还希望向用户提供输出,这可以在模板的 outputs 部分完成(请参阅 Outputs 部分)。例如,应向用户提供可以通过上面示例中定义的实例访问的 IP 地址。否则,用户将不得不自己查找它。提供计算实例的 IP 地址作为输出的定义如下所示

outputs:
  instance_ip:
    description: The IP address of the deployed instance
    value: { get_attr: [my_instance, first_address] }

输出值通常使用内部函数解析,例如上面示例中的 get_attr 函数(请参阅 Intrinsic 函数)。