Terraform GCP 启动脚本本地文件而不是内联文件

Posted

技术标签:

【中文标题】Terraform GCP 启动脚本本地文件而不是内联文件【英文标题】:Terraform GCP startup script local file instead of inline 【发布时间】:2020-01-01 02:17:51 【问题描述】:

网上有很多示例展示了如何在使用 Terraform 部署在 GCP/GCE 上的 VM 上运行启动脚本,但它们都使用内联启动脚本,所有启动脚本代码都包含在 terraform compute.tf 文件中。这可以通过启动脚本的单行或多行的

我意识到我可以编写一个包装脚本,将一个 compute.tf 和一个单独的启动文件组合成一个单独的 compute.tf,然后运行 ​​terraform,但我正在寻找更直接的路径,假设存在的话。

谢谢。

【问题讨论】:

【参考方案1】:

要在 GCE VM 声明中引用文件,只需使用 file function 从您选择的文件中读取内容。例如:

resource “google_compute_instance” “default” 
  …
  metadata_startup_script = “$file(“/path/to/your/file”)”

同样,您还可以使用template_file 数据源对模板文件执行令牌替换,然后在您的 GCE VM 声明中引用已解析的文件内容。例如:

data “template_file” “default” 
  template = “$file(“/path/to/your/file”)”
  vars = 
    address = “some value“
  


resource “google_compute_instance” “default” 
  …
  metadata_startup_script = “$data.template_file.default.rendered”

参考资料:

https://www.terraform.io/docs/providers/google/r/compute_instance.html https://www.terraform.io/docs/configuration-0-11/interpolation.html#file-path- https://www.terraform.io/docs/providers/template/d/file.html

【讨论】:

执行此操作时如何查看metadata_startup_script 的输出?目前脚本是用这种语法执行的,但我没有看到任何脚本输出/错误 无论启动脚本是如何提供的(无论是内联还是使用文件函数),脚本都会在 GCE VM 上执行,因此您将在serial port output 或通过在 Stackdriver 中检查其日志或访问 VM 并读取日志 directly。【参考方案2】:

通过登录实例并运行重新运行自定义启动脚本。

sudo google_metadata_script_runner --script-type startup

还要启用完整调试,请执行此操作

sudo DEBUG=1 google_metadata_script_runner

【讨论】:

调试在最后使用“--debug”:sudo DEBUG=1 google_metadata_script_runner --script-type startup --debug

以上是关于Terraform GCP 启动脚本本地文件而不是内联文件的主要内容,如果未能解决你的问题,请参考以下文章

自动执行 GCP 永久性磁盘初始化

在 terraform 文件而不是 env 变量中为 Terraform 提供凭据

GCP VM 启动和关闭脚本复制到哪里?

在同一个 TF 脚本中使用多个 Terraform 提供程序(GCP 和 Kubernetes)创建资源

使用 Terraform 和启动脚本创建专用网络 - Google Cloud Platform

如何使用 API 或 Terraform 模板在 GCP 中创建 StackDriver 工作区