系列文章
前言
最近在使用 Terraform 來置備 OCI 的 Always Free Tier, 發現它非常好用。總結學習下:Terraform 的基礎知識。
什麼是 Terraform?
Terraform 是一種基礎架構即程式碼(IaC)工具,可讓您安全高效地構建、更改雲和本地資源並對其進行版本控制。
HashiCorp Terraform 是一種基礎架構即程式碼工具,可讓您在人類可讀的配置檔案中定義雲和本地資源,您可以對這些檔案進行版本控制、重用和共享。然後,您可以使用一致的工作流程在其整個生命週期內配置和管理所有基礎設施。Terraform 可以管理計算、儲存和網路資源等低階元件,以及 DNS 條目和 SaaS 功能等高階元件。
Terraform 的主要特點
-
基礎設施即程式碼(IaC):基礎設施使用高階配置語法進行描述。這允許對資料中心的藍圖進行版本控制,並像對待任何其他程式碼一樣對待它。此外,基礎設施可以共享和重複使用。
-
執行計劃(Plan):Terraform 有一個“計劃”步驟,它可以生成執行計劃。執行計劃顯示了 Terraform 在您呼叫 apply 時將執行的操作。這可以讓您在 Terraform 操作基礎設施時避免任何意外。
-
資源圖(Resource Map):Terraform 構建所有資源的圖,並並行化任何非依賴資源的建立和修改。正因為如此,Terraform 儘可能高效地構建基礎設施,並且運營商可以深入瞭解其基礎設施中的依賴關係。
-
變更自動化:複雜的變更集可以以最少的人工互動應用於您的基礎架構。有了前面提到的執行計劃和資源圖,您就可以確切地知道 Terraform 將更改什麼以及更改的順序,從而避免許多可能的人為錯誤。
Terraform 的功能
這裡簡單羅列一下,由於筆者水平所限,可能有遺漏,請幫忙補充:
- IaC
- 工作空間(WorkSpace): Workspace 允許相同的配置程式碼有一個以上的狀態 (State) 檔案。這意味著部署到多個環境時,不需要將配置程式碼複製貼上到不同的資料夾。每個工作空間可以使用自己的變數定義檔案來引數化環境。
- 變數(Variable): 即使用者提供的值,它們能夠引數化 Terraform 模組 (modules), 而不必修改原始碼。
- 執行(Run)-計劃和應用(Plan & Apply)
- 資源圖
- 供應商(Provider): Provider 是上游 API 的邏輯抽象。他們負責瞭解 API 互動和公開資源。如:AWS/Azure/GCP/Kubernetes/Aliyun/OCI Providers
- 模組(Modules): 模組是 Terraform 配置的獨立包,允許把相關資源組合到一起,建立出可複用的元件。要使用模組,你並不需要知道模組的工作方式,只需要知道如何設定輸入和輸出即可。對於提升軟體抽象度和程式碼複用,模組是很有用的工具。類似於積木塊或 Python 的 library.
- 登錄檔(Registry): 發現為所有 Terraform 資源型別提供支援的 Terraform 提供程式,或查詢用於快速部署通用基礎結構配置的模組。類似於 Docker Registry 或 Python PypI.
- 宣告式程式設計: 表達計算邏輯(做什麼), 但不描述控制流(怎麼做). 其關注的是結果,而不是過程。
- 雲無關: 能夠使用一組相同的工具和工作流,無縫執行在任意雲平臺上。Terraform 是雲無關的,使用它能把基礎設施部署到 AWS 與部署到 GCP、Azure 甚至私有云一樣簡單。不會被特定雲供應商(如 AWS CloudFormation)所繫結,也不需要在每次改變雲供應商時學習一種全新的技術。
- 表達能力強且高度可擴充套件:透過使用條件語句、for 表示式、指令、模版檔案、動態塊、變數和許多內建函式,我們可以輕鬆地編寫程式碼來實現自己的目的。Terraform 提供以下特性:
- 115+ 個函式
- 支援條件語句
- 支援 for 迴圈
- 支援多種型別:字串、數字、列表、對映、布林值、物件、複雜型別
- 支援外掛
- 模組化
- 等待條件
- 模板(Template)
- 動態塊
- 協同工作:利用 Terraform 的後端(Backend)、登錄檔、工作空間以及程式碼倉庫可以做到與朋友、同事協同工作。
- 生命週期管理:Create、Read、Update、Delete(or Destory)以及可以自定義生命週期的
create_before_destory
prevent_destory
ignore_changes
標誌。 - 測試: 可以透過
go test
配合 fixture 測試 Terraform 程式碼。 - HCL: 人機友好的結構化配置語言,用於命令列工具。儘管旨在普遍使用,但它主要針對 devops 工具、伺服器等。HCL 是專門為構建結構化配置格式而設計的語法和 API。試圖在通用序列化格式(如 JSON)和圍繞完整程式語言(如 Ruby)構建的配置格式之間取得折衷。
- 安全和金鑰管理: 透過和 HashiCorp(Terraform 母公司) Vault 的無縫整合實現對安全和金鑰的管理。
Terraform 和競品的比較
基於以上 Terraform 的主要功能和特點,我們將 Terraform 和 它的競品 做一個初步比較:
> ?免責宣告
>
> 以下僅為筆者個人觀點,由於眼界和知識所限,並不一定準確。僅供參考。
- 相比 Ansible/Chef/Puppet/SaltStack 等配置管理工具. 配置管理工具主要用途是在已經存在的機器上安裝和管理軟體。Terraform 不是配置管理工具,它的主要作用是置備資源。Terraform 專注於資料中心和相關服務的更高階別的抽象。另外,Ansible/Chef/Puppet/SaltStack 等主要是命令式的,Terraform 是宣告式的。但是它們都有豐富的擴充套件和生態。
- 相比 AWS CloudFormation/GCP Deployment Manager/Azure Resource Manager. Terraform 更好,它雲無關,並且支援多個提供商和服務的組合和組合。另外 Terraform 還透過使用執行計劃的概念將計劃階段與執行階段分開,以確保它完全符合預期。
- 相比 Pulumi. Pulumi 和 Terraform 最為類似,唯一的區別在於 Pulumi 不是宣告式的。孰弱孰強各有優勢。
- 相比 CrossPlane, Terraform 在面向使用者/開發人員側的抽象能力比 CrossPlane 弱一些,另外在保障配置不漂移這方面也相比 CrossPlane 弱一些。但是 Terraform 的生態(供應商和模組)要比 CrossPlane 強的多得多。
總結
本文討論了什麼是 Terraform, 它的優勢、特點、使用場景, 相對於其他 IaC 工具有哪些優缺點。
本篇基本上都是一些概念性的東西,還沒有進入實戰環節,敬請期待後續更新。
EOF