【问题标题】:Is it possible to use a map key as an attribute and its value as attribute value in a terraform config block?是否可以在 terraform 配置块中将地图键用作属性并将其值用作属性值?
【发布时间】:2021-03-26 17:17:12
【问题描述】:

我正在尝试将键、值对传递给资源并将键用作属性并将其值用作属性值。但它会抛出错误消息

each.key = each.value

An argument or block definition is required here. To set an argument, use the
equals sign "=" to introduce the argument value.

这就是我想做的事情

variable "k8s_labels" {
  description = "Kubernetes labels to set for the node pool."
  type = map
  default = {
    label1 = "value1",
    label2 = "value2",
  }
}

resource "google_container_node_pool" "default" {
  .
  .
  .
  dynamic "labels" {
    for_each = var.k8s_labels
    content {
      each.key = each.value
    }
  }
}

【问题讨论】:

  • 试试content = {

标签: kubernetes terraform google-kubernetes-engine


【解决方案1】:

在动态内容块中,临时 lambda 迭代器变量的名称不是each,而是块本身的名称。在这种情况下,这将是labels。此外,根据schema documentation,标签块必须包含在node_config 块中。这些修复组合将解决您的问题。

您可以像这样更新动态内容块:

resource "google_container_node_pool" "default" {
  ...

  node_config {
    dynamic "labels" {
      for_each = var.k8s_labels

      content {
        labels.key = labels.value
      }
    }
  }
}

这有助于将动态块范围内的临时 lambda 迭代器变量与资源本身范围内的变量区分开来。如果在资源范围内迭代:

resource "google_container_node_pool" "default" {
  for_each = var.foo # var.foo of type Map
}

那么这些键值对也可以通过each.keyeach.value 在动态内容块中访问。这避免了动态内容块范围内的变量命名冲突。

您可以查看dynamic block documentation 了解更多信息,包括如何使用iterator 参数重命名变量。

【讨论】:

  • 谢谢马特,我按照你的建议尝试并再次得到同样的错误` terraform validate 错误:模块/gke/node_pool/resources.tf 第 56 行,资源“google_container_node_pool”中需要参数或块定义“ default": 56: labels.key = labels.value 这里需要一个参数或块定义。要设置参数,请使用等号“=”来引入参数值。 `
  • @RandomQuests 我刚刚检查了gcp 提供程序的文档并发现了问题。稍后更新答案。
【解决方案2】:

Terraform 不支持在块内动态生成参数名称。参数名称类似于静态类型编程语言中的结构或类字段,而不是映射中的键,因此您必须单独写出它们,然后 Terraform 将验证所有名称在该上下文中是否有效。

不过,对于您的情况来说,好消息是这个 labels 参数似乎实际上是类型映射的参数,而不是块类型,因此您不需要做任何特殊的事情来动态设置它:您实际上可以将您的字符串映射分配给它,因为它已经是该参数预期类型的​​值:

variable "k8s_labels" {
  description = "Kubernetes labels to set for the node pool."
  type        = map(string)
  default = {
    label1 = "value1",
    label2 = "value2",
  }
}

resource "google_container_node_pool" "default" {
  # ...

  node_config {
    # ...

    labels = var.k8s_labels
  }
}

dynamic 块的使用仅适用于需要动态生成零个或多个嵌套块的情况,这些块通常表示嵌套对象,在某种意义上属于它们嵌套在其中的资源。对于google_container_node_poolnode_config 是嵌套块类型,labels 是提供者为该嵌套块类型声明的参数,将其声明为期望 map(string) 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多