如何仅基于Terraform环境加载某些文件?

如何仅基于Terraform环境加载某些文件?,terraform,terraform-template-file,Terraform,Terraform Template File,要运行terraform脚本,我需要terraform apply-var'ENV=dev'-var file=“dev.tfvars” 在dev.tfvars中,我想加载其他文件,这些文件只包含dev环境的变量 我应该能够对staging.tfvars等执行相同的操作 有什么想法吗?在我看来,您有两种选择: 使用TF工作区,您可以在不同的环境中设置小的差异。如中所述,您需要更改资源以使用插值序列terraform.workspace。我觉得这很难维持 创建一个TF包装器 包装器将接收环境和

要运行terraform脚本,我需要
terraform apply-var'ENV=dev'-var file=“dev.tfvars”

dev.tfvars
中,我想加载其他文件,这些文件只包含dev环境的变量

我应该能够对
staging.tfvars
等执行相同的操作


有什么想法吗?

在我看来,您有两种选择:

  • 使用TF工作区,您可以在不同的环境中设置小的差异。如中所述,您需要更改资源以使用插值序列
    terraform.workspace
    。我觉得这很难维持
  • 创建一个TF包装器
包装器将接收环境和TF命令,将链接依赖于环境的
.TF
文件,并调用
terraform
加载
.tfvars
文件。例如,您可以有一个包含以下文件的
env/
目录:

env/
 | dev.tf
 | staging.tf
 | prod.tf
您的包装器将在项目根目录中链接正确的文件,如下所示:

$ tree -a
.
├── dev
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── modules
│   ├── bar
│   │   └── main.tf
│   └── foo
│       ├── main.tf
│       ├── outputs.tf
│       └── vars.tf
├── production
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── providers
│   └── aws
│       ├── eu-west-1.tf
│       └── us-east-1.tf
├── stacks
│   ├── bar.tf
│   ├── baz.tf
│   └── foo.tf
└── staging
    ├── eu-west-1
    │   ├── bar
    │   │   ├── bar.tf -> ../../../stacks/bar.tf
    │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │   │   └── terraform.tfvars
    │   └── foo
    │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │       ├── foo.tf -> ../../../stacks/foo.tf
    │       └── terraform.tfvars
    ├── global
    │   └── baz
    │       ├── baz.tf -> ../../../stacks/baz.tf
    │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
    └── us-east-1
        ├── bar
        │   ├── bar.tf -> ../../../stacks/bar.tf
        │   ├── terraform.tfvars
        │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
        └── foo
            ├── foo.tf -> ../../../stacks/foo.tf
            ├── terraform.tfvars
            └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
variable "name" {}

variable "count" {
  default = 2
}

module "foo" {
  source = "../../../foo"
  name   = "${var.name}"
  count  = "${var.count}"
}
env.tf->env/dev.tf

然后它将调用
terraform$2-var file=“$1.tfvars”-var'ENV=$1”


通过这种方式,terraform将读取
env.tf
文件内容,并加载附加的
.tf
文件。

在我看来,您有两个选项:

  • 使用TF工作区,您可以在不同的环境中设置小的差异。如中所述,您需要更改资源以使用插值序列
    terraform.workspace
    。我觉得这很难维持
  • 创建一个TF包装器
包装器将接收环境和TF命令,将链接依赖于环境的
.TF
文件,并调用
terraform
加载
.tfvars
文件。例如,您可以有一个包含以下文件的
env/
目录:

env/
 | dev.tf
 | staging.tf
 | prod.tf
您的包装器将在项目根目录中链接正确的文件,如下所示:

$ tree -a
.
├── dev
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── modules
│   ├── bar
│   │   └── main.tf
│   └── foo
│       ├── main.tf
│       ├── outputs.tf
│       └── vars.tf
├── production
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── providers
│   └── aws
│       ├── eu-west-1.tf
│       └── us-east-1.tf
├── stacks
│   ├── bar.tf
│   ├── baz.tf
│   └── foo.tf
└── staging
    ├── eu-west-1
    │   ├── bar
    │   │   ├── bar.tf -> ../../../stacks/bar.tf
    │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │   │   └── terraform.tfvars
    │   └── foo
    │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │       ├── foo.tf -> ../../../stacks/foo.tf
    │       └── terraform.tfvars
    ├── global
    │   └── baz
    │       ├── baz.tf -> ../../../stacks/baz.tf
    │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
    └── us-east-1
        ├── bar
        │   ├── bar.tf -> ../../../stacks/bar.tf
        │   ├── terraform.tfvars
        │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
        └── foo
            ├── foo.tf -> ../../../stacks/foo.tf
            ├── terraform.tfvars
            └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
variable "name" {}

variable "count" {
  default = 2
}

module "foo" {
  source = "../../../foo"
  name   = "${var.name}"
  count  = "${var.count}"
}
env.tf->env/dev.tf

然后它将调用
terraform$2-var file=“$1.tfvars”-var'ENV=$1”


这样,,terraform将读取
env.tf
文件内容并加载附加的
.tf
文件。

而不是这种方法,我将修改terraform代码库的结构,以便开发/暂存/生产环境等都位于单独的目录中,并且每个目录中的
terraform.tfvars
文件不同目录

在我看来,最好的方法是自由地使用模块和符号链接。我在一个关于Terraform多租户的相关问题中讨论了这一点

示例布局可能如下所示:

$ tree -a
.
├── dev
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── modules
│   ├── bar
│   │   └── main.tf
│   └── foo
│       ├── main.tf
│       ├── outputs.tf
│       └── vars.tf
├── production
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── providers
│   └── aws
│       ├── eu-west-1.tf
│       └── us-east-1.tf
├── stacks
│   ├── bar.tf
│   ├── baz.tf
│   └── foo.tf
└── staging
    ├── eu-west-1
    │   ├── bar
    │   │   ├── bar.tf -> ../../../stacks/bar.tf
    │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │   │   └── terraform.tfvars
    │   └── foo
    │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │       ├── foo.tf -> ../../../stacks/foo.tf
    │       └── terraform.tfvars
    ├── global
    │   └── baz
    │       ├── baz.tf -> ../../../stacks/baz.tf
    │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
    └── us-east-1
        ├── bar
        │   ├── bar.tf -> ../../../stacks/bar.tf
        │   ├── terraform.tfvars
        │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
        └── foo
            ├── foo.tf -> ../../../stacks/foo.tf
            ├── terraform.tfvars
            └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
variable "name" {}

variable "count" {
  default = 2
}

module "foo" {
  source = "../../../foo"
  name   = "${var.name}"
  count  = "${var.count}"
}
这使您能够在单个位置(
堆栈
目录)定义Terraform代码的精确配置,并且只允许通过每个目录的
Terraform.tfvars
文件进行覆盖。在上面的布局中,我们有一个
foo
和一个
bar
模块,我们希望在所有开发/登台/生产的2个不同AWS区域中应用,还有一些不可配置的地形代码,这些代码应该全局应用于每个环境级别(比如IAM角色等)

我们在模块文件夹下定义模块(其中
foo
可能是一个完整的模块,而
bar
可能是来自第三方位置的源模块,如另一个Git repo或。然后,我们为
堆栈
文件夹中的模块提供了一个薄包装,其外观可能如下所示:

$ tree -a
.
├── dev
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── modules
│   ├── bar
│   │   └── main.tf
│   └── foo
│       ├── main.tf
│       ├── outputs.tf
│       └── vars.tf
├── production
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── providers
│   └── aws
│       ├── eu-west-1.tf
│       └── us-east-1.tf
├── stacks
│   ├── bar.tf
│   ├── baz.tf
│   └── foo.tf
└── staging
    ├── eu-west-1
    │   ├── bar
    │   │   ├── bar.tf -> ../../../stacks/bar.tf
    │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │   │   └── terraform.tfvars
    │   └── foo
    │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │       ├── foo.tf -> ../../../stacks/foo.tf
    │       └── terraform.tfvars
    ├── global
    │   └── baz
    │       ├── baz.tf -> ../../../stacks/baz.tf
    │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
    └── us-east-1
        ├── bar
        │   ├── bar.tf -> ../../../stacks/bar.tf
        │   ├── terraform.tfvars
        │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
        └── foo
            ├── foo.tf -> ../../../stacks/foo.tf
            ├── terraform.tfvars
            └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
variable "name" {}

variable "count" {
  default = 2
}

module "foo" {
  source = "../../../foo"
  name   = "${var.name}"
  count  = "${var.count}"
}
然后在每个
${environment}/${region}/foo/terraform.tfvars
中,我们总是定义一个名称(因为它是必需的),并可以选择定义一个计数(默认值):


上面的布局还使您可以一目了然地查看所有环境和配置,并且可以简化您在Terraform中使用的任何包装器脚本,只需使用目录路径即可设置状态配置。

与此方法不同,我将修改Terraform代码库的结构,以便dev/staging/prod environments等都位于单独的目录中,并且只因每个目录中的
terraform.tfvars
文件而有所不同

在我看来,最好的方法是自由地使用模块和符号链接。我在一个关于Terraform多租户的相关问题中讨论了这一点

示例布局可能如下所示:

$ tree -a
.
├── dev
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── modules
│   ├── bar
│   │   └── main.tf
│   └── foo
│       ├── main.tf
│       ├── outputs.tf
│       └── vars.tf
├── production
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── providers
│   └── aws
│       ├── eu-west-1.tf
│       └── us-east-1.tf
├── stacks
│   ├── bar.tf
│   ├── baz.tf
│   └── foo.tf
└── staging
    ├── eu-west-1
    │   ├── bar
    │   │   ├── bar.tf -> ../../../stacks/bar.tf
    │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │   │   └── terraform.tfvars
    │   └── foo
    │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │       ├── foo.tf -> ../../../stacks/foo.tf
    │       └── terraform.tfvars
    ├── global
    │   └── baz
    │       ├── baz.tf -> ../../../stacks/baz.tf
    │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
    └── us-east-1
        ├── bar
        │   ├── bar.tf -> ../../../stacks/bar.tf
        │   ├── terraform.tfvars
        │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
        └── foo
            ├── foo.tf -> ../../../stacks/foo.tf
            ├── terraform.tfvars
            └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
variable "name" {}

variable "count" {
  default = 2
}

module "foo" {
  source = "../../../foo"
  name   = "${var.name}"
  count  = "${var.count}"
}
这使您能够在单个位置(
堆栈
目录)定义Terraform代码的精确配置,并且只允许通过每个目录的
Terraform.tfvars
文件进行覆盖。在上面的布局中,我们有一个
foo
和一个
bar
模块,我们希望在所有开发/登台/生产的2个不同AWS区域中应用,还有一些不可配置的地形代码,这些代码应该全局应用于每个环境级别(比如IAM角色等)

我们在模块文件夹下定义模块(其中
foo
可能是一个完整的模块,而
bar
可能是来自第三方位置的源模块,如另一个Git repo或。然后,我们为
堆栈
文件夹中的模块提供了一个薄包装,其外观可能如下所示:

$ tree -a
.
├── dev
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── modules
│   ├── bar
│   │   └── main.tf
│   └── foo
│       ├── main.tf
│       ├── outputs.tf
│       └── vars.tf
├── production
│   ├── eu-west-1
│   │   ├── bar
│   │   │   ├── bar.tf -> ../../../stacks/bar.tf
│   │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │   │   └── terraform.tfvars
│   │   └── foo
│   │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
│   │       ├── foo.tf -> ../../../stacks/foo.tf
│   │       └── terraform.tfvars
│   ├── global
│   │   └── baz
│   │       ├── baz.tf -> ../../../stacks/baz.tf
│   │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│   └── us-east-1
│       ├── bar
│       │   ├── bar.tf -> ../../../stacks/bar.tf
│       │   ├── terraform.tfvars
│       │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
│       └── foo
│           ├── foo.tf -> ../../../stacks/foo.tf
│           ├── terraform.tfvars
│           └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
├── providers
│   └── aws
│       ├── eu-west-1.tf
│       └── us-east-1.tf
├── stacks
│   ├── bar.tf
│   ├── baz.tf
│   └── foo.tf
└── staging
    ├── eu-west-1
    │   ├── bar
    │   │   ├── bar.tf -> ../../../stacks/bar.tf
    │   │   ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │   │   └── terraform.tfvars
    │   └── foo
    │       ├── eu-west-1.tf -> ../../../providers/aws/eu-west-1.tf
    │       ├── foo.tf -> ../../../stacks/foo.tf
    │       └── terraform.tfvars
    ├── global
    │   └── baz
    │       ├── baz.tf -> ../../../stacks/baz.tf
    │       └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
    └── us-east-1
        ├── bar
        │   ├── bar.tf -> ../../../stacks/bar.tf
        │   ├── terraform.tfvars
        │   └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
        └── foo
            ├── foo.tf -> ../../../stacks/foo.tf
            ├── terraform.tfvars
            └── us-east-1.tf -> ../../../providers/aws/us-east-1.tf
variable "name" {}

variable "count" {
  default = 2
}

module "foo" {
  source = "../../../foo"
  name   = "${var.name}"
  count  = "${var.count}"
}
然后在每个
${environment}/${region}/foo/terraform.tfvars
中,我们总是定义一个名称(因为它是必需的),并可以选择定义一个计数(默认值):


上面的布局还使您可以一目了然地查看所有环境和配置,并且可以简化Terraform中用于设置状态配置的任何包装脚本,只需使用目录路径即可。

为什么不在相关的
tfvars
文件中提供变量的值呢。您在问题中提到您有
dev.tfvars
st