Terraform 配置和 HCL 语言概述
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的状态管理和如何管理多环境配置也是十分重要的。