Terraform配置文件通常由多个Resource、Data Source和变量组成,Modules可以帮助您简化配置和降低维护的复杂度,通过关键字"module"进行声明。
Module相当于一个Terraform模块,是对多个资源的封装及抽象。
在配置文件中指定调用路径,示例如下:
module "child_module" { source = "./child" ... }
source:必选参数,指向包含模块配置文件的源路径。
源路径类型 | 说明 | 示例 |
---|---|---|
本地路径 | 必须以 "./" 或 "../" 开头 | source = "./child" |
GitHub | 使用Https协议 | source = "github.com/terraform-xxx-modules/terraform-xxx-vpc.git" |
使用SSH协议 | source = "git@github.com:terraform-xxx-modules/terraform-xxx-vpc.git" | |
指定分支或版本,需在路径中指定ref 参数 | source = "github.com/terraform-xxx-modules/terraform-xxx-vpc.git?ref=v1.0.0" | |
通用Git仓库 | "git::"开头,支持使用Https或SSH协议,支持指定分支或版本 |
|
所需其他参数。
说明
terraform init
命令将模块代码的副本保存至工作目录下。terraform init
命令更新相应的配置。module块是对资源的封装和抽象,因此不能直接访问module块中定义的资源属性,只能访问module块中定义的输出变量,格式为:module.< MODULE NAME >.< OUTPUT NAME >。
以下以本地源路径为例,为您介绍如何访问module块的输出变量:
在工作目录./modules/vpc
路径声明module块后,创建一个VPC,并输出VPC ID。声明方式可参见变量。
variable "cidr" { type = string default = "172.20.0.0/16" } resource "volcengine_vpc" "foo" { name = "tf_vpc_test" cidr = var.cidr } output "vpc_id" { value = volcengine_vpc.foo.id }
在工作目录中调用该模块,并在VPC下新增一个子网,此时vpc_id
的值使用 "module.vpc.vpc_id”表示。
module "vpc" { source = "./modules/vpc" } resource "volcengine_subnet" "default" { subnet_name = "tf_subnet_test" cidr_block = "172.20.1.0/24" zone_id = "cn-beijing-a" vpc_id = module.vpc.vpc_id }