1、什么是Modulegit
Module 是 Terraform 为了管理单元化资源而设计的,是子节点,子资源,子架构模板的整合和抽象。在实际复杂的技术架构中,涉及到的资源多种多样,资源与资源之间的关系错综复杂,资源模版的编写,扩展,维护等多个问题的成本都会不断增长。将多种能够复用的资源定义为一个module,经过对 module 的管理简化模板的架构,下降模板管理的复杂度,这就是module的做用。github
除此以外,对开发者和用户而言,只需关心 module 的 input 参数便可,无需关心module中资源的定义,参数,语法等细节问题,抽出更多的时间和精力投入到架构设计和资源关系整合上。架构
官方建议Module标准结构包含:main.tf,variables.tf,outputs.tf,README.md。这些是最小模块的建议文件名,即便它们为空。ide
一、main.tf:资源的定义模板
二、variables.tf:模板所依赖的参数定义和参数值
三、outputs.tf:资源的输出值
四、README.md:模板的简单介绍和使用说明以及该模块可用的许可证架构设计
对于一个简单的模块,main.tf 是主要入口点。包含了建立资源的主要内容。对于复杂的模块,能够将资源建立分为多个文件,可是任何嵌套的模块调用都应位于主文件中。variables.tf 而且outputs.tf应分别包含变量和输出的声明。设计
# 简单的模块 $ basic-module/ . ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf # 复杂的模块 $ complete-module/ . ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf ├── ... ├── modules/ │ ├── nestedA/ │ │ ├── README.md │ │ ├── variables.tf │ │ ├── main.tf │ │ ├── outputs.tf │ ├── nestedB/ │ ├── .../ ├── examples/ │ ├── exampleA/ │ │ ├── main.tf │ ├── exampleB/ │ ├── .../
3.一、调用子Module版本控制
module "my_vpc" { source = "./module/vpc" # ... }
3.二、访问Module的输出值code
output "vpc_id" { value = "${module.my_vpc.vpc_id}" # ... }
3.三、Module 的版本orm
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "0.0.1" }
该version属性值能够是单个显式版本,也能够是版本约束表达式。约束表达式使用如下语法来指定可接受的版本范围:blog
上文中,虽然已经实现了module,可是这个module只能在本身本地机器上实现,没法实现与他人的实时分享,没法实现团队内部的及时共享。
Terraform 提供了 Module 的注册地址(https://registry.terraform.io/),将本身的module上传到Github,并注册为一个Terraform Module后,便可将远端的Module应用到咱们本身的模板中。
Module 让资源模板架构更清楚,模板管理更简单;开源 Module 让资源模板更便捷,更分享。除此以外,开源 Module 可实现对模板的版本控制,基于不一样的版本,实现不一样架构不断升级的控制和完善。
咱们能够在网址:https://registry.terraform.io/browse/modules 找到咱们所使用的云服务商的各类terraform module。
# AWS Modules https://github.com/terraform-aws-modules # Alicloud Modules https://github.com/terraform-alicloud-modules
若是您喜欢这篇文章,请考虑关注我。
长沙DevOps联盟 - 关注容器技术,K8S,自动化部署,基础设施架构。