Terraform环境特定变量

Ror*_*wne 8 terraform

任何人都知道是否有办法根据环境/工作空间填充Terraform中的变量?最好是一个

  • 填充var命名空间(即不是外部数据源),
  • 不需要包装器
    • 喜欢 tf(){ terraform --var-file=$(get_tf_env).tfvars
  • 通过更改terraform env/workspace而不需要任何其他手动步骤(即不是由运行触发的步骤)生效terraform env

Ale*_*exT 7

填充var名称空间,不需要包装器,并通过更改工作空间生效:

variable "ami_id" {
  type = "map"

  default = {
    stg = "ami-foo28929"
    prd = "ami-bar39b12"
  }
}

image_id = "${lookup(var.ami_id, terraform.workspace)}"
Run Code Online (Sandbox Code Playgroud)


str*_*gjz 5

地形工作区

工作空间是 Terraform 状态的命名容器。通过多个工作区,Terraform 配置的单个目录可用于管理多个不同的基础设施资源集。

在 Terraform 版本的 0.9 系列中,这个概念被称为“环境”。根据有关 Terraform 本身和使用 Terraform 的组织内“环境”一词过多而造成混乱的反馈,它在 0.10 中被重命名。

引用当前工作区对于更改基于工作区的行为非常有用。例如,对于非默认工作区,调整较小的集群大小可能会很有用。例如:

resource "aws_instance" "example" {
  count = "${terraform.workspace == "default" ? var.default : var.min}"

  # ... other arguments
}
Run Code Online (Sandbox Code Playgroud)

  • 我使用如上所述的工作空间,以及变量映射,它允许您根据环境(工作空间)名称为各种资源保留不同的变量。然后,对资源的查找将像这样完成:“${lookup(var.vpc_cidr, terraform.workspace)}”。这将为您提供变量映射“vpc_cidr”中的值以及等于工作区名称的键,例如 ecommerce-dev (2认同)

Fer*_*min 1

据我所知,Terraform 没有一种本地方法可以做到这一点。如果您四处搜索,您会发现很多人的 TF 配置入口点都有不同的文件夹结构,每个不同的文件夹在 tfvars 文件中可以有不同的值。一个选项可以让您了解使用 0.10 中引入的Terraform Workspaces 的一些方法。

我已经实现了类似于您使用OctopusDeploy所建议的内容。如果您以前没有使用过它,Octopus 非常适合管理特定于环境的变量。我在每个环境的 Octopus 中有一个默认的 tfvars 文件和相应变量值的列表。

我有一个基本步骤,迭代 tfvars 中的每个变量,并查找具有相同名称的 Octopus 变量,如果找到则替换它。

我发现这是一种不错的工作方式,因为它很好地分离了 Terraform tfvars 文件(需要什么值)和 Octopus 中的变量值(实际值是什么)。

例如,如果我有一个 tfvars 文件包含

instance_size = "Medium"
Run Code Online (Sandbox Code Playgroud)

我在 Octopus 中有 2 个环境:暂存环境和生产环境。我可以向 Octopus 添加一个名为“instance_size”的变量,并为每个环境设置不同的值(例如分别为“Big”和“Biggest”)。

我编写的步骤模板将找到“instance_size”的相应值,因此这意味着当我运行它进行暂存时,我会得到:

instance_size = "Big"
Run Code Online (Sandbox Code Playgroud)

并用于生产

instance_size = "Biggest"
Run Code Online (Sandbox Code Playgroud)