Saltar al contenido

¿Cómo obtener un objeto de una lista de objetos en Terraform?

Solución:

Obtienes el mapa con la siguiente expresión:

var.objects[index(var.objects.*.id, "name2")]

Para una prueba rápida, ejecute la siguiente línea en terraform console:

[{id = "name1", attribute = "a"}, {id = "name2", attribute = "a,b"}, {id = "name3", attribute = "d"}][index([{id = "name1", attribute = "a"}, {id = "name2", attribute = "a,b"}, {id = "name3", attribute = "d"}].*.id, "name2")]

Si está buscando crear un conjunto de vsphere_virtual_machine recursos de una lista de direcciones IP y nombres de host, podría intentar esto:

resource "vsphere_virtual_machine" "vm" {
  count = "${length(var.virtual_machine_ips)}"

  // the rest of your virtual machine config
  // such as template ID, CPUs, memory, disks...

  vapp {
    properties {
      // your vApp properties may vary based on what your template actually is.
      // these examples are for the CoreOS template.

      "guestinfo.hostname" = "${index(var.virtual_machine_hostnames, count.index)}"
      "guestinfo.interface.0.ip.0.address" = "${index(var.virtual_machine_ips, count.index)}"
    }
  }
}

(Esto es asumiendo que está configurando la IP y el nombre de host a través de la configuración de vApp; de lo contrario, puede parecer similar, pero coloque el nombre de host y las direcciones IP en algún lugar fuera del vsphere_virtual_machine.vapp.properties cuadra.)

Donde el terraform.tfvars El archivo podría verse así:

virtual_machine_ips = ["10.0.2.2", "10.0.2.3", "10.0.2.4"]
virtual_machine_hostnames = ["banana", "pineapple", "coconut"]

Esta es una forma más simple e idiomática de lograr lo que está tratando de hacer, ya que trabajar con objetos complejos en la sintaxis de interpolación de Terraform no es fácil.

No puede anidar varios niveles de corchetes para obtener n niveles dentro de una estructura de datos. Sin embargo, puede utilizar las funciones de interpolación para recuperar dichos valores. En este caso, querrá usar la función de búsqueda para recuperar el valor del mapa al que se ha accedido con corchetes, que se verá así …

${lookup(var.objects[1], "id")}

Rowan tiene razón, es difícil trabajar con estructuras de datos complejas en las versiones actuales de Terraform. Sin embargo, parece que no pasará mucho tiempo antes de que podamos esperar un mejor apoyo en esta área. La próxima versión 0.12 incluirá tipos enriquecidos que agregarán mejoras a listas y mapas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *