首页 > 解决方案 > 读取包含 Terraform 中变量的外部文件

问题描述

我正在google_compute_instance使用 Terraform 部署一个。该实例应在创建时运行脚本。使用属性metadata_startup_script

resource "google_compute_instance" "couchbase_host" {
   ...

   metadata_startup_script = file("vm_setup.sh")
}

哪里vm_setup.sh

program --arg ${var.my_value}

file()提取到原始字符串,这意味着未填充变量。如何在我的 ? 中使用 terraform 变量.sh?我试图避免使用heredoc << EOF ..,因为我的脚本有点长。

标签: terraform

解决方案


templatefile函数与从磁盘读取给定文件file函数类似,但它还将文件的内容额外解释为字符串模板,因此您可以将外部值插入其中。

例如:

   metadata_startup_script = templatefile("${path.module}/vm_setup.sh.tmpl", {
     arg_value = var.my_value
   })

在模板文件中,您可以使用${arg_value}将给定值从第二个参数中的对象替换为templatefile.


请注意,仅直接引用该值,结果不一定是有效的 shell 语法——调用者可能会设置var.my_value为会被 shell 误解的东西。避免这种情况的一种方法是使用replace函数对值应用单引号,假设此脚本最终将由 Unix 样式的 shell(bash 等)评估:

program --arg '${replace(arg_value, "'", "'\\''")}'

如果arg_value具有该值I'm a troublemaker,则上述模板将产生以下结果:

program --arg 'I'\''m a troublemaker'

...其中周围的'引号字符和字符串中的特殊转义'应该导致外壳程序按字面意思解释值,完全按照模块的调用者提供的方式。


推荐阅读