跳到主要内容

函数调用

OpenTofu 语言具有一系列可在表达式中用于转换和组合值的 内置函数。这些类似于运算符,但都遵循通用语法。

代码块
<FUNCTION NAME>(<ARGUMENT 1>, <ARGUMENT 2>)

函数名称指定要调用的函数。每个定义的函数都期望特定数量的参数具有特定值类型,并返回特定值类型作为结果。

某些函数接受任意数量的参数。例如,min 函数接受任意数量的数字参数,并返回数值最小的那个。

代码块
min(55, 3453, 2)

函数调用表达式计算为函数的返回值。

可用函数

有关可用函数的完整列表,请参阅 函数参考

扩展函数参数

如果要传递给函数的参数在列表或元组值中可用,则可以将该值扩展为单独的参数。将列表值作为参数提供,并在其后跟上...符号。

代码块
min([55, 2453, 2]...)

扩展符号是三个句点 (...),而不是 Unicode 省略号字符 ()。扩展是一种特殊语法,仅在函数调用中可用。

将敏感数据用作函数参数

使用敏感数据(例如 输入变量定义为敏感的输出)作为函数参数时,将在函数调用期间跟踪参数中的敏感信息。

例如,将包含敏感输入变量的对象传递给keys()函数将返回我们期望的所有键的列表,但values()函数将导致列表的第一个项目为敏感的,因为键“a”的值是敏感的。

代码块
> local.baz
{
"a" = (sensitive value)
"b" = "dog"
}
> keys(local.baz)
[
"a",
"b",
]
> values(local.baz)
[
(sensitive value),
"dog",
]

OpenTofu 何时调用函数

在编程语言术语中,OpenTofu 的大多数内置函数都是 纯函数。这意味着它们的结果仅基于它们的参数,因此 OpenTofu 何时调用它们在实践上没有任何区别。

但是,一小部分函数会与外部状态交互,因此对于这些函数,了解 OpenTofu 在 OpenTofu 运行中发生的其它事件之前或之后何时调用它们可能会有所帮助。

这小组特殊的函数包括 filetemplatefiletimestampuuid。如果您没有使用这些函数,则无需阅读本节,尽管此处的某些信息仍然可能是有趣的背景信息。

filetemplatefile 函数旨在读取作为配置静态部分包含的文件,因此 OpenTofu 会在执行配置的任何其他操作之前,将其作为初始配置验证的一部分执行这些函数。这意味着您不能使用这两个函数读取配置可能在磁盘上作为计划或应用步骤的一部分动态生成的任何文件。

timestamp 函数返回 OpenTofu 调用它时当前系统时间的表示形式,而 uuid 函数返回在每次调用时都不同的随机结果。如果没有特殊行为,这两个函数都将导致应用步骤中的最终配置与计划中显示的操作不匹配,这违反了 OpenTofu 执行模型。

因此,OpenTofu 会安排这两个函数在计划步骤期间产生 未知值 结果,只有在应用步骤期间才会确定实际结果。特别是对于timestamp,这意味着记录的时间将是 OpenTofu 开始应用更改的那一刻,而不是 OpenTofu *计划*更改的那一刻。

有关这些函数行为的更多详细信息,请参阅其各自的文档页面。