Terraform 配置和 HCL 语言概述

更新时间:

Terraform 工作流程包括模板编写、初始化、预览、执行四部分。本文主要介绍模板编写,即 Terraform 配置和 Hashicorp 配置语言(Hashicorp Configuration Language,HCL)。

Terraform 目录

我们从编写阶段开始,在这里你会在 .tf 文件中编写 Terraform 代码。 在编写代码之前,首先创建一个 Terraform 配置的目录。Terraform 配置是一个完整的 Terraform 语言文档,它告诉Terraform 如何管理给定的基础设施集合。Terraform 配置存储在 .tf 扩展名的文件中。 一个 Terraform 配置目录可以由多个文件和目录组成。一个Terraform配置包括:一个根模块和可选的多个子模块树。

  • 根模块

    根模块也被称为根配置文件,是运行 Terraform 命令的工作目录。在该目录中,Terraform 将寻找所有 .tf 文件,并使用它们来创建执行计划。你可以在单个根配置文件中编写所有的资源和其他代码结构(如入参变量,出参定义,提供商等),但最佳实践是按照逻辑将资源拆分到不同的配置文件中。

  • 子模块

    子模块是可选的,每个子模块可以是出于对某类复用功能的抽象,也可以是出于对根模块复杂逻辑的简化。根模块通过对子模块的引用来降低根模块的编写复杂度,提升复用性和可读性。

截屏2024-10-21 10.43.24.png

每个模块通常会包含如下几种配置文件:

  • 资源配置文件(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),注释等几部分。

image (6).png

  • 块(Block)

    块是一系列属于某种类型的代码行,比如资源(resource)、变量(variable)、输出(output)、模块(module)等。块可以是简单的类型,也可以是嵌套另一种块类型的复杂类型。

  • 参数(Argument)

    参数是块的一部分,用于给名称分配值。块包含必填的参数和可选的参数。

  • 标识符(Identifier) 标识符是参数、块类型或任何 Terraform 特定结构的名称。标识符可以包括字母、下划线、连字符和数字,但不能以数字开头。

  • 表达式(Expression)

    可以用来在代码块中给标识符分配一个值。这些表达式可以是简单类型的值,如字符串,数字等,也可以是复杂类型的值,如对象,数组,Map 等。

  • 注释

    注释以#开始和结束,用于单行注释。除此之外,//也用于单行注释,/**/用于多行注释。

值得注意的是,HCL 本质上是声明式的,意味着模板中定义的块代表了基础设施的最终状态。因此,块或文件的顺序并不重要。

HCL的设计目的是使基础设施编码既易于人类阅读,也便于机器处理。通过使用 HCL,Terraform 允许您以高度抽象的方式声明性地定义云资源,而无需关心资源创建和管理的具体步骤。这种方法既简化了云基础设施的管理,又使开发者更专注于应用逻辑和服务的构建。

在实际应用中,良好的 Terraform 配置应该遵循一定的最佳实践,如适当地组织文件、使用模块化方法来复用代码、以及通过参数化使配置更加灵活。此外,了解Terraform的状态管理和如何管理多环境配置也是十分重要的。