- OpenTofu 语言
- 语法
- 配置语法
配置语法
本节中的其他页面描述了可以在 OpenTofu 语言中出现的各种配置结构。此页面更详细地描述了该语言的底层语法,揭示了这些结构的构建块。
此页面描述了 OpenTofu 语言的 *原生语法*,它是一种为人类设计得相对易于阅读和编写的丰富语言。OpenTofu 语言中的结构也可以用 JSON 语法 表示,这种语法对人类来说更难阅读和编辑,但更容易以编程方式生成和解析。
OpenTofu 语言的这种底层语法是用一种称为 *HCL* 的语法定义的,这种语法也用于其他应用程序中的配置语言,尤其是其他 HashiCorp 产品。使用 OpenTofu 不需要了解 HCL 语法的全部细节,因此此页面总结了最重要的细节。如果您有兴趣,可以在 HCL 原生语法规范 中找到 HCL 语法的完整定义。
参数和块
OpenTofu 语言语法围绕着两个关键的语法结构构建:参数和块。
参数
*参数* 将值分配给特定名称
image_id = "abc123"
等号之前的标识符是 *参数名称*,等号之后的表达式是参数的值。
参数出现的上下文决定了哪些值类型有效(例如,每个资源类型都有一个模式定义了其参数的类型),但许多参数接受任意 表达式,这允许值以字面量方式指定或以编程方式从其他值生成。
OpenTofu 的配置语言基于一种更通用的语言称为 HCL,而 HCL 的文档通常使用“属性”一词而不是“参数”。这些词语足够相似,可以在这种情况下互换使用,经验丰富的 OpenTofu 用户在非正式谈话中可能会使用任何一个词语。但由于 OpenTofu 还与称为“属性”的几种 *其他* 内容进行交互(尤其是 OpenTofu 资源具有 id
等属性,可以从表达式中引用,但不能在配置中分配值),因此我们在 OpenTofu 文档中选择使用“参数”来指代这种语法结构。
块
*块* 是其他内容的容器
resource "aws_instance" "example" {
ami = "abc123"
network_interface {
# ...
}
}
块有一个 *类型*(本例中的 resource
)。每个块类型定义了在类型关键字后面必须跟随多少个 *标签*。resource
块类型需要两个标签,在本例中是 aws_instance
和 example
。特定块类型可以有任意数量的必需标签,或者可能不需要任何标签,就像嵌套的 network_interface
块类型一样。
在块类型关键字和任何标签之后,块 *主体* 由 {
和 }
字符分隔。在块主体中,可以嵌套更多的参数和块,创建块及其关联参数的层次结构。
OpenTofu 语言使用有限数量的 *顶级块类型*,它们是在配置文件中的任何其他块之外可以出现的块。OpenTofu 的大多数功能(包括资源、输入变量、输出值、数据源等)都是作为顶级块实现的。
标识符
参数名称、块类型名称以及大多数 OpenTofu 特定构造(如资源、输入变量等)的名称都是 *标识符*。
标识符可以包含字母、数字、下划线 (_
) 和连字符 (-
)。标识符的第一个字符不能是数字,以避免与字面数字混淆。
有关完整的标识符规则,OpenTofu 实现了 Unicode 标识符语法,并扩展为包含 ASCII 连字符 -
。
注释
OpenTofu 语言支持三种不同的注释语法。
#
开始单行注释,以行尾结束。//
作为#
的替代方案,也开始单行注释。/*
和*/
是跨越多行的注释的开始和结束分隔符。
#
单行注释样式是默认的注释样式,应该在大多数情况下使用。自动配置格式化工具可能会自动将 //
注释转换为 #
注释,因为双斜杠样式不是惯用的。
字符编码和行结束符
OpenTofu 配置文件必须始终使用 UTF-8 编码。虽然该语言的分隔符都是 ASCII 字符,但 OpenTofu 接受标识符、注释和字符串值中的非 ASCII 字符。
OpenTofu 接受使用 Unix 风格的行结束符(仅 LF)或 Windows 风格的行结束符(CR 后跟 LF)的配置文件,但惯用的样式是使用 Unix 约定,因此自动配置格式化工具可能会自动将 CRLF 结束符转换为 LF。