Google cloud storage 如何在terraform 13.5中将变量传递给google_存储_bucket_对象

Google cloud storage 如何在terraform 13.5中将变量传递给google_存储_bucket_对象,google-cloud-storage,terraform,interpolation,Google Cloud Storage,Terraform,Interpolation,我有一个google storage bucket对象,它是通过terraform创建的,如下所示: 但在这个脚本中,我想做一些变量 因此,假设my-script.sh看起来像: #!/bin/bash echo "hello ${name}" 有没有一种方法可以让我传入一个变量进行插值,这样上传的脚本实际上会说“hello John” 这可能需要一些中间步骤来创建一个带有变量插值的文件,然后我可以将其作为google_storage_bucket_对象的源传入,但不确定这

我有一个google storage bucket对象,它是通过terraform创建的,如下所示:

但在这个脚本中,我想做一些变量

因此,假设my-script.sh看起来像:

#!/bin/bash
echo "hello ${name}"
有没有一种方法可以让我传入一个变量进行插值,这样上传的脚本实际上会说“hello John”


这可能需要一些中间步骤来创建一个带有变量插值的文件,然后我可以将其作为google_storage_bucket_对象的源传入,但不确定这将如何完成。

按照您目前编写的方式,是google提供商自己读取文件
my script.sh
,因此,到那时,对任何进一步的地形模板处理来说都为时已晚;模板处理是Terraform语言本身的一部分,发生在将配置传递给提供者之前

但是,还有一个可选参数
content
,它允许您将所需内容直接传递给提供商,而提供商无需从文件本身读取内容。以最简单的形式,允许您将常量值发送到提供程序,而无需先将其写入磁盘:

resource "google_storage_bucket_object" "my_post_startup_script" {
  name   = "my-script.sh"
  bucket = my_bucket

  content = "Hello world!"
}
但是,
content
参数可以采用任何返回字符串的有效Terraform语言表达式,其中一个例子是调用,该函数要求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
  })
}
对于您在这里分享的简单示例,无论是Terraform本身还是最终从磁盘读取文件的Google云平台提供商,都没有太大区别,但在其他情况下,有一些实际差异可能很重要:

  • Terraform字符串始终是Unicode字符序列,而不是原始字节,因此使用
    content
    传递值要求内容是Unicode字符串,提供者在保存之前将其编码为UTF-8。另一方面,如果您使用
    source
    ,则提供程序只需按原样获取文件中的原始字节并将其上载,因此您可以上载其他字符编码中的文本或上载根本不是文本的文件
  • 因为它现在是呈现发送给提供者的模板时产生的字符串,而不仅仅是文件名,所以您将看到Terraform plan输出中显示的内容本身,其中包含
    内容
    ,而使用
    源代码
    ,您以前只会看到文件名。在很多情况下,人们认为这是使用<代码>内容< /代码>的优点,而不是缺点,但如果内容特别大(从而使计划输出长)或包含不适合在控制台输出中显示的内容,则可能是麻烦的。
  • 由于提供程序协议、SDK和系统上可用内存等各种技术细节,对地形资源配置的大小存在实际限制,因此使用
    内容
    仅适用于相对较小的对象,例如脚本和其他小型配置文件


如果您的用例包括处理聚集在一个子目录中的大量模板文件,您可能会发现这很有用。它包装了
模板文件
文件集
函数调用,以准备一系列文件以便一次上载,并以某种方式返回它们。

按照您目前编写的方式,是谷歌提供商自己读取文件
我的脚本.sh
,因此,到那时,对任何进一步的地形模板处理来说都为时已晚;模板处理是Terraform语言本身的一部分,发生在将配置传递给提供者之前

但是,还有一个可选参数
content
,它允许您将所需内容直接传递给提供商,而提供商无需从文件本身读取内容。以最简单的形式,允许您将常量值发送到提供程序,而无需先将其写入磁盘:

resource "google_storage_bucket_object" "my_post_startup_script" {
  name   = "my-script.sh"
  bucket = my_bucket

  content = "Hello world!"
}
但是,
content
参数可以采用任何返回字符串的有效Terraform语言表达式,其中一个例子是调用,该函数要求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
  })
}
对于您在这里分享的简单示例,无论是Terraform本身还是最终从磁盘读取文件的Google云平台提供商,都没有太大区别,但在其他情况下,有一些实际差异可能很重要:

  • Terraform字符串始终是Unicode字符序列,而不是原始字节,因此使用
    content
    传递值要求内容是Unicode字符串,提供者在保存之前将其编码为UTF-8。另一方面,如果您使用
    source
    ,则提供程序只需按原样获取文件中的原始字节并将其上载,因此您可以上载其他字符编码中的文本或上载根本不是文本的文件
  • 因为它现在是呈现发送给提供者的模板时产生的字符串,而不仅仅是文件名,所以您将看到Terraform plan输出中显示的内容本身,其中包含
    内容
    ,而使用
    源代码
    ,您以前只会看到文件名。在很多情况下,人们认为这是使用<代码>内容< /代码>的优点,而不是缺点,但是如果内容特别大(因此使计划输出长)或如果I,则可能是麻烦的。