前面一篇文章提到了,environment环境文件可以用来指定参数值,还有一个作用是用来实现资源注册。
下面就来探讨一下环境文件在这方面的作用。
资源注册配置段关键字为resource_registry。
资源注册主要分为两种类型:
- 资源映射
- 资源构建和重载
资源映射是将一种资源类型映射为另一种资源类型,主要用于提升模板在各heat版本之间的适用性。
例如,某模板配置了IP资源,类型是“OS::Networking::FloatingIP”。
现在想直接利用此模板,但是IP资源类型改为“OS::Nova::FloatingIP”,就可以通过资源映射的方式来实现。
环境文件配置如下:
resource_registry:
"OS::Networking::FloatingIP": "OS::Nova::FloatingIP"
创建stack时,通过-e/--environment-file选项指定此环境文件,就可以实现IP资源类型的替换,省去了大范围模板改动的麻烦。
下面举个例子予以演示。
编辑模板文件template.yaml,内容如下:
heat_template_version: 2013-05-23
description: create cinder volume
resources:
myres:
type: OS::ForTest::TestVolType
properties:
name: volname
size: 10
很明显,上面模板指定的资源类型“OS::ForTest::TestVolType”不是一个有效的heat资源类型。
如果直接使用该模板创建stack,结果肯定是创建失败。
这时候就可以使用环境文件的资源映射配置,将上面无效的资源类型映射到实际有效的资源类型。
编辑环境文件env.yaml内容如下:
resource_registry:
"OS::ForTest::TestVolType": "OS::Cinder::Volume"
然后使用传入环境文件的命令行创建stack:
heat stack-create -f template.yaml -e env.yaml mystack
这样,heat服务实际会以映射后的OS::Cinder::Volume类型创建myres资源。
不过通过命令行查看资源,仍然会显示模板配置的资源类型:
+---------------+--------------------------------------+--------------------------+-----------------+---------------------+
| resource_name | physical_resource_id | resource_type | resource_status | updated_time |
+---------------+--------------------------------------+--------------------------+-----------------+---------------------+
| myres | de072612-94e5-43a0-b448-e5e830de27f8 | <span style="color:#ff0000;">OS::ForTest::TestVolType</span> | CREATE_COMPLETE | 2015-08-24T02:34:55 |
+---------------+--------------------------------------+--------------------------+-----------------+---------------------+
资源构建和重载包含两重意思,一是构建一个新的资源类型,另一个是替换现有资源类型。
都使用类似的配置方式:
resource_registry:
"OS::ForTest::TestVolType": file:///root/custom_res.yaml
resource_registry:
"OS::Cinder::Volume": file:///root/custom_res.yaml
其中,“:”前的字符串表示资源类型,可以是自定义的新资源,也可以是heat自带的资源类型。
“:”后是资源的定义文件,其实内容就是一个模板。
下面看一个例子。
编辑模板文件template.yaml如下:
heat_template_version: 2013-05-23
description: create cinder volume
resources:
myres:
type: OS::ForTest::TestVolType
properties:
volsize: 10
outputs:
voltypeofnestres:
value: { get_attr: [myres, voltype] }
编辑环境文件env.yaml如下:
resource_registry:
"OS::ForTest::TestVolType": file:///root/custom_template.yaml
再编辑定制资源模板文件custom_template.yaml如下:
heat_template_version: 2013-05-23
description: volume template
parameters:
volsize:
type: number
description: Size of volume to create
resources:
nestres:
type: OS::Cinder::Volume
properties:
name: volname
size: { get_param: volsize }
outputs:
voltype:
value: { get_attr: [nestres, volume_type] }
最后,通过命令行创建stack:
heat stack-create -f template.yaml -e env.yaml stack222
创建成功后,查看stack列表:
#heat stack-list -n
+--------------------------------------+-----------------------------+-----------------+---------------------+--------------------------------------+
| id | stack_name | stack_status | creation_time | parent |
+--------------------------------------+-----------------------------+-----------------+---------------------+--------------------------------------+
| 74b3d8f9-579e-4683-b6b6-0e7d35360486 | stack222 | CREATE_COMPLETE | 2015-08-24T03:47:59 | None |
| 1017317d-7b91-47af-a1ea-dab888750b30 | stack222-myres-by6l4uwboidx | CREATE_COMPLETE | 2015-08-24T03:48:06 | 74b3d8f9-579e-4683-b6b6-0e7d35360486 |
+--------------------------------------+-----------------------------+-----------------+---------------------+--------------------------------------+
可以看到,实际创建了两个stack。
其中,stack222是以template.yaml模板创建的stack,而stack222-myres-by6l4uwboidx是以custom_template.yaml模板创建的stack。stack222-myres-by6l4uwboidx是stack222的nested stack(嵌套栈)。
再看看stack资源:
# heat resource-list stack222 -n 1
+---------------+--------------------------------------+--------------------------+-----------------+---------------------+-----------------+
| resource_name | physical_resource_id | resource_type | resource_status | updated_time | parent_resource |
+---------------+--------------------------------------+--------------------------+-----------------+---------------------+-----------------+
| myres | 1017317d-7b91-47af-a1ea-dab888750b30 | OS::ForTest::TestVolType | CREATE_COMPLETE | 2015-08-24T03:48:05 | |
| nestres | 4c2bdba8-2ba8-4970-a5f5-e385164b7833 | OS::Cinder::Volume | CREATE_COMPLETE | 2015-08-24T03:48:06 | myres |
+---------------+--------------------------------------+--------------------------+-----------------+---------------------+-----------------+
实际在heat代码实现中,自定义的资源类型实际是被转换为了TemplateResource(模板资源),而模板资源实例化的对象就是stack。
模板资源的stack(如stack222-myres-by6l4uwboidx)与命令行模板创建的stack(如stack222)形成嵌套关系。
最后回过头来再看看前面的模板定义。
细心的朋友可能已经发现了,自定义资源类型OS::ForTest::TestVolType的property,其实就是定制模板的parameter,如volsize。
而OS::ForTest::TestVolType的attribute,是定制模板导出的outputs,如voltype。
通过这种方式,就实现了自定义资源和定制模板之间输入和输出的关联。