如何将单文件Terraform代码拆分为多目录模块并关联
Terraform代码拆分与模块间参数传递实现
目录结构规划
先按要求创建如下目录结构:
your-terraform-project/ ├── main.tf # 根模块,关联所有子模块 ├── key-pair/ │ └── main.tf # 密钥对子模块 └── ec2/ └── main.tf # EC2集群子模块
1. 编写密钥对子模块(key-pair/main.tf)
定义AWS密钥对资源,并输出key_name,供EC2模块调用:
resource "aws_key_pair" "cluster_key" { key_name = "ec2-cluster-key" # 可替换为自定义名称,或改用变量实现动态配置 public_key = file("~/.ssh/id_rsa.pub") # 替换为你的本地公钥路径 } # 输出密钥对名称,作为模块对外暴露的参数 output "key_name" { value = aws_key_pair.cluster_key.key_name }
2. 编写EC2集群子模块(ec2/main.tf)
先定义输入变量key_name,再在EC2实例资源中引用该变量:
# 定义接收密钥对名称的输入变量 variable "key_name" { type = string description = "AWS密钥对名称,用于关联EC2实例" } resource "aws_instance" "cluster_nodes" { count = 3 # 集群节点数量,按需调整 ami = "ami-0c55b159cbfafe1f0" # 替换为你目标区域的合适AMI instance_type = "t2.micro" key_name = var.key_name # 使用传入的密钥对名称 tags = { Name = "Cluster-Node-${count.index + 1}" } }
3. 编写根模块(main.tf)
配置AWS Provider,调用两个子模块,并完成key_name参数传递:
# 配置AWS Provider provider "aws" { region = "us-east-1" # 替换为你的目标AWS区域 } # 调用密钥对子模块 module "key_pair" { source = "./key-pair" } # 调用EC2集群子模块,传递密钥对名称 module "ec2_cluster" { source = "./ec2" key_name = module.key_pair.key_name # 引用密钥对子模块的输出值 }
4. 部署验证
执行以下Terraform命令完成部署:
terraform init # 初始化模块与Provider terraform plan # 预览资源变更 terraform apply # 确认并创建资源
内容的提问来源于stack exchange,提问作者Junth
相关产品推荐
相关产品推荐

