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

There are 1 answers

11
Marcin On

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.