Jas*_*hua 1 interpolation google-cloud-storage terraform
我有一个谷歌存储桶对象,它是通过 terraform 创建的,如下所示:
resource "google_storage_bucket_object" "my_post_startup_script" {
name = "my-script.sh"
source = "${path.module}/my-script.sh"
bucket = my_bucket
}
Run Code Online (Sandbox Code Playgroud)
但在该脚本内部是我想要创建变量的东西。
所以说 my-script.sh 看起来像:
#!/bin/bash
echo "hello ${name}"
Run Code Online (Sandbox Code Playgroud)
有没有办法让我传递一个变量以便进行插值,以便上传的脚本实际上说“你好约翰”
这可能需要一些中间步骤,创建一个带有变量插值的文件,然后我可以将其作为 google_storage_bucket_object 的源传入 - 但不确定如何完成。
按照到目前为止您编写的方式,是 Google 提供程序本身读取该文件my-script.sh,因此到那时进行任何进一步的 Terraform 模板处理都为时已晚;模板处理是 Terraform 语言本身的一部分,发生在将配置传递给提供者之前。
但是,google_storage_bucket_object还有一个替代参数content,它允许您将所需的内容直接传递给提供者,而提供者不需要从文件本身读取它。最简单的形式允许您将常量值发送到提供程序,而无需先将它们写入磁盘:
resource "google_storage_bucket_object" "my_post_startup_script" {
name = "my-script.sh"
bucket = my_bucket
content = "Hello world!"
}
Run Code Online (Sandbox Code Playgroud)
但是,该content参数可以采用任何返回字符串的有效 Terraform 语言表达式,一个这样的示例是对 的调用templatefile,这是一个要求 Terraform 本身(核心运行时,而不是提供程序)从磁盘读取文件并解释的函数其内容作为字符串模板。
将这两件事放在一起,您可以这样做:
resource "google_storage_bucket_object" "my_post_startup_script" {
name = "my-script.sh"
bucket = my_bucket
content = templatefile("${path.module}/my-script.sh", {
name = var.example_name
})
}
Run Code Online (Sandbox Code Playgroud)
对于您在此处共享的简单示例,无论是 Terraform 本身还是最终从磁盘读取文件的 Google Cloud Platform 提供商都没有太大区别,但存在一些实际差异,这些差异在其他方面可能很重要情况:
content要求内容是 Unicode 字符串,并且提供程序在保存之前将其编码为 UTF-8。source另一方面,如果您使用,则提供程序将仅按原样获取文件中的原始字节并上传它们,因此您可以上传其他字符编码的文本或上传根本不是文本的文件。content,而使用source之前您只会看到文件名。在许多情况下,人们认为这是使用的优点content而不是缺点,但如果内容特别大(从而使计划输出很长)或者包含不适合在计划中显示的内容,则可能会很麻烦控制台输出。content较小的对象,例如脚本和其他小配置文件。如果您的用例包括处理聚集在子目录中的大量模板文件,您可能会发现Terraform 模块hashicorp/dir/template很有用。它包装了templatefile和fileset函数调用,以准备多个文件以便一次上传所有文件,并以您可以google_storage_bucket_object使用for_each.
| 归档时间: |
|
| 查看次数: |
2562 次 |
| 最近记录: |