1

我正在尝试将 bash 脚本传递给 3 AWS 启动模板用户数据。该脚本根据特定变量从 Github 调用其他脚本。由于每个启动模板都必须调用不同的脚本,因此最好的方法是完成它。我目前正在尝试配置数据源模板文件,但我找不到做我需要的方法。

这是 bash 脚本的一部分,我在其中放置了一个变量,该变量需要根据每次构建的启动模板来更改其值:

#------------------------------------------------------------------------------------------
# Define here scripts (separated with 1 space) that will be executed on first run:
AMI_SCRIPTS="ami_base_lynis.sh ${ami_script}"
#------------------------------------------------------------------------------------------
download_and_run_scripts

这是模板文件数据源:

data "template_file" "AMIs"{
    template = "${file("../AMIs/s1_aws_userdata.sh")}"
    vars = {
      ami = var.dci_appserver_ami

    }
}

这是用户数据属性:

user_data_base64          = base64encode(data.template_file.AMIs.rendered)

这对我不起作用,因为它将替换对于所有 3 个启动模板具有相同值的变量。如何每次分配不同的值?

4

1 回答 1

1

您使用的语法user_data_base64告诉我您使用的是 Terraform v0.12 或更高版本,因此您不应再使用文档template_file中所示template_file

在 Terraform 0.12 及更高版本中,templatefile函数提供了一种用于从文件渲染模板的内置机制。请改用该函数,除非您使用的是 Terraform 0.11 或更早版本。

因此,我将使用该templatefile函数来回答。


在每个启动模板资源块中,您可以templatefile使用模板变量的不同值进行调用,以便每次获得不同的结果:

resource "aws_launch_template" "example1" {
  # ...

  user_data = base64encode(templatefile("${path.module}/../AMIs/s1_aws_userdata.sh", {
    ami        = var.dci_appserver_ami
    ami_script = "script1.sh"
  }))
}

resource "aws_launch_template" "example2" {
  # ...

  user_data = base64encode(templatefile("${path.module}/../AMIs/s1_aws_userdata.sh", {
    ami        = var.dci_appserver_ami
    ami_script = "script2.sh"
  }))
}

resource "aws_launch_template" "example3" {
  # ...

  user_data = base64encode(templatefile("${path.module}/../AMIs/s1_aws_userdata.sh", {
    ami        = var.dci_appserver_ami
    ami_script = "script3.sh"
  }))
}

如果您想更系统地执行此操作,原则上可以将模板构造为本地值,但由于您的问题没有包括任何迹象表明您在此处对启动模板进行了任何特殊处理,因此我刚刚编写了最简单的可能的方法,其中每个启动模板都有自己的模板渲染表达式。

于 2021-09-14T00:18:19.670 回答