Versión Terraform = 0.12
resource "aws_instance" "bespin-ec2-web" { ami = "ami-0bea7fd38fabe821a" instance_type = "t2.micro" vpc_security_group_ids = [aws_security_group.bespin-sg.id] subnet_id = aws_subnet.bespin-subnet-public-a.id associate_public_ip_address = true tags = { Name = "bespin-ec2-web-a" } user_data = data.template_file.user_data.rendered } data "template_file" "user_data" { template = file("${path.module}/userdata.sh") }archivo de datos de usuario.sh
#!/bin/bash USERS="bespin" GROUP="bespin" for i in $USERS; do /usr/sbin/adduser ${i}; /bin/echo ${i}:${i}1! | chpasswd; done cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config_old sed -i 's/PasswordAuthentication no/#PasswordAuthentication no/' /etc/ssh/sshd_config sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config systemctl restart sshdresultado del plan de terraformación
Error: failed to render : <template_file>:5,24-25: Unknown variable; There is no variable named "i"., and 2 other di agnostic(s) on instance.tf line 13, in data "template_file" "user_data": 13: data "template_file" "user_data" {¿Por qué recibo un error?
El argumento de la template en la fuente de datos template_file se procesa como sintaxis de plantilla de Terraform.
En esta sintaxis, usar ${...} tiene un significado especial, que la parte ... será inyectada por alguna var que se pasa a la plantilla.
Bash también permite esta sintaxis, para obtener los valores de las variables según su intención de usarla.
Para reconciliar esto, deberá escapar del carácter $ para que el compilador de la plantilla de terraform lo deje así, lo que puede hacer duplicando el carácter: $${i} en todos los casos.
https://www.terraform.io/docs/configuration/expressions.html#string-templates