Terraform:for_each value =>无法在for_each中使用一组对象值。需要一个值得一提的集合

发布于 2025-02-13 08:50:58 字数 2548 浏览 0 评论 0原文

在Terraform版本1.1.9中,AM在执行Terraform时面临以下问题。 帮助我修复如何在没有错误的情况下完成此操作。

是:

# Outputs
output "rancher_nodes" {
  value = [
        for instance in flatten([[aws_instance.node_all], [aws_instance.node_master], [aws_instance.node_worker]]): {
    public_ip  = instance.public_ip
    private_ip = instance.private_ip
    hostname   = instance.id
    user       = var.node_username
    roles      = split(",", instance.tags.K8sRoles)
    ssh_key    = file(var.ssh_key_file)
    }
  ]
  sensitive = true
}

变量

variable "rke_nodes" {
  type = list(object({
    public_ip = string
    private_ip = string
    hostname = string
    roles = list(string)
    user = string
    ssh_key = string
  }))
  description = "Node info to install RKE cluster"
}

# Provision RKE cluster on provided infrastructure
resource "rke_cluster" "rancher_cluster" {
  cluster_name = var.rke.cluster_name

  dynamic nodes {
    for_each = var.rke_nodes
    content {
      address           = nodes.value.public_ip
      internal_address  = nodes.value.private_ip
      hostname_override = nodes.value.hostname
      user              = nodes.value.user
      role              = nodes.value.roles
      ssh_key           = nodes.value.ssh_key
    }
  }
  upgrade_strategy {
    drain                        = false
    max_unavailable_controlplane = "1"
    max_unavailable_worker       = "10%"
  }

  kubernetes_version = var.rke.kubernetes_version

}

我有

╷
│ Error: Invalid dynamic for_each value
│
│   on .terraform/modules/rke-cluster/main.tf line 6, in resource "rke_cluster" "rancher_cluster":
│    6:     for_each = var.rke_nodes
│     ├────────────────
│     │ var.rke_nodes has a sensitive value
│
│ Cannot use a list of object value in for_each. An iterable collection is required.

rke_nodes值示例将

- nodes {
    - address           = "65.2.140.68" -> null
    - hostname_override = "i-0d5bf5f22fb84f5d4" -> null
    - internal_address  = "10.30.8.120" -> null
    - labels            = {} -> null
    - role              = [
        - "controlplane",
        - "etcd",
        - "worker",
      ] -> null
    - ssh_agent_auth    = false -> null
    - ssh_key           = (sensitive value)
    - user              = (sensitive value)
  }

In terraform version 1.1.9 am facing the below issue while doing terraform apply.
Help me to fix how this for_each can be done without error.

rke_nodes values sample will be :

# Outputs
output "rancher_nodes" {
  value = [
        for instance in flatten([[aws_instance.node_all], [aws_instance.node_master], [aws_instance.node_worker]]): {
    public_ip  = instance.public_ip
    private_ip = instance.private_ip
    hostname   = instance.id
    user       = var.node_username
    roles      = split(",", instance.tags.K8sRoles)
    ssh_key    = file(var.ssh_key_file)
    }
  ]
  sensitive = true
}

I have variable.tf :

variable "rke_nodes" {
  type = list(object({
    public_ip = string
    private_ip = string
    hostname = string
    roles = list(string)
    user = string
    ssh_key = string
  }))
  description = "Node info to install RKE cluster"
}

main.tf :

# Provision RKE cluster on provided infrastructure
resource "rke_cluster" "rancher_cluster" {
  cluster_name = var.rke.cluster_name

  dynamic nodes {
    for_each = var.rke_nodes
    content {
      address           = nodes.value.public_ip
      internal_address  = nodes.value.private_ip
      hostname_override = nodes.value.hostname
      user              = nodes.value.user
      role              = nodes.value.roles
      ssh_key           = nodes.value.ssh_key
    }
  }
  upgrade_strategy {
    drain                        = false
    max_unavailable_controlplane = "1"
    max_unavailable_worker       = "10%"
  }

  kubernetes_version = var.rke.kubernetes_version

}

I got error when terraform apply :

╷
│ Error: Invalid dynamic for_each value
│
│   on .terraform/modules/rke-cluster/main.tf line 6, in resource "rke_cluster" "rancher_cluster":
│    6:     for_each = var.rke_nodes
│     ├────────────────
│     │ var.rke_nodes has a sensitive value
│
│ Cannot use a list of object value in for_each. An iterable collection is required.

Actual Value when apply it can be list in sometimes:

- nodes {
    - address           = "65.2.140.68" -> null
    - hostname_override = "i-0d5bf5f22fb84f5d4" -> null
    - internal_address  = "10.30.8.120" -> null
    - labels            = {} -> null
    - role              = [
        - "controlplane",
        - "etcd",
        - "worker",
      ] -> null
    - ssh_agent_auth    = false -> null
    - ssh_key           = (sensitive value)
    - user              = (sensitive value)
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没有 2025-02-20 08:50:58

您不需要索引。它应该是:

  for_each = var.rke_nodes

注意:这仅适用于动态块。如果您在资源块中使用for_each,则这种形式的for_each(地图列表)将无效。

You don't need index. It just should be:

  for_each = var.rke_nodes

Note: This works only for dynamic blocks. If you use for_each in resource blocks, this form of for_each (list of maps) will not work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文