原簡體中文教程連結: Introduction.《Terraform入門教程》
到目前為止我們介紹了一些程式碼書寫的知識,但我們創建的所有資源和資料來源的程式碼都是我們在程式碼檔案中編寫出來的。我們有沒有辦法不透過複製貼上程式碼而直接使用別人寫的 Terraform 程式碼來創建一組資源呢?
Terraform 對此給的答案就是模組( Module )。簡單來講模組就是包含一組 Terraform 程式碼的資料夾,我們之前篇章中寫的程式碼其實也是在模組中。要真正理解模組的功能,我們需要去體驗模組的使用。
Terraform 模組是編寫高品質 Terraform 程式碼,提升程式碼多用性的重要手段,可以說,一個成熟的生產環境應該是由數個可信成熟的模組組裝而成的。我們將在本章介紹關於模組的知識。
實際上所有包含 Terraform 程式碼檔案的資料夾都是一個 Terraform 模組。我們如果直接在一個資料夾內執行 terraform apply
或 terraform plan
命令,那麼目前所在的資料夾就被稱為根模組(root module)。我們也可以在執行 Terraform 指令時透過命令列參數指定根模組的路徑。
旨在被重複使用的模組與我們編寫的根模組使用的是相同的 Terraform 程式碼和程式碼風格規格。一般來講,在一個模組中,會有:
README
文件,用來描述模組的用途。檔案名稱可以是 README
或者 README.md
,後者應採用 Markdown 語法編寫。可以考慮在 README
中用可視化的圖形來描繪創建的基礎設施資源以及它們之間的關係。 README
中不需要描述模組的輸入輸出,因為工具會自動收集相關資訊。如果在 README
中引用了外部文件或圖片,請確保使用的是帶有特定版本號的絕對 URL 路徑以防止未來指向錯誤的版本LICENSE
描述模組使用的授權協議。如果你想要公開發布一個模組,最好考慮包含一個明確的許可證協議文件,許多組織不會使用沒有明確許可證協議的模組variables.tf
文件,包含模組所有的輸入變數。輸入變數應有明確的描述說明用途outputs.tf
文件,包含模組所有的輸出值。輸出值應該有明確的描述說明用途README
文件的嵌入模組都可以被外部用戶使用;不含 README
文件的模組被認為是僅在當前模組內使用的(可選)main.tf
,它是模組主要的入口點。對於一個簡單的模組來說,可以把所有資源都定義在裡面;如果是一個比較複雜的模組,我們可以把創建的資源分佈到不同的程式碼檔案中,但引用嵌入模組的程式碼還是要保留在 main.tf
裡如果模組含有多個嵌入模組,那麼應避免它們彼此之間的引用,由根模組負責組合它們。
由於 examples/
中的程式碼經常會被拷貝到其他項目中進行修改,所有在 examples/
程式碼中引用本模組時使用的引用路徑應使用外部呼叫者可以使用的路徑,而非相對路徑。
一個最小化模組推薦的結構是這樣的:
$ tree minimal-module/
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
一個更完整一些的模組結構可以是這樣的:
$ tree complete-module/
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
├── ...
├── modules/
│ ├── nestedA/
│ │ ├── README.md
│ │ ├── variables.tf
│ │ ├── main.tf
│ │ ├── outputs.tf
│ ├── nestedB/
│ ├── .../
├── examples/
│ ├── exampleA/
│ │ ├── main.tf
│ ├── exampleB/
│ ├── .../
我們剛才提到可以在 modules/
子目錄下建立嵌入模組。Terraform 倡導"扁平"的模組結構,只應保持一層嵌入模組,防止在嵌入模組中繼續建立嵌入模組。嵌入模組應設計成易於組合的結構,使得在根模組中可以透過組合各個嵌入模組來創建複雜的基礎設施。
原簡體中文教程連結: Introduction.《Terraform入門教程》