将从子地形模板创建的资源id导入父地形模板



用例

  • 使用Terraform,我想创建不同的预处理程序环境(如:dev、qa、uat-env等(。资源定义和模块使用将是相同的,唯一的区别是名称前缀,因此它为每个提到的env创建单独的资源,但保持VPC对所有人的通用性

Terraform版本:v0.13.5

目录结构

├── dev
│   ├── dev.tfvars
│   ├── main.tf
│   ├── outputs.tf
│   ├── provider.tf
│   └── variables.tf
├── qa
│   ├── qa.tfvars
│   ├── main.tf
│   ├── outputs.tf
│   ├── provider.tf
│   └── variables.tf
└── preprod-common
├── main.tf
├── outputs.tf
├── provider.tf
└── variables.tf

预印本常见

main.tf

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.vpc_name
cidr = var.vpc_cidr
azs             = var.vpc_azs
private_subnets = var.vpc_private_subnets
public_subnets  = var.vpc_public_subnets
}

输出.tf

output "vpc_id" {
description = "The ID of the VPC"
value       = module.vpc.vpc_id
}

dev

main.tf

module "security-group" {
source  = "terraform-aws-modules/security-group/aws"

name        = ${var.prefix}-${var.sg-name}
vpc_id      = <vpc_id created from preprod-common>
}

前缀-是环境名称。通过这种方式,它为每个环境创建了单独的资源,前缀值如下:(dev、qa或uat.依此类推(。

qa

main.tf

module "security-group" {
source  = "terraform-aws-modules/security-group/aws"

name        = ${var.prefix}-${var.sg-name}
vpc_id      = <vpc_id created from preprod-common>
}

等等。对于其他环境。

仅供参考-我已经运行了预编程公共配置,它已经创建了一个新的AWS VPC。问题是,我如何将从预印本common创建的vpc_id引用到dev、qa和其他较低的环境中?

注意:-我也知道工作区,但这就是我想要实现的方式。

在回答这个问题之前,我只想注意一些术语:我认为你所说的";模板";这就是所谓的Terraform模块。我注意到,这并不是迂腐,而是因为在未来参考Terraform文档或提出其他问题时,了解正确的术语会有所帮助。

话虽如此,您在这里遵循的模式,即调用两个模块并将一个模块的输出传递给另一个模块,称为模块组合,关于该模式的文档中有许多不同的例子

对于您的特定情况,您可以将vpc模块的vpc_id输出传递到security-group模块,如下所示:

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.vpc_name
cidr = var.vpc_cidr
azs             = var.vpc_azs
private_subnets = var.vpc_private_subnets
public_subnets  = var.vpc_public_subnets
}
module "security_group" {
source = "terraform-aws-modules/security-group/aws"

name   = var.sg_name
vpc_id = module.vpc.vpc_id
}

下面是我的问题的答案。考虑到我问题中的同一个例子,这就是你需要做的。

注意:如果您正在本地保存地形状态。这意味着如果您正在使用本地后端。

dev目录中

main.tf

data "terraform_remote_state" "vpc" {
backend = "local"
config = {
path = "../preprod-common/terraform.tfstate"
}
}
module "security-group" {
source  = "terraform-aws-modules/security-group/aws"

name        = ${var.prefix}-${var.sg-name}
vpc_id      = data.terraform_remote_state.vpc.outputs.vpc_id
}

注意:如果您正在远程保存地形状态。这意味着如果您使用Terraform Cloud的远程后端。

dev目录中

main.tf

data "terraform_remote_state" "vpc" {
backend = "remote"
config = {
organization = "hashicorp"
workspaces = {
name = "vpc-preprod"
}
}
}
module "security-group" {
source  = "terraform-aws-modules/security-group/aws"

name        = ${var.prefix}-${var.sg-name}
vpc_id      = data.terraform_remote_state.vpc.outputs.vpc_id
}

注意:如果您正在远程保存地形状态。这意味着,如果您使用的是地形云以外的远程后端,例如S3。在这种情况下,如地形文件中所述(https://www.terraform.io/docs/backends/operations.html),我正在粘贴下面的确切单词。

目前,远程后端是唯一支持远程操作的后端,Terraform Cloud是唯一支持它的远程执行环境。

在这种情况下,一种解决方案是在本地提取preprod-common的地形状态,比如在/tmp目录中,并将其与本地后端一起使用。

cd preprod-common
terraform state pull > /tmp/terraform.state

dev目录中

main.tf

data "terraform_remote_state" "common" {
backend = "local"
config = {
path = "/tmp/terraform.tfstate"
}
}
module "security-group" {
source  = "terraform-aws-modules/security-group/aws"

name        = ${var.prefix}-${var.sg-name}
vpc_id      = data.terraform_remote_state.vpc.outputs.vpc_id
}

类似地,您必须对其他较低的环境执行此操作,如:qa、uat、int.等等

相关内容

  • 没有找到相关文章

最新更新