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的狀態管理和如何管理多環境配置也是十分重要的。