Terraform 工作流程包括模板編寫、初始化、預覽、執行四部分。本文主要介紹模板編寫,即 Terraform 配置和 Hashicorp 配置語言(Hashicorp Configuration Language,HCL)。
Terraform 目錄
我們從編寫階段開始,在這裡您會在 .tf 檔案中編寫 Terraform 代碼。 在編寫代碼之前,首先建立一個 Terraform 配置的目錄。Terraform 配置是一個完整的 Terraform 語言文檔,它告訴Terraform 如何管理給定的基礎設施集合。Terraform 配置儲存在 .tf 副檔名的檔案中。 一個 Terraform 配置目錄可以由多個檔案和目錄組成。一個Terraform配置包括:一個根模組和可選的多個子模組樹。
根模組
根模組也被稱為根設定檔,是運行 Terraform 命令的工作目錄。在該目錄中,Terraform 將尋找所有 .tf 檔案,並使用它們來建立執行計畫。您可以在單個根設定檔中編寫所有的資源和其他代碼結構(如入參變數,出參定義,供應商等),但最佳實務是按照邏輯將資源拆分到不同的設定檔中。
子模組
子模組是可選的,每個子模組可以是出於對某類複用功能的抽象,也可以是出於對根模組複雜邏輯的簡化。根模組通過對子模組的引用來降低根模組的編寫複雜度,提升複用性和可讀性。
//根模組
-- main.tf
--providers.tf
-- variables.tf
-- outputs.tf
//子模組
-- -- -- servers/
-- -- -- --main.tf
-- -- -- --variables.tf
-- -- -- --outputs.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 Type> "<Block Label>" "‹Block Label>" (
# Block Body
<Identifier> = <Value/Expression> # Argument
}resource "alicloud_vpc" "myvpc" {
vpc_name = "the-first-vpc"
cidr_block = "172.16.0.0/12"
}塊(Block)
塊是一系列屬於某種類型的程式碼,比如資源(resource)、變數(variable)、輸出(output)、模組(module)等。塊可以是簡單的類型,也可以是嵌套另一種塊類型的複雜類型。
參數(Argument)
參數是塊的一部分,用於給名稱分配值。塊包含必填的參數和可選的參數。
標識符(Identifier) 標識符是參數、塊類型或任何 Terraform 特定結構的名稱。標識符可以包括字母、底線、連字號和數字,但不能以數字開頭。
運算式(Expression)
可以用來在代碼塊中給標識符分配一個值。這些運算式可以是簡單類型的值,如字串,數字等,也可以是複雜類型的值,如對象,數組,Map 等。
注釋
注釋以
#開始和結束,用於單行注釋。除此之外,//也用於單行注釋,/*和*/用於多行注釋。
值得注意的是,HCL 本質上是聲明式的,意味著模板中定義的塊代表了基礎設施的最終狀態。因此,塊或檔案的順序並不重要。
HCL的設計目的是使基礎設施編碼既易於人類閱讀,也便於機器處理。通過使用 HCL,Terraform 允許您以高度抽象的方式聲明性地定義雲資源,而無需關心資源建立和管理的具體步驟。這種方法既簡化了雲基礎設施的管理,又使開發人員更專註於應用邏輯和服務的構建。
在實際應用中,良好的 Terraform 配置應該遵循一定的最佳實務,如適當地組織檔案、使用模組化方法來複用代碼、以及通過參數化使配置更加靈活。此外,瞭解Terraform的狀態管理和如何管理多環境配置也是十分重要的。