es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear inventario de Ansible utilizando Terraform

Estoy tratando de crear un archivo de inventario de Ansible utilizando la función local_file en Terraform (estoy abierto a sugerencias para hacerlo de manera diferente).

Configuración del módulo “vm”:

resource "azurerm_linux_virtual_machine" "vm" {
  for_each                        = { for edit in local.vm : edit.name => edit }
  name                            = each.value.name
  resource_group_name             = var.vm_rg
  location                        = var.vm_location
  size                            = each.value.size
  admin_username                  = var.vm_username
  admin_password                  = var.vm_password
  disable_password_authentication = false
  network_interface_ids           = [azurerm_network_interface.edit_seat_nic[each.key].id]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }
}

output "vm_ips" {
  value = toset([
    for vm_ips in azurerm_linux_virtual_machine.vm : vm_ips.private_ip_address
  ])
}

Cuando ejecuto terraform plan con la configuración anterior, obtengo lo siguiente:

Changes to Outputs:
  + test = [
      + "10.1.0.4",
    ]

Ahora, en mi archivo TF principal tengo la configuración para local_file de la siguiente manera:

resource "local_file" "ansible_inventory" {
  filename = "./ansible_inventory/ansible_inventory.ini"
  content = <<eof [vm]="" ${module.vm.vm_ips}="" eof="" }="" ```="" esto="" devuelve="" el="" siguiente="" error:="" ```="" error:="" invalid="" template="" interpolation="" value="" on="" main.tf="" line="" 92,="" in="" resource="" "local_file"="" "ansible_inventory":="" 90:="" content=""></eof><eof
91:   [vm]
92:   ${module.vm.vm_ips}
93: eof
module.vm.vm_ips is set of string with 1 element
cannot include the given value in a string template: string required.

¿alguna sugerencia sobre cómo inyectar la lista de ips desde la salida en el archivo local mientras también puedo formatear el resto del texto en el archivo? 91:=”” [vm]=”” 92:=”” ${module.vm.vm_ips}=”” 93:=”” eof=”” module.vm.vm_ips=”” is=”” set=”” of=”” string=”” with=”” 1=”” element=”” cannot=”” include=”” the=”” given=”” value=”” in=”” a=”” string=”” template:=”” string=”” required.=”” ="" ¿alguna="" sugerencia="" sobre="" cómo="" inyectar="" la="" lista="" de="" ips="" desde="" la="" salida="" en="" el="" archivo="" local="" mientras="" también="" puedo="" formatear="" el="" resto="" del="" texto="" en="" el=""></eof
91: [vm]
92: ${module.vm.vm_ips}
93: eof
module.vm.vm_ips is set of string with 1 element
cannot include the given value in a string template: string required.

¿alguna sugerencia sobre cómo inyectar la lista de ips desde la salida en el archivo local mientras también puedo formatear el resto del texto en el archivo?>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la configuración actual es que module.vm.vm_ips es un conjunto de cadenas con un solo elemento, y no se puede incluir directamente como una plantilla de cadena. Una forma de solucionar este problema es utilizar la función join para convertir el conjunto de cadenas en una cadena que se pueda incluir en la plantilla.

    Aquí hay un ejemplo de configuración que demuestra este enfoque:

    resource "local_file" "ansible_inventory" {
      filename = "./ansible_inventory/ansible_inventory.ini"
      content = <<-EOF
        [vm]
        ${join("\n", module.vm.vm_ips)}
        EOF
    }
    

    En esta configuración, utilizamos la función join para unir los valores de module.vm.vm_ips con un carácter de nueva línea (\n). Esto creará una cadena que incluye todas las direcciones IP en el formato deseado.

    Luego, podemos incluir esta cadena en la plantilla utilizando la sintaxis ${}, como se muestra arriba.

    Esto debería permitir que el archivo de inventario de Ansible se cree correctamente utilizando Terraform y Ansible.

Comments are closed.