terraform中的不同模块可以使用相同的vars文件吗

terraform中的不同模块可以使用相同的vars文件吗,terraform,Terraform,我有以下文件: provider "aws" { region = "us-east-1" } module "ec2"{ source = “../service1” app = "${var.app}" env = "${var.env}" } module "workspaces"{ source = “../service2” app = "${

我有以下文件:

provider "aws" {
  region = "us-east-1"
}

module "ec2"{
    source = “../service1”
    app                 = "${var.app}"
    env                 = "${var.env}"
}

module "workspaces"{
    source = “../service2”
    app                 = "${var.app}"
    env                 = "${var.env}"

 }
尽管service1和service2是不同的模块,但它们的基础variables.tf文件完全相同。有没有办法对这两个模块都使用common variables.tf文件

是的,你可以

文件夹结构将为:

/service1
  --main.tf
  --var.tf

/service2
  --main.tf
  --var.tf

main.tf
var.tf
/service1/var.tf和/service2/var.tf的内容

variable "app" {}

variable "env" {}
/var.tf的内容

variable "app" {
   default = "YOUR-APP-NAME"
}
variable "env" {
   default = "dev"
}
或者您可以保持所有var.tf的内容相同,并从CLI传递-var标志。

是的,您可以

文件夹结构将为:

/service1
  --main.tf
  --var.tf

/service2
  --main.tf
  --var.tf

main.tf
var.tf
/service1/var.tf和/service2/var.tf的内容

variable "app" {}

variable "env" {}
/var.tf的内容

variable "app" {
   default = "YOUR-APP-NAME"
}
variable "env" {
   default = "dev"
}

或者您可以保持所有var.tf的内容相同,并从CLI传递-var标志。

每个模块的变量声明是完全独立的,因此Terraform中没有内置功能来共享它们

如果您使用的是支持符号链接的文件系统,则可以将相同的
.tf
文件符号链接到多个目录中,以获得类似的效果。但是,除非变量声明集特别大或复杂,否则我建议只复制它们:从长远来看,保持每个配置自包含通常比避免少量复制简单的样板代码更有帮助


如果您使用的是Terraform v0.12,您可能希望将所有这些常用设置合并到一个对象值中,以便简化样板文件:

locals {
  context = {
    app = "example"
    env = var.environment
  }
}

module "ec2" {
  source = "../service1"

  context = local.context
}

module "workspaces" {
  source = "../service2"

  context = local.context
}
类似以下的变量声明(在每个子模块中)将使
上下文
对象的形状更加明确,因此Terraform可以在传递不适当的值时检测并报告有关该对象的错误:

variable "context" {
  type = object({
    app = string
    env = string
  })
}

当分解成多个模块时,像上面这样传递一组标准上下文通常已经足够好了,但是如果您的系统特别复杂(由模块表示的许多不同子系统),那么从长远来看,准确地考虑每个模块需要什么并显式地传递这些单独的内容可能会有所帮助,而不是到处都是相同的物体

例如,如果您想从调用方获取
ec2
模块,您可能会将其设计为没有“app”或“environment”的概念——这些概念属于调用方模块,但不是ec2概念——而是以更为ec2为中心的方式表示相同的内容,例如通过标签:

locals {
  # Common tags for all AWS objects
  aws_tags = {
    Name        = "example ${var.environment}"
    Environment = var.environment
  }
}

module "ec2" {
  source = "../service1"

  # (other EC2-oriented settings)

  tags = local.aws_tags
}
使用这种方法,EC2模块只关心EC2概念,根模块将自己的“应用程序”和“环境”概念转换为EC2的标签概念。这可以允许相同的EC2模块稍后在不同的上下文中使用,例如,不同的标记方案是合适的


关于这种方法的更多信息,请参阅Terraform文档部分。

每个模块的变量声明是完全独立的,因此Terraform中没有内置功能来共享它们

如果您使用的是支持符号链接的文件系统,则可以将相同的
.tf
文件符号链接到多个目录中,以获得类似的效果。但是,除非变量声明集特别大或复杂,否则我建议只复制它们:从长远来看,保持每个配置自包含通常比避免少量复制简单的样板代码更有帮助


如果您使用的是Terraform v0.12,您可能希望将所有这些常用设置合并到一个对象值中,以便简化样板文件:

locals {
  context = {
    app = "example"
    env = var.environment
  }
}

module "ec2" {
  source = "../service1"

  context = local.context
}

module "workspaces" {
  source = "../service2"

  context = local.context
}
类似以下的变量声明(在每个子模块中)将使
上下文
对象的形状更加明确,因此Terraform可以在传递不适当的值时检测并报告有关该对象的错误:

variable "context" {
  type = object({
    app = string
    env = string
  })
}

当分解成多个模块时,像上面这样传递一组标准上下文通常已经足够好了,但是如果您的系统特别复杂(由模块表示的许多不同子系统),那么从长远来看,准确地考虑每个模块需要什么并显式地传递这些单独的内容可能会有所帮助,而不是到处都是相同的物体

例如,如果您想从调用方获取
ec2
模块,您可能会将其设计为没有“app”或“environment”的概念——这些概念属于调用方模块,但不是ec2概念——而是以更为ec2为中心的方式表示相同的内容,例如通过标签:

locals {
  # Common tags for all AWS objects
  aws_tags = {
    Name        = "example ${var.environment}"
    Environment = var.environment
  }
}

module "ec2" {
  source = "../service1"

  # (other EC2-oriented settings)

  tags = local.aws_tags
}
使用这种方法,EC2模块只关心EC2概念,根模块将自己的“应用程序”和“环境”概念转换为EC2的标签概念。这可以允许相同的EC2模块稍后在不同的上下文中使用,例如,不同的标记方案是合适的


有关此方法的更多信息,请参阅上的Terraform文档部分。

不明白吗?如何为每个模块调用单变量文件?您仍然为每个模块显示var.tf?每个模块都将包含自己的var.tf文件。您不明白吗?如何为每个模块调用单变量文件?您仍然为每个模块显示var.tf?每个模块都将包含自己的var.tf文件