众所周知,Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云做为第三大云服务提供商,terraform-alicloud-provider 已经支持了超过 90 多个 Resource 和 Data Source,覆盖20多个服务和产品,吸引了愈来愈多的开发者加入到阿里云Terraform生态的建设中。数据库
随着 Resource 和 DataSource 的不断增长和完善,业务架构的不断发展,Terraform 模板编写的成本和复杂度也在不断的增长。如何让Terraform 模板更加简单和重用,就是本文所要解决的问题。网络
本文将经过一个典型的负载均衡架构,向你们介绍如何使用 Module 简化 Terraform 的模板。架构
如图所示,这个架构中,包含 ECS 实例,SLB 实例,RDS 实例,OSS 等资源和服务,同时全部的 ECS,RDS 和部分 SLB 在一个 VPC 网络环境中。负载均衡
面对这样的一个架构,模板能够有多种写法。一般的写法是将架构中涉及到的全部资源写到一个模板中,并经过参数和关系型 resource 将这些资源关联起来,以下所示:ide
这样写的好处是,全部资源都在一个模板中管理,编写时能够很清楚了解资源之间的引用关系;可是,当资源不断增长时,扩展很是不灵活,资源间关系越复杂,模板越难以维护。工具
从架构图和上文模板中不难看出,并非全部的Resource都有直接关联关系,好比VPC只和VSwitch和SecurityGroup有关,与其余资源的建立无直接关联关系。所以,为了使整个架构的逻辑能够更加清楚的展现在模板中,咱们能够考虑,对资源进行分类,将每一类资源用一个单独的目录进行管理,最后用一个模板来管理全部的目录,进而完成对全部资源及资源关系的串联,以下所示:阿里云
将该架构中的资源分为网络(VPC),负载均衡(SLB),计算(ECS),数据库(RDS)和存储(OSS)这几类,而后将上文模板中的资源分别在对应的目录中予以实现。spa
接下来,用统一的模版main.tf将这些目录关联起来,以下所示:架构设计
能够看出,main.tf中资源的结构更加清楚,更加接近于架构图。设计
同时,你们已经注意到了,main.tf引入了一个 module,经过module将资源目录串联起来。
Module 是 Terraform 为了管理单元化资源而设计的,是子节点,子资源,子架构模板的整合和抽象。正如本文架构中提到的,在实际复杂的技术架构中,涉及到的资源多种多样,资源与资源之间的关系错综复杂,资源模版的编写,扩展,维护等多个问题的成本都会不断增长。将多种能够复用的资源定义为一个module,经过对 module 的管理简化模板的架构,下降模板管理的复杂度,这就是module的做用。
除此以外,对开发者和用户而言,只需关心 module 的 input 参数便可,无需关心module中资源的定义,参数,语法等细节问题,抽出更多的时间和精力投入到架构设计和资源关系整合上。
上文中,虽然已经实现了module,可是这个module只能在本身本地机器上实现,没法实现与他人的实时分享,没法实现团队内部的及时共享。
Terraform 提供了 Module 的注册地址,将本身的module上传到Github,并注册为一个Terraform Module后,便可将远端的Module应用到咱们本身的模板中。
利用开源 module,咱们可对上文中的模板进行完善:
Module 让资源模板架构更清楚,模板管理更简单;开源 Module 让资源模板更便捷,更分享。除此以外,开源 Module 可实现对模板的版本控制,基于不一样的版本,实现不一样架构不断升级的控制和完善。
目前咱们已经在在 Terraform Module 上发布了一些经常使用的 Module,但这些 Module 远远没法知足你们多种多样的技术架构和复杂的应用场景,很是欢迎你们能够将本身的模板Module注册到官方 Module 上,借助社区的力量,不断完善本身模板,丰富咱们的社区。
本文做者:箫竹aron
本文为云栖社区原创内容,未经容许不得转载。