跳到主要内容

配置语法

本节中的其他页面描述了可以在 OpenTofu 语言中出现的各种配置结构。此页面更详细地描述了该语言的底层语法,揭示了这些结构的构建块。

此页面描述了 OpenTofu 语言的 *原生语法*,它是一种为人类设计得相对易于阅读和编写的丰富语言。OpenTofu 语言中的结构也可以用 JSON 语法 表示,这种语法对人类来说更难阅读和编辑,但更容易以编程方式生成和解析。

OpenTofu 语言的这种底层语法是用一种称为 *HCL* 的语法定义的,这种语法也用于其他应用程序中的配置语言,尤其是其他 HashiCorp 产品。使用 OpenTofu 不需要了解 HCL 语法的全部细节,因此此页面总结了最重要的细节。如果您有兴趣,可以在 HCL 原生语法规范 中找到 HCL 语法的完整定义。

参数和块

OpenTofu 语言语法围绕着两个关键的语法结构构建:参数和块。

参数

*参数* 将值分配给特定名称

代码块
image_id = "abc123"

等号之前的标识符是 *参数名称*,等号之后的表达式是参数的值。

参数出现的上下文决定了哪些值类型有效(例如,每个资源类型都有一个模式定义了其参数的类型),但许多参数接受任意 表达式,这允许值以字面量方式指定或以编程方式从其他值生成。

*块* 是其他内容的容器

代码块
resource "aws_instance" "example" {
ami = "abc123"

network_interface {
# ...
}
}

块有一个 *类型*(本例中的 resource)。每个块类型定义了在类型关键字后面必须跟随多少个 *标签*。resource 块类型需要两个标签,在本例中是 aws_instanceexample。特定块类型可以有任意数量的必需标签,或者可能不需要任何标签,就像嵌套的 network_interface 块类型一样。

在块类型关键字和任何标签之后,块 *主体* 由 {} 字符分隔。在块主体中,可以嵌套更多的参数和块,创建块及其关联参数的层次结构。

OpenTofu 语言使用有限数量的 *顶级块类型*,它们是在配置文件中的任何其他块之外可以出现的块。OpenTofu 的大多数功能(包括资源、输入变量、输出值、数据源等)都是作为顶级块实现的。

标识符

参数名称、块类型名称以及大多数 OpenTofu 特定构造(如资源、输入变量等)的名称都是 *标识符*。

标识符可以包含字母、数字、下划线 (_) 和连字符 (-)。标识符的第一个字符不能是数字,以避免与字面数字混淆。

有关完整的标识符规则,OpenTofu 实现了 Unicode 标识符语法,并扩展为包含 ASCII 连字符 -

注释

OpenTofu 语言支持三种不同的注释语法。

  • # 开始单行注释,以行尾结束。
  • // 作为 # 的替代方案,也开始单行注释。
  • /**/ 是跨越多行的注释的开始和结束分隔符。

# 单行注释样式是默认的注释样式,应该在大多数情况下使用。自动配置格式化工具可能会自动将 // 注释转换为 # 注释,因为双斜杠样式不是惯用的。

字符编码和行结束符

OpenTofu 配置文件必须始终使用 UTF-8 编码。虽然该语言的分隔符都是 ASCII 字符,但 OpenTofu 接受标识符、注释和字符串值中的非 ASCII 字符。

OpenTofu 接受使用 Unix 风格的行结束符(仅 LF)或 Windows 风格的行结束符(CR 后跟 LF)的配置文件,但惯用的样式是使用 Unix 约定,因此自动配置格式化工具可能会自动将 CRLF 结束符转换为 LF。