Terraform 地形数据结构

Terraform 地形数据结构,terraform,Terraform,也许这是一个非常愚蠢的问题,我猜这并不像我发现的那么复杂。然而,在花了好几个小时阅读和尝试之后,虽然我已经学到了很多关于Terraform的知识,但我真的离一个我可以理解或重用的解决方案不远了 我正在尝试做一些在bash或python中非常简单的事情,但在Terraform中似乎需要一些技巧。我有两个要“组合”的变量,以便在每个循环中有一个有效的数据块可用于创建资源。从变量声明的角度来看,我很可能从一开始就没有做到这一点。所以请原谅我的初学者的无能 还要注意的是,这主要是为了我自己的学习,所以不

也许这是一个非常愚蠢的问题,我猜这并不像我发现的那么复杂。然而,在花了好几个小时阅读和尝试之后,虽然我已经学到了很多关于Terraform的知识,但我真的离一个我可以理解或重用的解决方案不远了

我正在尝试做一些在bash或python中非常简单的事情,但在Terraform中似乎需要一些技巧。我有两个要“组合”的变量,以便在每个循环中有一个有效的数据块可用于创建资源。从变量声明的角度来看,我很可能从一开始就没有做到这一点。所以请原谅我的初学者的无能

还要注意的是,这主要是为了我自己的学习,所以不一定是一个实际的例子,而是一个说明我想更好理解的用例。在此上下文中,我的用例是在Terraform cloud中提供工作空间,并在创建的每个工作空间中插入相同的私有变量集。aka创建工作区并推入azure服务原则身份验证变量

所以在variables.tf中我有

variable "env_names" {
  type    = set(string)
  default = ["dev", "uat", "prod"]
}

variable "auth_vars" {
  default = [
    { key   = "subscription_id"
      value = "XXXXXXXXXXXXXXXXXXXXXXXX"
    },
    {
      key   = "client_id"
      value = "XXXXXXXXXXXXXXXXXXXX"
    },
    {
      key   = "client_secret"
      value = "XXXXXXXXXXXXXXXXXXX"
    },
    {
      key   = "tenant_id"
      value = "XXXXXXXXXXXXXXXXXXX"
    }
  ]
}
然后我想使用这些变量来创建工作空间,并将变量集应用于每个工作空间。对于工作区的创建,我使用创建它们没有问题

resource "tfe_workspace" "cloud_workspace" {
  for_each            = var.env_names
  name                = "MyWorkspace-${each.key}"
  organization        = "MyOrg"
  execution_mode      = "remote"
  auto_apply          = "false"
  allow_destroy_plan  = "true"
  global_remote_state = "false"
}
为工作区创建变量是我最头疼的事情。我尝试过使用局部变量进行各种操作,将数据展平,进行setproduct等。我想我真的不知道如何解决这个问题。我试着做过以下事情:

locals {
  auth_map = flatten([
    for w in var.env_names : [
      for v in var.auth_vars : {
        workspace = w
        key       = v.key
        value     = v.value
      }
    ]
  ])
}
这似乎创建了一个有意义的结构,因为我有一个所需的所有元组值的列表。阿卡

 {
  key       = "subscription_id"
  value     = "XXXXXX"
  workspace = "dev"
},
{
  key       = "client_id"
  value     = "XXXXXXXXXXXX"
  workspace = "dev"
},
ETC.....
我只是不知道如何将这个元组列表转换成有用的形式,以便为工作区创建所有变量。我想使用这些数据创建以下类型的多个变量块。不过,我真的不知道怎么去那里

resource "tfe_variable" "azure-credentials" {
  key          = ""
  value        = ""
  category     = "terraform"
  workspace_id = ""
}
我知道我可以在很久以前简单地编写几段代码并解决这个用例,但更多的是为了理解Terraform如何工作以及如何处理这些更复杂的情况。任何建议都非常感谢,因为我真的刚刚开始正确地学习Terraform,我在这里的深度远远超出了我的理解范围


非常感谢您抽出时间

如果我理解正确,应该是:

resource "tfe_variable" "azure-credentials" {

  for_each     = {for idx, value in local.auth_map: idx => value}

  key          = each.value.key
  value        = each.value.value

  category     = "terraform"

  workspace_id = tfe_workspace.test[each.value.workspace].id
}

在上面,您将地图列表
local.auth\u map
转换为地图,因为每个地图都不能与您的列表一起使用。

工作区id=??应该是什么?另外,如果您的
local.auth\u prod
只是一个列表,则
for\u each=local.auth\u prod
将不起作用。所以我不确定你想要实现什么?对不起,编辑了那个块。应该很清楚,因为我不知道如何以正确的格式获取数据,我不知道tfe_变量块中会有什么让它创建我想要的所有资源。哦,天哪,非常感谢。这正是我想要的答案!非常感谢!我必须读一些书才能更好地理解这个解决方案,但现在我知道该怎么做了。