基本概念
Terraform 工作流程包括模板编写、初始化、预览、执行四部分。本文主要介绍模板编写,即 Terraform 配置和 Hashicorp 配置语言(Hashicorp Configuration Language,HCL)。
Terraform 目录
我们从编写阶段开始,在这里您会在 .tf 文件中编写 Terraform 代码。 在编写代码之前,首先创建一个 Terraform 配置的目录。Terraform 配置是一个完整的 Terraform 语言文档,它告诉Terraform 如何管理给定的基础设施集合。Terraform 配置存储在 .tf 扩展名的文件中。 一个 Terraform 配置目录可以由多个文件和目录组成。一个Terraform配置包括:一个根模块和可选的多个子模块树。
根模块
根模块也被称为根配置文件,是运行 Terraform 命令的工作目录。在该目录中,Terraform 将寻找所有 .tf 文件,并使用它们来创建执行计划。您可以在单个根配置文件中编写所有的资源和其他代码结构(如入参变量,出参定义,提供商等),但最佳实践是按照逻辑将资源拆分到不同的配置文件中。
子模块
子模块是可选的,每个子模块可以是出于对某类复用功能的抽象,也可以是出于对根模块复杂逻辑的简化。根模块通过对子模块的引用来降低根模块的编写复杂度,提升复用性和可读性。
每个模块通常会包含如下几种配置文件:
资源配置文件(main.tf)
声明所要管理的基础设施资源及其期望的状态,通常命名为 main.tf,也可以按照资源类型或者产品名称或者场景进行自定义,如 ecs.tf,network.tf,database.tf等
提供商配置文件(provider.tf)
声明当前模块使用到的提供商的名称、版本以及认证方式,如 aliyun/alicloud,hashicorp/random 等
入参配置文件(variables.tf)
声明当前模块使用到的变量,以便在执行 Terraform 命令的时候,可以通过传入不同的变量值来提升模块的灵活性
出参配置文件(outputs.tf)
声明期望当前模块中的资源在完成创建后输出的变量值,比如实例 ID,IP 地址等
HCL 语言
在知道如何创建目录结构后,接下来将介绍用于编写 Terraform 配置的语言 HCL。
HCL 用于创建和管理基于 API 的资源,主要是云上的资源。资源是基础设施对象的统称,可以是基础设施实体,如虚拟机、磁盘、容器和网络等,也可以是服务于基础设施的逻辑单元,如访问控制规则,安全组规则等。Terraform 使用 HCL 在你的阿里云环境中定义资源,创建和管理这些资源以及其所依赖的其他资源。
HCL是一种配置语言,尽管和编程语言有一些共性,但它不是编程语言。它是基于 JSON 的变种,对人和机器更友好。HCL 的简单性使得 Terraform 对开发者来说很容易理解和掌握。
HCL 包括了有限的基本元素,如变量、资源、输出和模块。它不包括任何传统的编程语句或控制循环,而是通过赋值、count 和内置函数来表达相关的资源定义逻辑。
HCL 语法
下图显示了通用的 HCL 语法,主要包括块(Block),参数(Argument),标识符(Identifier),表达式(Expression),注释等几部分。
块(Block)
块是一系列属于某种类型的代码行,比如资源(resource)、变量(variable)、输出(output)、模块(module)等。块可以是简单的类型,也可以是嵌套另一种块类型的复杂类型。
参数(Argument)
参数是块的一部分,用于给名称分配值。块包含必填的参数和可选的参数。
标识符(Identifier) 标识符是参数、块类型或任何 Terraform 特定结构的名称。标识符可以包括字母、下划线、连字符和数字,但不能以数字开头。
表达式(Expression)
可以用来在代码块中给标识符分配一个值。这些表达式可以是简单类型的值,如字符串,数字等,也可以是复杂类型的值,如对象,数组,Map 等。
注释
注释以
#
开始和结束,用于单行注释。除此之外,//
也用于单行注释,/*
和*/
用于多行注释。
值得注意的是,HCL 本质上是声明式的,意味着模板中定义的块代表了基础设施的最终状态。因此,块或文件的顺序并不重要。
HCL的设计目的是使基础设施编码既易于人类阅读,也便于机器处理。通过使用 HCL,Terraform 允许您以高度抽象的方式声明性地定义云资源,而无需关心资源创建和管理的具体步骤。这种方法既简化了云基础设施的管理,又使开发者更专注于应用逻辑和服务的构建。
在实际应用中,良好的 Terraform 配置应该遵循一定的最佳实践,如适当地组织文件、使用模块化方法来复用代码、以及通过参数化使配置更加灵活。此外,了解Terraform的状态管理和如何管理多环境配置也是十分重要的。
- 本页导读 (1)
- Terraform 目录
- HCL 语言
- HCL 语法