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?>
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ónjoin
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:
En esta configuración, utilizamos la función
join
para unir los valores demodule.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.