跳到主要内容

templatestring 函数

templatestring 函数通过用来自提供的模板变量集的值替换占位符来启用字符串作为模板的渲染。

代码块
templatestring(str, vars)

模板语法遵循 OpenTofu 主语言中 字符串模板 的规则,使用以 ${ ... } 分隔的插值序列。此函数提供了将较长的模板序列分解到单独的字符串中的灵活性,以提高可读性和可管理性。

使用 templatestring 函数时,请务必记住使用转义序列以防止过早插值。为了确保占位符在转换为模板变量之前被视为字面量,请使用转义序列 $${...}%%{...} 分别表示 ${...}%{...} 字面量。这种方法可以防止模板在处理之前将占位符解释为插值或模板指令序列。通过遵循此约定,您可以准确地表示模板字符串,而不会遇到意外的语法错误。请记住在定义模板字符串时应用这些转义序列,以确保 templatestring 函数正确处理它们。

"vars" 参数必须是对象。在模板字符串中,映射中的每个键都用作插值的变量。此外,模板可以使用 OpenTofu 语言中可用的任何其他函数。变量名必须符合 OpenTofu 命名约定,以字母开头,后面可以跟零个或多个字母、数字或下划线。

由于 OpenTofu 中的字符串表示 Unicode 字符序列,因此 templatestring 将模板字符串解释为 UTF-8 编码的文本,确保正确处理 Unicode 字符。模板字符串中的任何无效 UTF-8 序列都将导致错误。

示例

简单字符串模板

一个展示使用 templatestring 进行静态字符串的基本示例。

代码块
output "result" {
value = templatestring("Hello, Jodie!", {})
}
代码块
result = Hello, Jodie!

带有变量的字符串插值

此示例演示了通过将变量值插入模板来进行字符串插值。

代码块
output "result" {
value = templatestring("Hello, $${name}!", { name = "Alice" })
}
代码块
result = Hello, Alice!

列表

此示例演示了使用带有列表变量的 templatestring 函数。

代码块
output "result" {
value = templatestring("List Items: $${join(\", \", list)}", { list=["value1","value2","value3"] })
}
代码块
result = "List Items : value1, value2, value3"

映射

此示例演示了使用带有映射变量的 templatestring 函数。它遍历映射中的键值对。

代码块
output "result" {
value = templatestring("%%{ for key, value in list ~} $${key}:$${value} %%{ endfor ~}", { list={key1="value1", key2="value2", key3="value3"} })
}
代码块
result = "key1:value1 key2:value2 key3:value3 "

生成 JSON 或 YAML

在生成 JSON 或 YAML 语法字符串时,编写包含大量插值序列和指令的模板可能会很麻烦。相反,通过使用一个包含单个插值调用 jsonencodeyamlencode 的模板来简化该过程,并使用 标准 OpenTofu 表达式语法 指定要编码的值,如下面的示例所示

代码块
locals {
list = ["Value1", "Value2", "Value3"]
formatted_list = "%{ for value in local.list ~}${value} %{ endfor ~}"
}

output "result" {
value = templatestring(yamlencode(local.formatted_list), {})
}
代码块
result = <<-EOT
"Value1 Value2 Value3 "
EOT

有关更多信息,请参阅 jsonencodeyamlencode 的主要文档。