Dereferencing a map when using template_file function

This is what I have at present, it works, but its a mess:

locals {
   all_nodes_verbose_etcd = [for k, v in var.virtual_machines:
                               format("%s ip=%s etcd_instance=%s", v.name, v.ipv4_address, v.etcd_instance)
                               if length(v.etcd_instance) > 0]
   all_nodes_verbose      = [for k, v in var.virtual_machines: format("%s ip=%s", v.name, v.ipv4_address) if length(v.etcd_instance) == 0]
   master_nodes           = [for k, v in var.virtual_machines: v.name if v.worker_node != true]
   etcd_nodes             = [for k, v in var.virtual_machines: v.name if length(v.etcd_instance) > 0]
   all_nodes              = values(var.virtual_machines)[*].name
   kubespray_inv_file = format("~/kubespray/inventory/%s/inventory.ini", var.kubespray_inventory)
}

resource "local_file" "kubespray_inventory" {
  content = templatefile("templates/kubespray_inventory.tpl", {
    k8s_node_host_verbose_etcd = replace(join("\", \"\n", local.all_nodes_verbose_etcd), "\", \"", "")
    k8s_node_host_verbose      = replace(join("\", \"\n", local.all_nodes_verbose), "\", \"", "")
    k8s_master_host            = replace(join("\", \"\n", local.master_nodes), "\", \"", "")
    k8s_etcd_host              = replace(join("\", \"\n", local.etcd_nodes), "\", \"", "")
    k8s_node_host              = replace(join("\", \"\n", local.all_nodes), "\", \"", "")
  })
  filename = local.kubespray_inv_file
}

It creates a single file, which is what I want, do you have any suggestions for how I could clean this up ?