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