首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将从子terraform模板创建的资源id导入父terraform模板

将从子terraform模板创建的资源id导入父terraform模板
EN

Stack Overflow用户
提问于 2020-12-01 06:47:15
回答 2查看 826关注 0票数 0

用例

  • 使用Terraform,我想创建不同的preprod env(比如: dev,qa,uat env)。等等)。资源定义和模块使用将是相同的,唯一的区别将是名称前缀,以便为每个提到的env创建单独的资源,但保持VPC对所有人通用。

Terraform版本: v0.13.5

目录结构

代码语言:javascript
复制
├── 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

preprod-common

main.tf

代码语言:javascript
复制
  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

}

Output.tf

代码语言:javascript
复制
output "vpc_id" {
  description = "The ID of the VPC"
  value       = module.vpc.vpc_id
}

dev

main.tf

代码语言:javascript
复制
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..so on)。

qa

main.tf

代码语言:javascript
复制
module "security-group" {
  source  = "terraform-aws-modules/security-group/aws"
  
  name        = ${var.prefix}-${var.sg-name}
  vpc_id      = <vpc_id created from preprod-common>
}

以此类推。对于其他环境。

FYI我已经运行了preprod-公共配置,它已经创建了一个新的AWS VPC。问题是,如何将从preprod公共创建的vpc_id引用到dev、qa和其他较低的环境中?

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

EN

回答 2

Stack Overflow用户

发布于 2020-12-01 19:19:19

在回答这个问题之前,我只想注意一些术语:我认为您所称的“模板”实际上是一个Terraform。我要指出的是,不只是因为知道正确的术语,而是因为了解正确的术语,在将来引用Terraform文档或问其他问题时是有帮助的。

尽管如此,您在这里所遵循的调用两个模块并将其中一个模块的输出传递给另一个模块的模式称为模块组成,关于该模式的文档有许多不同的示例。

对于具体情况,可以将vpc_id输出从vpc模块传递到security-group模块,如下所示:

代码语言:javascript
复制
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
}
票数 2
EN

Stack Overflow用户

发布于 2020-12-17 05:23:21

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

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

在您的dev目录中

main.tf

代码语言:javascript
复制
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的远程后端。

在您的dev目录中

main.tf

代码语言:javascript
复制
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
}

注意:如果您正在远程保存您的地形状态,则为。这意味着如果您使用的是远程后端,而不是terraform云,例如S3。在这个例子中,正如terraform文档(https://www.terraform.io/docs/backends/operations.html)中提到的,我正在粘贴下面的确切单词。

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

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

代码语言:javascript
复制
cd preprod-common

terraform state pull > /tmp/terraform.state

在您的dev目录中

main.tf

代码语言:javascript
复制
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..。等等

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65085865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档