OpenStack Heat(编排)详解

OpenStack Heat(编排)详解

一、核心思想 🌟

Heat 是 OpenStack 的编排服务(Orchestration Service),核心思想是**”基础设施即代码”(Infrastructure as Code)**,通过 HOT 模板定义一组云资源,实现一键式创建、更新、删除。

概念 说明
Stack(栈) 一组被统一管理的云资源的集合,是 Heat 编排的最小部署单元
Resource(资源) 栈中的单个云资源(如虚拟机、网络、磁盘),每个资源有唯一的 type
Parameter(参数) 模板的输入变量,允许用户自定义配置而不修改模板本身

二、HOT 模板结构 📄

HOT(Heat Orchestration Template)使用 YAML 格式,包含四个核心段:

1. 模板版本

1
heat_template_version: 2015-04-30
版本 对应 OpenStack 版本 主要特性
2014-10-16 Juno 初始稳定版
2015-04-30 Kilo 常用稳定版,支持条件函数
2016-10-14 Newton 增强 if 函数
2018-08-31 Rocky 新增 yaql 支持
2021-04-16 Wallaby if 两参数变体

2. 参数定义

1
2
3
4
5
6
7
8
9
10
11
12
parameters:
key_name:
type: string
label: Key Name
description: SSH 密钥对名称
default: my_key
hidden: false
constraints:
- allowed_values: [m1.small, m1.medium, m1.large]
description: 规格必须为可选值之一
- length: { min: 6, max: 8 }
description: 密码长度 6-8

参数类型stringnumberjsoncomma_delimited_listboolean

常用修饰符

  • default — 设置默认值
  • hidden: true — 隐藏输入(如密码)
  • immutable: true — 创建后不可修改
  • constraints — 约束条件

3. 资源定义 🧱

1
2
3
4
5
6
7
8
9
resources:
my_instance:
type: OS::Nova::Server
properties:
name: MyServer
image: { get_param: image_id }
flavor: { get_param: flavor }
key_name: { get_param: key_name }
depends_on: [my_volume]

常用资源类型速查

资源类型 OpenStack 服务 说明
OS::Nova::Server Nova 计算实例
OS::Neutron::Net Neutron 网络
OS::Neutron::Subnet Neutron 子网
OS::Neutron::Port Neutron 端口
OS::Neutron::Router Neutron 路由器
OS::Cinder::Volume Cinder 云硬盘
OS::Cinder::VolumeAttachment Cinder 磁盘挂载
OS::Heat::AutoScalingGroup Heat 自动伸缩组
OS::Heat::RandomString Heat 随机字符串
OS::Keystone::User Keystone 用户
OS::Swift::Container Swift 对象存储容器

4. 输出定义

1
2
3
4
5
6
7
outputs:
instance_ip:
description: 实例 IP 地址
value: { get_attr: [my_instance, first_address] }
instance_id:
description: 实例 UUID
value: { get_resource: my_instance }

三、内置函数 🔧

函数 用途 类比 CloudFormation
get_param 获取参数值 Ref
get_attr 获取资源属性 Fn::GetAtt
get_resource 获取资源引用 Ref(资源本身)
get_file 嵌入外部文件
str_replace 字符串模板替换 Fn::Sub
str_split 字符串分割 Fn::Split
digest 哈希计算
repeat 循环生成值
list_join 列表拼接 Fn::Join
yaql YAML 查询语言(v2018+)

条件函数示例

1
2
3
4
5
6
7
8
conditions:
create_volume: { equals: [{ get_param: volume_size }, "0"] }
large_flavor: { not: { equals: [{ get_param: flavor }, "m1.small"] } }

resources:
my_instance:
type: OS::Nova::Server
condition: large_flavor

四、AWS CloudFormation 兼容性 🔄

Heat 在设计上明确兼容 AWS CloudFormation 模板格式:

对比项 HOT(Heat 原生) CFN(CloudFormation 兼容)
格式 YAML(.yaml) JSON(.json)
资源类型前缀 OS::* AWS::*
函数风格 get_param, get_attr Ref, Fn::GetAtt
API 端点 heat-api heat-api-cfn
  • 通过 heat-api-cfn 组件提供 CloudFormation 兼容 API
  • 已有的 AWS CloudFormation 模板可直接提交给 Heat 执行
  • 支持资源类型映射:AWS::EC2::InstanceOS::Nova::Server

五、Stack 操作生命周期 🔄

1
2
3
4
5
6
7
创建(Create)→ 创建中 → 创建完成

更新(Update)→ 更新中 → 更新完成

回滚(Rollback)→ 回滚中 → 回滚完成

删除(Delete)→ 删除中 → 删除完成

常用 CLI 命令 🖥️

1
2
3
4
5
6
7
openstack stack create -t TEMPLATE.YAML -e ENV.YAML MY_STACK
openstack stack list
openstack stack resource list MY_STACK
openstack stack resource show MY_STACK MY_INSTANCE
openstack stack update -t TEMPLATE.YAML --parameter "FLAVOR=M1.MEDIUM" MY_STACK
openstack stack event list MY_STACK
openstack stack delete MY_STACK

参数覆盖创建

1
2
3
openstack stack create -t TEMPLATE.YAML \
--parameter "KEY_NAME=MY_KEY;IMAGE=CIRROS;FLAVOR=M1.SMALL" \
MY_STACK

六、环境文件(Environment File)📁

环境文件用于分离配置与模板:

1
2
3
4
5
6
7
8
resource_registry:
"OS::Nova::Server::MyServer": myserver.yaml

parameter_defaults:
NetworkName: my_network

parameters:
MyIP: 192.168.0.1

⚠️ parameter_defaults 应用到所有嵌套栈,parameters 仅应用到顶级栈

七、模板组合(Template Composition)🧩

将大型模板拆分为可复用的子模板:

1
2
3
4
5
resources:
my_server:
type: my_nova.yaml
properties:
key_name: { get_param: key_name }

嵌套栈属性访问

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

八、完整编排流程图 🎯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
用户输入 HOT 模板(YAML)


Heat API(heat-api / heat-api-cfn)


Heat Engine(引擎核心)

├── 解析模板(参数绑定、条件判断)
├── 依赖排序(depends_on / 隐式依赖)
├── 逐个调用 OpenStack 服务 API
│ ├── Nova → 创建虚拟机
│ ├── Neutron → 创建网络/子网
│ ├── Cinder → 创建云硬盘
│ └── ...
├── 监控资源创建状态
└── 返回结果(资源 ID、属性等)

九、完整模板示例 📝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
heat_template_version: 2015-04-30

description: 完整的 Heat 编排模板示例

parameters:
key_name:
type: string
label: Key Name
description: 密钥对名称
default: my_key
image:
type: string
description: 镜像名称或 ID
default: cirros
flavor:
type: string
description: 实例规格
default: m1.small
constraints:
- allowed_values: [m1.small, m1.medium, m1.large]

resources:
my_instance:
type: OS::Nova::Server
properties:
name: My Cirros Instance
image: { get_param: image }
flavor: { get_param: flavor }
key_name: { get_param: key_name }

my_volume:
type: OS::Cinder::Volume
properties:
size: 1
name: my_volume

volume_attachment:
type: OS::Cinder::VolumeAttachment
properties:
volume_id: { get_resource: my_volume }
instance_uuid: { get_resource: my_instance }
mountpoint: /dev/vdb

outputs:
instance_name:
description: 获取实例名称
value: { get_attr: [my_instance, name] }
instance_ip:
description: 获取实例 IP 地址
value: { get_attr: [my_instance, first_address] }

十、最佳实践 💡

  1. 使用环境文件分离配置与模板,避免硬编码参数
  2. 合理设置 depends_on 确保资源创建顺序
  3. 使用 parameter_defaults 统一管理嵌套栈参数
  4. 为栈开启回滚(Rollback)功能,防止失败时产生残留资源
  5. 利用 stack event list 排查创建失败原因
  6. 将大型模板拆分为可复用的子模板,提升维护性
  7. 使用 constraints 对参数进行校验,提前发现错误
  8. 生产环境建议使用 TOSCA 模板或结合 tripleo-heat-templates 进行大规模部署