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

29

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

我正在使用shell脚本来设置user_data变量,就像这样:

resource "aws_launch_configuration" "launch_config" {
    ...
    user_data = "${file("router-init.sh")}"
    ...  
}

在这个 router-init.sh 文件中,我想要做的一件事情是能够访问通过 terraform 启动的其他实例的 IP 地址。

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

output ip_address {
    value = ${aws_instance.myAWSInstance.*.private_ip}"
}

router-init.sh脚本中有没有一种方法可以传递/访问这些IP地址?

3个回答

50
您可以使用 template_file 数据源 来实现这一点。
data "template_file" "init" {
  template = "${file("router-init.sh.tpl")}"

  vars = {
    some_address = "${aws_instance.some.private_ip}"
  }
}

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

{{ 变量名 }}

#!/bin/bash

echo "SOME_ADDRESS = ${some_address}" > /tmp/

然后将其用于 user_data

 user_data = ${data.template_file.init.rendered}

当您依赖于正在创建的实例的输出时,这是否可能?我期望这是一个循环依赖,其中用户数据需要知道自身IP地址的输出以及同时创建的其他实例(通过count)。 - ydaetskcoR
哦,算了,我刚意识到LC想知道一些不在ASG中的不同AWS实例。这是一个奇怪的用例,但是没问题,可以做到。 - ydaetskcoR
是的,依赖关系可能很困难,但您可以使用depends_on更明确地使资源依赖于另一个资源。如果它需要知道它的IP,则可以从实例内部获取该信息。 - Brandon Miller
非常感谢!我已经实现了这个,它可以工作。 - Timothy T.
我认为第二行应该是: template = "${file("router-init.sh.tpl")}" - Rezler
正确的@rezler,不确定我是如何包含一些额外字符的。已经修复了。 - Brandon Miller

15

对于使用 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))

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
      } ))
      ....
    }

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接