访问user_data提供程序模板文件中的Terraform变量

Tim*_* T. 10 amazon-web-services terraform

我正在aws_launch_configuration使用terraform 启动一个实例.

我正在为user_data变量使用shell脚本,如下所示:

resource "aws_launch_configuration" "launch_config" {
    ...
     user_data                     = "${file("router-init.sh")}"
    ....  
}
Run Code Online (Sandbox Code Playgroud)

在这个router-init.sh中,我想做的事情之一是访问我通过terraform启动的其他实例的ip地址.

我知道我可以使用splat访问该实例的所有IP地址,例如:

output ip_address {
    value = ${aws_instance.myAWSInstance.*.private_ip}"
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在router-init.sh脚本中传递/访问这些IP地址?

Bra*_*ler 17

您可以使用template_file数据源执行此操作:

data "template_file" "init" {
  template = "${file("router-init.sh.tpl")}"

  vars = {
    some_address = "${aws_instance.some.private_ip}"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在模板中引用它,如:

#!/bin/bash

echo "SOME_ADDRESS = ${some_address}" > /tmp/
Run Code Online (Sandbox Code Playgroud)

然后用它来user_data:

 user_data = ${data.template_file.init.rendered}
Run Code Online (Sandbox Code Playgroud)


Moh*_*ajr 17

对于从 Terraform 0.12 及更高版本开始来到这里的人,应该使用templatefile 函数而不是使用 template_file 资源,因此对于问题中的示例,它将类似于

locals {
  vars = {
    some_address = aws_instance.some.private_ip
  }
}

user_data = base64encode(templatefile("${path.module}/router-init.sh", local.vars))
Run Code Online (Sandbox Code Playgroud)


San*_*m16 5

从 Terraform 0.12 及更高版本开始,您可以使用 templatefile 函数而不是 template_file 资源,因此对于需要访问多个变量的一般用例,您可以使用:

    locals {
      variable1       = "your_username"
      variable2       = "your_password"
      db_address      = aws_db_instance.some-db.address
      public_alb_dns  = aws_lb.some-alb.dns_name
    }
    
    resource "aws_instance" "web_01" {
      ....
      user_data = base64encode(templatefile("user_data.sh", {
        db_address      = local.db_address
        admin_user      = local.variable1
        admin_password  = local.variable2
        public_alb_dns  = local.private_alb_dns
      } ))
      ....
    }
Run Code Online (Sandbox Code Playgroud)

您还可以访问其他 terraform 资源属性引用。