iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

Terraform 繁體中文系列 第 14

Day14-【入門教程】Terraform 模組, 建立模組

  • 分享至 

  • xImage
  •  

原簡體中文教程連結: Introduction.《Terraform入門教程》


1.5.1. Terraform 模組

到目前為止我們介紹了一些程式碼書寫的知識,但我們創建的所有資源和資料來源的程式碼都是我們在程式碼檔案中編寫出來的。我們有沒有辦法不透過複製貼上程式碼而直接使用別人寫的 Terraform 程式碼來創建一組資源呢?

Terraform 對此給的答案就是模組( Module )。簡單來講模組就是包含一組 Terraform 程式碼的資料夾,我們之前篇章中寫的程式碼其實也是在模組中。要真正理解模組的功能,我們需要去體驗模組的使用。

Terraform 模組是編寫高品質 Terraform 程式碼,提升程式碼多用性的重要手段,可以說,一個成熟的生產環境應該是由數個可信成熟的模組組裝而成的。我們將在本章介紹關於模組的知識。


1.5.1.1. 建立模組

實際上所有包含 Terraform 程式碼檔案的資料夾都是一個 Terraform 模組。我們如果直接在一個資料夾內執行 terraform applyterraform plan 命令,那麼目前所在的資料夾就被稱為根模組(root module)。我們也可以在執行 Terraform 指令時透過命令列參數指定根模組的路徑。

1.5.1.1.1. 模組結構

旨在被重複使用的模組與我們編寫的根模組使用的是相同的 Terraform 程式碼和程式碼風格規格。一般來講,在一個模組中,會有:

  • 一個 README 文件,用來描述模組的用途。檔案名稱可以是 README 或者 README.md,後者應採用 Markdown 語法編寫。可以考慮在 README 中用可視化的圖形來描繪創建的基礎設施資源以及它們之間的關係。 README 中不需要描述模組的輸入輸出,因為工具會自動收集相關資訊。如果在 README 中引用了外部文件或圖片,請確保使用的是帶有特定版本號的絕對 URL 路徑以防止未來指向錯誤的版本
  • 一個 LICENSE 描述模組使用的授權協議。如果你想要公開發布一個模組,最好考慮包含一個明確的許可證協議文件,許多組織不會使用沒有明確許可證協議的模組
  • 一個 examples 資料夾用來給一個呼叫樣例(可選)
  • 一個 variables.tf 文件,包含模組所有的輸入變數。輸入變數應有明確的描述說明用途
  • 一個 outputs.tf 文件,包含模組所有的輸出值。輸出值應該有明確的描述說明用途
  • 嵌入模組資料夾,出於封裝複雜性或複用程式碼的目的,我們可以在 modules 子目錄下建立一些嵌入模組。所有包含 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/
│   ├── .../

1.5.1.1.2. 避免過深的模組結構

我們剛才提到可以在 modules/ 子目錄下建立嵌入模組。Terraform 倡導"扁平"的模組結構,只應保持一層嵌入模組,防止在嵌入模組中繼續建立嵌入模組。嵌入模組應設計成易於組合的結構,使得在根模組中可以透過組合各個嵌入模組來創建複雜的基礎設施。


原簡體中文教程連結: Introduction.《Terraform入門教程》


上一篇
Day13-【入門教程】重載文件, 程式碼風格規範, Checks
下一篇
Day15-【入門教程】引用模組
系列文
Terraform 繁體中文25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言