Module 是一个Terraform 模板,是对多个子节点,子资源,子架构模板的组合和抽象。利用Module 在降低模板编写和维护复杂度的同时,使得模板结构更加简洁清楚。为什么要使用 Module,详见文章 Module 让 Terraform 使用更简单。
本文将根据自己对 Module 的理解,向大家讲解如何编写一个通用,标准的 Module。
在 Terraform 官方注册 module,目前只支持 Github 的仓库,因此,在编写模板之前,必须先建立一个标准的 Github 仓库:
terraform-<PROVIDER>-<NAME>
,如terraform-alicloud-ecs-instance
,terraform-alicloud-vpc
等为了更好的管理所有阿里云的terraform module,现在所有的仓库都建在组织 terraform-alicloud-modules
下。当有新建仓库需求时,可联系负责人。
Module 仓库建立完毕后,首先要 fork 仓库并将其clone到本地。接下来,开始 Mudole 的编写工作。官方已经给出了一个标准的 Module 应该遵循的原则和规范,详见 standard-module-structure . 本文将在此基础上进行补充。
基本原则
slb instance
和 slb attachment
,这两个子资源分别定义在了 modules/slb
和 modules/slb_attachment
中,然后在最外层的 main.tf
中将这两个module组合为一个新的modulemain.tf
this
,default
,尽量避免使用foo
,test
等variables.tf
outputs.tf
instance_ids
中README
Usage
,指明该如何使用这个 Module。Module 的source 格式为 source = "<Repo Organization>/<NAME>/alicloud"
,如:source = "terraform-alicloud-modules/slb-listener/alicloud"
在完成模板的编写后,首先需要在本地运行无误,并对一些参数做边界测试。测试无误后,提交代码到github
由于Terraform Module 是以 Repo releases 来实现版本控制的,因此在确定代码无误后,包括Readme,发布一个新的Release。之后在terraform module 注册和完成module的发布,具体操作详见 registry modules.