terraform:迭代地图的键值对

问题描述 投票:0回答:1

因为我对 terraform 很陌生:

我正在尝试在 vsphere 上部署 K8s 集群

.... terraform.tfvars

vms = {
  master_vm1 = { name = "master01", vm_disk_size = 50, vm_vcpu = 2, vm_memory = 2048, vm_ip = "192.168.50.66"},
  master_vm2= { name = "master02", vm_disk_size = 50, vm_vcpu = 4, vm_memory = 4096, vm_ip = "192.168.50.77"},
  master_vm3 = { name = "master03", vm_disk_size = 50, vm_vcpu = 4, vm_memory = 4096, vm_ip = "192.168.50.88"},
  worker_vm1 = { name = "worker101", vm_disk_size = 80, vm_vcpu = 2, vm_memory = 2048, vm_ip = "192.168.50.166"},
  worker_vm2= { name = "worker102", vm_disk_size = 80, vm_vcpu = 4, vm_memory = 4096, vm_ip = "192.168.50.177"},
  worker_vm3 = { name = "worker103", vm_disk_size = 80, vm_vcpu = 4, vm_memory = 4096, vm_ip = "192.168.50.188"},

主.tf

resource "vsphere_virtual_machine" "vm" {
  for_each              = var.vms
..
..
  name                  = format("${each.value.name}.${var.vm_domain}")
  num_cpus              = var.vm_vcpu == false ? var.vm_vcpu : each.value.vm_vcpu
  memory                = var.vm_memory == false ? var.vm_memory : each.value.vm_memory
  firmware              = var.vm_firmware
  folder                = var.vm_folder
  cpu_hot_add_enabled      = "true"
  memory_hot_add_enabled   = "true"
  disk {
    label               = var.vm_disk_label
    size                = each.value.vm_disk_size
    thin_provisioned    = var.vm_disk_thin
  }

使用这种方法,部署工作完美无缺

但是,如果我尝试简单地使用 terraform.tfvars...

nodes = {
   master_nodes ={
    master_vm1 ={ name = "master101", vm_ip = "192.168.50.66"}
    master_vm2 ={ name = "master102", vm_ip = "192.168.50.77"}
    master_vm3 ={ name = "master103", vm_ip = "192.168.50.88"}
  }
   worker_nodes ={
    worker_vm1 ={ name = "worker101", vm_ip = "192.168.50.166"}
    worker_vm2 ={ name = "worker102", vm_ip = "192.168.50.177"}
    worker_vm3 ={ name = "worker103", vm_ip = "192.168.50.188"}
  }
}

我无法理解如何迭代节点....

loops terraform vsphere
1个回答
0
投票

你必须展平你的

nodes
变量,例如:

locals {

  nodes_flat = merge(flatten([
    for node_key, node_values in var.nodes: {
      for sub_node_key, node_details in node_values: 
            "${node_key}-${sub_node_key}" => {
                 "node_key" = node_key
                 "sub_node_key" = sub_node_key
                 "name" = node_details.name
                 "vm_ip" = node_details.vm_ip
             }
   } 
  ])...) # do NOT remove the dots

}

然后

resource "vsphere_virtual_machine" "vm" {
  for_each              = local.nodes_flat
..
..
  name                  = format("${each.value.name}.${var.vm_domain}")
  #num_cpus              = var.vm_vcpu == false ? var.vm_vcpu : each.value.vm_vcpu # # your `nodes` does not contain vm_vcpu, so don't know what you want to do here.
  #memory                = var.vm_memory == false ? var.vm_memory : each.value.vm_memory # your `nodes` does not contain vm_memory, so don't know what you want to do here.
  firmware              = var.vm_firmware
  folder                = var.vm_folder
  cpu_hot_add_enabled      = "true"
  memory_hot_add_enabled   = "true"
  disk {
    label               = var.vm_disk_label
    #size                = each.value.vm_disk_size # your `nodes` does not contain vm_disk_size, so don't know what you want to do here.
    thin_provisioned    = var.vm_disk_thin
  }
}

这应该给你主意。您没有在

vm_disk_size
中定义
nodes
,甚至没有使用您实际拥有的
vm_ip
vm_vcpu
vm_memory
相同)。但无论如何,扁平化是解决你的问题的方法。

© www.soinside.com 2019 - 2024. All rights reserved.