Kubernetes 在地形配置块中,是否可以将地图键用作属性,并将其值用作属性值?

Kubernetes 在地形配置块中,是否可以将地图键用作属性,并将其值用作属性值?,kubernetes,terraform,google-kubernetes-engine,Kubernetes,Terraform,Google Kubernetes Engine,我试图将键、值对传递给资源,并将键用作属性,将其值用作属性值。但它会抛出一条错误消息 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" { de

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

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
    }
  }
}


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

您可以更新动态内容块,如:

resource "google_container_node_pool" "default" {
  ...

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

      content {
        labels.key = labels.value
      }
    }
  }
}
这有助于区分动态块范围内的临时lambda迭代器变量与资源本身范围内的临时lambda迭代器变量。如果在资源范围内迭代:

resource "google_container_node_pool" "default" {
  for_each = var.foo # var.foo of type Map
}
然后,这些键值对也可以通过each.key和each.value在动态内容块中访问。这避免了动态内容块范围内的变量命名冲突


您可以检查以获取更多信息,包括如何使用迭代器参数重命名变量。

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

您可以更新动态内容块,如:

resource "google_container_node_pool" "default" {
  ...

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

      content {
        labels.key = labels.value
      }
    }
  }
}
这有助于区分动态块范围内的临时lambda迭代器变量与资源本身范围内的临时lambda迭代器变量。如果在资源范围内迭代:

resource "google_container_node_pool" "default" {
  for_each = var.foo # var.foo of type Map
}
然后,这些键值对也可以通过each.key和each.value在动态内容块中访问。这避免了动态内容块范围内的变量命名冲突


您可以查看以获取更多信息,包括如何使用迭代器参数重命名变量。

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

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

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
  }
}

动态块的使用仅适用于需要动态生成零个或多个嵌套块的情况,这些嵌套块通常表示在某种意义上属于嵌套在其中的资源的嵌套对象。对于google_container_node_pool,node_config是一种嵌套块类型,labels是提供程序为该嵌套块类型声明的参数,并将其声明为需要mapstring值。

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

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

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
  }
}

动态块的使用仅适用于需要动态生成零个或多个嵌套块的情况,这些嵌套块通常表示在某种意义上属于嵌套在其中的资源的嵌套对象。对于google_container_node_pool,node_config是一个嵌套块类型,labels是提供程序为该嵌套块类型声明的一个参数,声明它需要mapstring值。

try content={try content={谢谢Matt,我按照你的建议尝试了一下,再次得到了相同的错误`terraform validate error:modules/gke/node_pool/resources.tf第56行,在资源google_container_node_pool默认值:56:labels.key=labels.value这里需要参数或块定义。要设置参数,请使用equals sign=引入参数值。`@RandomQuests我刚刚检查了gcp提供程序的文档,发现了问题。马上更新答案。谢谢Matt,我按照您的建议尝试了,再次得到了相同的错误`terraform validate error:参数或块定义请求
uired在modules/gke/node_pool/resources.tf第56行的资源google_container_node_pool默认值:56:labels.key=labels.value此处需要参数或块定义。要设置参数,请使用等号=引入参数值`@随机任务我刚刚检查了gcp提供商的文档,发现了问题。马上更新答案。