有什么方法可以循环 Terraform 中的所有变量吗?

use*_*276 -1 terraform

我想要一个资源块,它可以循环我用变量块定义的每个变量。这可能吗?

例如:假设我在 tfvar 文件中设置 myfirstvar 和 mysecondvar。我正在寻找一种解决方案,该解决方案将采用以下模板并将所有名称、值和描述部署到 Terraform Cloud。

variable "myfirstvar" {
  type        = string
  description = "a var to upload"
}

variable "mysecondvar" {
  type        = string
  description = "another var to upload"
}

resource "tfe_variable" "test" {
  for_each     = var
  key          = currentvar.key
  value        = currentvar.value
  category     = "terraform"
  workspace_id = tfe_workspace.test.id
  description  = currentvar.description
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能想到的唯一解决方案是将所有 tf​​var 放入单个列表类型变量中,但这不会有来自变量块的附加信息。或者我可以在另一个程序中对变量块进行进一步解析,并且 tfvars 文件收集所有必要的信息。两者都不理想。

Mar*_*ins 5

您直接问题的答案是否定的,因为var它实际上不是 Terraform 中的对象。相反,它只是所有变量符号都有的前缀。这种区别在 Terraform 中很重要,因为它的工作原理是根据对象之间的引用创建依赖关系图,并且依赖关系图中没有代表“所有变量”的节点,因此 Terraform 无法表示对其的引用。

话虽如此,实现类似结果的典型方法是编写具有映射类型的单个变量,如下所示:

variable "tfe_variables" {
  type = map(object({
    value       = string
    description = string
  }))
}

resource "tfe_variable" "test" {
  for_each     = var.tfe_variables

  key          = each.key
  value        = each.value.value
  category     = "terraform"
  workspace_id = tfe_workspace.test.id
  description  = each.value.description
}
Run Code Online (Sandbox Code Playgroud)

然后,当您定义此变量时,您可以将其设置为对象映射,如下所示:

tfe_variables = {
  myfirstvar = {
    value       = "example"
    description = "a var to upload"
  }
  mysecondvar = {
    value       = "example"
    description = "another var to upload"
  }
}
Run Code Online (Sandbox Code Playgroud)

您似乎更希望此配置的变量与您正在管理的工作区中定义的变量相匹配。没有直接的方法可以做到这一点,因为当前配置的变量定义是供外部使用的元数据,并且模块本身无法直接访问。最接近的方法是显式构造必要的映射,以便 Terraform 可以看到所有必要的依赖边以执行程序:

variable "myfirstvar" {
  type = string
}

variable "mysecondvar" {
  type = string
}

locals {
  variables = tomap({
    myfirstvar = {
      value       = var.myfirstvar
      description = "a var to upload"
    }
    mysecondvar = {
      value       = var.mysecondvar
      description = "another var to upload"
    }
  })
}

resource "tfe_variable" "test" {
  for_each     = local.variables

  key          = each.key
  value        = each.value.value
  category     = "terraform"
  workspace_id = tfe_workspace.test.id
  description  = each.value.description
}
Run Code Online (Sandbox Code Playgroud)