任何人都知道是否有办法根据环境/工作空间填充Terraform中的变量?最好是一个
tf(){ terraform --var-file=$(get_tf_env).tfvars
terraform env
?填充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)
工作空间是 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)
据我所知,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)
归档时间: |
|
查看次数: |
6180 次 |
最近记录: |