如何在 terraform 中将变量设置为非 tf 文件?

How to set variable to non tf file in terraform?

在 terraform 中,我想创建一个初始化脚本的实例。

resource "aws_instance" "server" {
  ...
  user_data = file("./script.sh")
}

在script.sh中,我想在里面设置一个变量

#!/bin/bash

echo 'Server name is ': ${var.server_name}

在vars.tf

variable "server_name" {
  description = "EC2 Server Name"
  type        = string
  default     = "ci server"
}

var 语法是针对 terraform 文件的,如何将其传递给 shell 文件?

要实现这一点,您可以使用 templatefile 函数。 https://www.terraform.io/language/functions/templatefile [1]:

templatefile 读取给定路径的文件并使用提供的一组模板变量将其内容呈现为模板。

示例:

给定一个包含以下内容的模板文件 backends.tftpl

%{ for addr in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}

模板文件函数呈现模板:

> templatefile("${path.module}/backends.tftpl", { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })
backend 10.0.0.1:8080
backend 10.0.0.2:8080

在你的例子中你需要改变你的script.sh并使它成为一个模板,它指的是${server_name}然后一个执行的例子是这样的:

locals {
  vars = {
    server_name = ${var.server_name}
  }
}

template-script.sh = templatefile("script.sh", vars)

resource "aws_instance" "server" {
  ...
  user_data = file("./template-script.sh")
}

我建议直接在 user_data 配置中使用模板语法方法。像下面这样的东西你可以试试

resource "aws_instance" "server" {
  ...
  user_data = <<-EOT
    echo 'Server name is ':${lookup(aws_instance.instance.tags, "Name")}
  EOT
}

参考:

https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file

https://github.com/terraform-aws-modules/terraform-aws-ec2-instance/issues/59

不需要做太多的工作,我会说做你想做的最好的方法是使用 templatefile built-in 函数 [1]:

  user_data = templatefile("${path.module}/script.sh",
    {
      server_name = var.server_name
  })

在这种情况下,脚本将如下所示:

#!/bin/bash

echo 'Server name is ': ${server_name}

[1] https://www.terraform.io/language/functions/templatefile