利用environment文件实现heat资源注册

前面一篇文章提到了,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。

通过这种方式,就实现了自定义资源和定制模板之间输入和输出的关联。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值