OpenStack Heat 编排服务概念

Heat 是 OpenStack 的核心编排服务(Orchestration Service)🔥,通过声明式模板定义一组云资源及其依赖关系,实现基础设施即代码(IaC),自动化完成资源的创建、更新与删除。

核心设计理念:将基础设施部署转化为代码化模板,实现可重复、可版本控制、可自动化编排的云资源管理。


一、HOT 模板语法

Heat Orchestration Template(HOT)是基于 YAML 的声明式模板格式,是 Heat 的核心编排语言📝。

模板顶层结构

HEAT_TEMPLATE_VERSION: 2016-10-14
DESCRIPTION: 描述模板用途

PARAMETER_GROUPS:
  - LABEL: 网络配置
    PARAMETERS:
      - NETWORK_NAME
      - SUBNET_CIDR

PARAMETERS:
  NETWORK_NAME:
    TYPE: STRING
    LABEL: 网络名称
    DEFAULT: MY-NETWORK

RESOURCES:
  MY_NETWORK:
    TYPE: OS::NEUTRON::NET
    PROPERTIES:
      NAME: { GET_PARAM: NETWORK_NAME }

  MY_SERVER:
    TYPE: OS::NOVA::SERVER
    DEPENDS_ON: MY_NETWORK
    PROPERTIES:
      NAME: MY-INSTANCE
      FLAVOR: M1.SMALL
      IMAGE: CIRROS-0.6.2
      NETWORKS:
        - NETWORK: { GET_RESOURCE: MY_NETWORK }

OUTPUTS:
  INSTANCE_IP:
    DESCRIPTION: 实例IP地址
    VALUE: { GET_ATTR: [MY_SERVER, FIRST_ADDRESS] }

模板版本

版本特性
2013-05-23HOT v1.0 初始版本
2014-10-16新增 STR_REPLACEGET_FILEREPEAT
2015-04-30新增 CONDITIONS 条件判断
2016-10-14新增 PARAMETER_GROUPS
2018-03-02增强 GET_ATTR 嵌套引用

二、三大核心概念

1. Stack(栈)📦

Stack 是 Heat 的基本部署单元,一次模板部署即产生一个 Stack。

属性说明
名称唯一标识一个 Stack
模板Stack 引用的 HOT 模板
参数部署时传入的具体参数值
状态IN_PROGRESSCOMPLETE / FAILED
输出部署完成后返回的信息

Stack 生命周期:

CREATE_IN_PROGRESS → CREATE_COMPLETE
                      ↘ (回滚) → ROLLBACK_COMPLETE
UPDATE_IN_PROGRESS → UPDATE_COMPLETE
DELETE_IN_PROGRESS → DELETE_COMPLETE

嵌套 Stack(Nested Stack):通过 OS::HEAT::STACK 类型引用子模板,实现模块化编排。

2. Resource(资源)📋

Resource 是 Stack 内被管理的具体 OpenStack 云资源。资源类型命名格式:OS::<服务>::<类型>

资源类型对应服务说明
OS::NOVA::SERVERNova虚拟机实例
OS::NEUTRON::NETNeutron网络
OS::NEUTRON::SUBNETNeutron子网
OS::NEUTRON::PORTNeutron端口
OS::NEUTRON::ROUTERNeutron路由器
OS::CINDER::VOLUMECinder云硬盘
OS::GLANCE::IMAGEGlance镜像
OS::HEAT::AUTOSCALING_GROUPHeat 内置自动伸缩组
OS::HEAT::RESOURCE_GROUPHeat 内置批量创建同类资源
OS::HEAT::STACKHeat 内置嵌套 Stack
OS::HEAT::SOFTWARE_CONFIGHeat 内置用户数据脚本配置

资源间关系建立方式:

  • DEPENDS_ON — 显式声明依赖
  • GET_RESOURCE — 引用同 Stack 内其他资源的 ID
  • GET_ATTR — 获取资源的运行时属性
  • 自动推理 — Heat 引擎根据 PROPERTIES 引用自动推断隐式依赖

3. Parameter(参数)🔧

Parameter 是模板的输入变量,让模板在不同环境间复用:

PARAMETERS:
  INSTANCE_TYPE:
    TYPE: STRING
    LABEL: 实例规格
    DEFAULT: M1.SMALL
    CONSTRAINTS:
      - ALLOWED_VALUES: [M1.SMALL, M1.MEDIUM, M1.LARGE]
  ADMIN_PASSWORD:
    TYPE: STRING
    LABEL: 管理员密码
    HIDDEN: TRUE
    NO_ECHO: TRUE
参数类型说明
STRING字符串
NUMBER数字
JSONJSON 格式数据
COMMA_DELIMITED_LIST逗号分隔列表
BOOLEAN布尔值
MAP键值对映射

环境文件(Environment File):将参数值与模板分离,独立存储:

# ENVIRONMENT.YAML
PARAMETERS:
  INSTANCE_TYPE: M1.LARGE
RESOURCE_REGISTRY:
  "OS::NOVA::SERVER": "CUSTOM_SERVER.YAML"

三、架构组件

用户 (CLI / Horizon / API)
        │
        ▼
  ┌──────────┐   ┌──────────────────┐
  │ HEAT-API │──▶│   HEAT-API-CFN   │── AWS CloudFormation 兼容 API
  └────┬─────┘   └────────┬─────────┘
       │                  │
       ▼                  ▼
  ┌──────────────────────────────┐
  │        HEAT-ENGINE           │ ← 核心编排引擎
  │  (依赖解析 + 任务编排 + 回滚) │
  └──────┬───────┬───────┬───────┘
         │       │       │
         ▼       ▼       ▼
    OpenStack 服务 (Nova / Neutron / Cinder / ...)

heat-api — REST API 入口 🚪

  • 暴露原生 Heat REST API(端口 8004)
  • 接收模板提交与 Stack 操作请求
  • 与 Keystone 集成进行认证鉴权

heat-api-cfn — CloudFormation 兼容 API 🔄

  • 暴露 AWS CloudFormation 兼容的 Query API(端口 8000)
  • 允许 AWS CloudFormation 工具/脚本直接对接 OpenStack
  • 提供从 AWS 迁移到 OpenStack 的便捷路径

heat-engine — 核心编排引擎 ⚙️

职责说明
模板解析解析并验证 HOT 模板语法
依赖分析构建资源依赖 DAG 图,确定执行拓扑顺序
任务编排按依赖顺序逐步执行资源操作(并行创建无依赖资源)
回滚处理资源创建失败时自动回滚已成功的资源
内置函数运行时求值 GET_RESOURCEGET_ATTRGET_PARAM
收敛修正STACK UPDATE 检测差异并执行增量变更

四、与 AWS CloudFormation 兼容性

Heat 在设计上兼容 AWS CloudFormation 的模板语法和 API 风格,便于混合云或从 AWS 迁移的场景🔄。

对比维度HeatAWS CloudFormation
模板格式YAML(HOT)YAML / JSON
原生 APIRESTful(端口 8004)AWS API
兼容 APIheat-api-cfn(端口 8000)-
资源类型OS::* 命名空间AWS::* 命名空间
状态管理OpenStack DatabaseAWS 托管
回滚策略内建支持内建支持

五、常用操作命令

# 创建 Stack
openstack stack create -T TEMPLATE.YAML -E ENVIRONMENT.YAML MY-STACK

# 列出 Stack
openstack stack list

# 查看 Stack 详情
openstack stack show MY-STACK

# 查看 Stack 资源列表
openstack stack resource list MY-STACK

# 更新 Stack
openstack stack update -T TEMPLATE.YAML -E ENVIRONMENT.YAML MY-STACK

# 删除 Stack
openstack stack delete MY-STACK

# 查看 Stack 事件(排错用)
openstack stack event list MY-STACK

# 查看模板输出
openstack stack output show MY-STACK OUTPUT_NAME

六、Heat vs Terraform 对比 ⚖️

维度HeatTerraform
云平台仅 OpenStack多云(AWS/Azure/GCP 等)
模板语言YAML(HOT)HCL
状态管理数据库本地/远程状态文件(tfstate)
变更预览无显式 PlanTERRAFORM PLAN
资源粒度Stack 级整体部署资源级独立管理

一句话概括

Heat 是 OpenStack 的 IaC 编排引擎——通过 HOT 模板定义 Stack(部署单元),Stack 包含 Resource(云资源)和 Parameter(输入参数),heat-engine 解析依赖 DAG 自动按序创建/更新/删除,实现基础设施部署的自动化与可重复。

🔗 相关文档

OpenStack Heat(编排)详解 | OpenStack Nova计算服务概念 | OpenStack Neutron网络概念 | OpenStack Keystone认证服务概念