Module 讓 Terraform 使用更簡單

2021-09-13 10:34:37 字數 1980 閱讀 9109

眾所周知,terraform 是乙個開源的自動化的資源編排工具,支援多家雲服務提供商。阿里雲作為第三大雲服務提供商,terraform-alicloud-provider 已經支援了超過 90 多個 resource 和 data source,覆蓋20多個服務和產品,吸引了越來越多的開發者加入到阿里雲terraform生態的建設中。

隨著 resource 和 datasource 的不斷增加和完善,業務架構的不斷發展,terraform 模板編寫的成本和複雜度也在不斷的增加。如何讓terraform 模板更加簡單和重用,就是本文所要解決的問題。

如圖所示,這個架構中,包含 ecs 例項,slb 例項,rds 例項,oss 等資源和服務,同時所有的 ecs,rds 和部分 slb 在乙個 vpc 網路環境中。

面對這樣的乙個架構,模板可以有多種寫法。通常的寫法是將架構中涉及到的所有資源寫到乙個模板中,並通過引數和關係型 resource 將這些資源關聯起來,如下所示:

這樣寫的好處是,所有資源都在乙個模板中管理,編寫時可以很清楚了解資源之間的引用關係;但是,當資源不斷增加時,擴充套件非常不靈活,資源間關係越複雜,模板越難以維護。

從架構圖和上文模板中不難看出,並不是所有的resource都有直接關聯關係,比如vpc只和vswitch和securitygroup有關,與其他資源的建立無直接關聯關係。因此,為了使整個架構的邏輯可以更加清楚的展示在模板中,我們可以考慮,對資源進行分類,將每一類資源用乙個單獨的目錄進行管理,最後用乙個模板來管理所有的目錄,進而完成對所有資源及資源關係的串聯,如下所示:

將該架構中的資源分為網路(vpc),負載均衡(slb),計算(ecs),資料庫(rds)和儲存(oss)這幾類,然後將上文模板中的資源分別在對應的目錄中予以實現。

接下來,用統一的模版main.tf將這些目錄關聯起來,如下所示:

可以看出,main.tf中資源的結構更加清楚,更加接近於架構圖。

同時,大家已經注意到了,main.tf引入了乙個 module,通過module將資源目錄串聯起來。

module 是 terraform 為了管理單元化資源而設計的,是子節點,子資源,子架構模板的整合和抽象。正如本文架構中提到的,在實際複雜的技術架構中,涉及到的資源多種多樣,資源與資源之間的關係錯綜複雜,資源模版的編寫,擴充套件,維護等多個問題的成本都會不斷增加。將多種可以復用的資源定義為乙個module,通過對 module 的管理簡化模板的架構,降低模板管理的複雜度,這就是module的作用。

除此之外,對開發者和使用者而言,只需關心 module 的 input 引數即可,無需關心module中資源的定義,引數,語法等細節問題,抽出更多的時間和精力投入到架構設計和資源關係整合上。

上文中,雖然已經實現了module,但是這個module只能在自己本地機器上實現,無法實現與他人的實時分享,無法實現團隊內部的及時共享。

terraform 提供了 module 的註冊位址,將自己的module上傳到github,並註冊為乙個terraform module後,即可將遠端的module應用到我們自己的模板中。

利用開源 module,我們可對上文中的模板進行完善:

module 讓資源模板架構更清楚,模板管理更簡單;開源 module 讓資源模板更便捷,更分享。除此之外,開源 module 可實現對模板的版本控制,基於不同的版本,實現不同架構不斷公升級的控制和完善。

閱讀原文

反射 Module類詳解

配合官方註解來看,效果更好 模組資訊是通過module類訪問的。下面通過乙個類子,講解下module類的使用,如果你是乙個用心的程式設計師,應該了解下module的詳細資訊。還是繼續使用c 反射 一 的類子。下面我們寫乙個新的檔案moduledemo.cs。內容如下 編譯命令 csc r sport...

驅動與執行module

驅動與執行module 一 驅動是什麼?驅動提供的是機制而非策略。二 可載入模組 ko 每個模組由目標 組成 沒有連線成乙個完整可執行檔案 可以動態連線到執行中的核心中,通過 insmod 程式,以及通過 rmmod 程式去連線。三 建立模組 在建立模組中,呼叫的函式必須是核心自帶函式。module...

JBoss 引用 module 說明

假設 jboss eap 的安裝目錄為 則 jboss預設提供的 module的儲存存路徑為 modules,以下稱之為 eap 6.1 中的 module 如下截圖 在說 module 的引用之前,先說一下如何自定義乙個 module。自定義的module定義好了之後,如何使用呢?下面以 war包...