terraform - 读取包含 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 ..
,因为我的脚本有点长。
解决方案
该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'
...其中周围的'
引号字符和字符串中的特殊转义'
应该导致外壳程序按字面意思解释值,完全按照模块的调用者提供的方式。
推荐阅读
- hl7-fhir - 在 FHIR 资源上添加对外部 PDF 的引用
- android - Android:如何在没有滚动功能的列表中显示所有项目
- python - Python Flask - “检查用户名是否存在于 MySQL 数据库中”
- android - 如何将 XP 积分添加到 Google Play 游戏?
- regex - Match repeatable string as a "whole word" in Lua 5.1
- c++ - 为什么投不成功?
- amazon-web-services - 随着时间的推移,CloudFront 上的静态内容缓存不正确
- python - for 循环执行第一个动作但不执行第二个动作
- javascript - Bootstrap 和 Select2 表单验证
- google-signin - 当用户登录多个谷歌帐户时显示多登录弹出窗口,如果用户仅登录一个帐户则绕过登录弹出窗口