Module 模块
Terraform 可以更轻松的扩展基础架构并保持其配置整洁,但是,随着基础架构的增长,单个目录变得难以管理。
我们假设一种场景:
创建多台服务器?我们在当前是不是需要一遍又一遍的重复相同的配置代码?
这种场景下,我们便可以配置多个模块,一次执行便可以生成我们的需要的配置。
Terraform 模块是一种可重用现有代码的方法,减少基础设施组件开发的代码量。
Terraform 模块是一个或多个 .tf
文件的集合
实际上任何 Terraform 配置本身已经是一个模块。如果在此目录中运行 Terraform,则这些配置文件将被视为根模块。
.
|
├── main.tf
├── variables.tf
├── outputs.tf
└── README.md
Module 语法
- name:模块的名称,在 Terraform 中可以使用模块名称进行引用;
- source:模块代码的路径,本地或者远程仓库的路径;
- version:版本信息;
参数信息:
module "name" {
source = "./terraform_test_module"
version = "1.0.0"
argument_1 = var.test1
argument_2 = var.test2
}
Module 工作原理
远程模块:存储到跟模块下的 .terraform
目录中(修改后,必须 get
或者 init
)。
本地模块:将通过软连接的方式引用本地的源目录(修改后,无需操作)。
使用 terraform get
下载模块;
使用 terraform graph
查看模块; -module-depth 汇总对象;
Module 调用方式
本地文件:"./module_name"
TF注册表: "hashicorp/consul/aws"
Github:
- http "github.com/hashicorp/example"
- ssh "git@github.com:hashicorp/example"
bucket:"bitbucket.org/hashicorp/terraform-consul-aws"
通用git:
- http: "git::https://example.com/vpc.git"
- ssh: "git::ssh://username@example.com/storage.git"
Module-输入、输出变量值
模块的输出值,便于其他模块引用;
引用方式:module.MODULE_NAME.OUTPUT_NAME
Module 实例化
一个模块可以多次实例化;
每个示例定义唯一的名称,指定相同 source来源;
module "dev_ecs" {
source = "./module/ecs"
instance_name = "ecs_01"
}
module "prod_ecs" {
source = "./module/ecs"
instance_name = "ecs_02"
}
演示环境的配置
.
├── env
│ └── dev
│ ├── main.tf
│ ├── outputs.json
│ ├── variables.tf
│ └── versions.tf
├── modules
│ ├── dns
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ ├── ecs
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ ├── secgroup
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── vpc
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── test_demo.zip
7 directories, 17 files
- 解决代码重复的问题;
- 加强代码可读性,代码整洁性;
- 资源标准化;
- 减少人为错误发生频率;