Terraform 新手村指南,萌新必讀!

基礎(chǔ)設(shè)施即代碼(IaC)是指使用代碼和軟件開發(fā)技術(shù)來配置和管理基礎(chǔ)設(shè)施的實(shí)踐。IaC 背后的邏輯是盡量消除手動配置基礎(chǔ)設(shè)施和資源的需求,比如服務(wù)器、負(fù)載均衡以及數(shù)據(jù)庫等。由于基礎(chǔ)設(shè)施是整個軟件開發(fā)流程的一個組成部分,并且與應(yīng)用交付更緊密地聯(lián)系在一起,因此讓基礎(chǔ)設(shè)施的更改更容易交付十分重要。
?
使用代碼來定義和管理基礎(chǔ)設(shè)施及其配置,可以讓開發(fā)者采用版本控制、測試和自動化部署等技術(shù),這有助于避免各種應(yīng)用問題產(chǎn)生,比如性能瓶頸、功能故障等。
?
Terraform 是一個被廣泛使用的開源 IaC 工具,用戶可以以聲明式的方式來管理基礎(chǔ)設(shè)施。借助 Terraform, 用戶可以使用簡單的配置語言管理多個不同云廠商的云資源,比如 AWS、Azure、GCP等。
?
本文將會介紹 Terraform 的基礎(chǔ),包括架構(gòu)、工作原理、工作流程及最佳實(shí)踐等方面的內(nèi)容。
?
Terraform 架構(gòu)
Terraform 是一款基于插件的工具,因此其有一個核心應(yīng)用 Terraform,和上百個插件。核心應(yīng)用提供了一個統(tǒng)一的層來管理 IaC 代碼,并且它還會負(fù)責(zé)安裝所需的插件,調(diào)用它們、管理狀態(tài)等。另一方面,插件可以與基礎(chǔ)設(shè)施平臺和應(yīng)用通信,如AWS、GCP、Grafana、Jenkins、GitLab等。其中一些插件由 Hashicorp 團(tuán)隊(duì)維護(hù),另外的那些則是由第三方維護(hù)。每個人都可以編寫并發(fā)布自己的插件,訪問下方網(wǎng)站可以獲取插件庫:
https://registry.terraform.io/
?

?Terraform 插件由兩大主要類型:Provider 和 Provisioner。Provider 是通過 API 負(fù)責(zé)與實(shí)際基礎(chǔ)設(shè)施或應(yīng)用進(jìn)行連接,并創(chuàng)建、修改和刪除對象和資源。Provisioner 是負(fù)責(zé)連接已經(jīng)配置好的基礎(chǔ)設(shè)施并對其進(jìn)行更改。例如,你可以使用 AWS Provider 來配置一個 EC2 實(shí)例,并在配置完成后遠(yuǎn)程執(zhí)行 Provisioner 來在實(shí)例上執(zhí)行某些命令行。(需要注意的是,Provisioner 通常不是最佳實(shí)踐)
?
Terraform 核心概念
本節(jié)介紹一些 Terraform 中使用的核心概念/術(shù)語:
Variables:也被稱為 input-variables(輸入變量),它是 Terraform 模塊使用的鍵值對,可以自定義。
Provider:一種插件類型,與 API 服務(wù)進(jìn)行交互并訪問相關(guān)資源。
Module:它是一個包含 Terraform 模板的文件夾,所有的配置都可以在這里定義。
State:它由 Terraform 管理的基礎(chǔ)設(shè)施和相關(guān)配置的緩存信息組成。
Resources:它指一個或多個基礎(chǔ)設(shè)施對象(計(jì)算實(shí)例、虛擬網(wǎng)絡(luò)等)的塊(block),這些對象用于配置和管理基礎(chǔ)設(shè)施。
Data Source:它是由 provider 實(shí)現(xiàn)的,以返回外部對象的信息到 Terraform。
Output Values:這是 Terraform 模塊的返回值,可以被其他配置使用。
Plan:這是指其中一個階段,在這一階段中會決定需要創(chuàng)建、更新或銷毀什么,以便從基礎(chǔ)設(shè)施的 real/current 狀態(tài)轉(zhuǎn)移到期望狀態(tài)。
Apply:這一階段會應(yīng)用基礎(chǔ)設(shè)施的更改 real/current 狀態(tài),以推動到期望狀態(tài)。
?
Terraform 生命周期
Terraform 的生命周期由init、plan、apply和 destroy,4個階段構(gòu)成。
Terraform init 初始化工作目錄,其中包括所有的配置文件。
Terraform plan 被用來創(chuàng)建執(zhí)行計(jì)劃以達(dá)到基礎(chǔ)設(shè)施的期望狀態(tài)。為了達(dá)到預(yù)期狀態(tài),會對配置文件進(jìn)行更改。
Terraform apply 會對在 plan 階段中定義的基礎(chǔ)設(shè)施進(jìn)行更改,從而使基礎(chǔ)設(shè)施達(dá)到期望狀態(tài)。
Terraform destroy 這一階段用于刪除所有的舊基礎(chǔ)設(shè)施資源,這些資源在apply 階段后被標(biāo)記為污損(taint)。
?
Terraform 的工作原理
Terraform 可以讓用戶通過配置文件定義和管理整個基礎(chǔ)設(shè)施和版本控制。這主要由 Terraform 架構(gòu)中的兩個主要組件來實(shí)現(xiàn)這一目標(biāo):Core 和 Provider。
?
Terraform Core 如何工作
要完成工作,Terraform core 需要使用2個輸入源。第一個源將用戶配置輸入到 Terraform,并定義需要創(chuàng)建或配置什么資源。第二個輸入源包括向Terraform提供的關(guān)于當(dāng)前基礎(chǔ)設(shè)施設(shè)置情況的數(shù)據(jù)。
?
Terraform 會獲取這些輸入信息并決定下一步應(yīng)該如何進(jìn)行。它采用用戶指定的期望狀態(tài),并將其與當(dāng)前狀態(tài)進(jìn)行對比,進(jìn)而對架構(gòu)進(jìn)行配置以消除兩種狀態(tài)之間的差距。Terraform core 本質(zhì)上是要計(jì)算出需要創(chuàng)建、更新或刪除的內(nèi)容,以便全面配置基礎(chǔ)設(shè)施。
?
Terraform Provider 如何工作
第二個讓 Terraform 運(yùn)行的關(guān)鍵組件是 provider。常見的是云廠商,如 AWS 或 Azure,但其他基礎(chǔ)設(shè)施或平臺服務(wù)工具也可以。例如,Kubernetes 也是 Terraform 用的一個 provider。
?
Terraform 有上百個不同技術(shù)的 Provider 可供用戶訪問。例如,如果你正在使用 AWS,Terraform 可以訪問 EC2 實(shí)例和在這一技術(shù)棧內(nèi)的其他資源。接著,用戶可以在不同層級上創(chuàng)建基礎(chǔ)設(shè)施,比如在 Azure 上構(gòu)建 Kubernetes。
?
這就是 Terraform 的工作原理:使用 Core 和 Provider 功能來快速完成應(yīng)用程序和基礎(chǔ)設(shè)施的設(shè)置,并且僅僅使用代碼即可。
?
Terraform 工作流程
Terraform 的工作流程由以下3個步驟組成:
?
Step 1:寫
在 Terraform 工作流程的第一步中,用戶需要使用 Haschicorp Configuration Language (HCL)來將基礎(chǔ)設(shè)施資源聲明為代碼。
?
Step 2:審核
接下來,Terraform 會展示其計(jì)劃,它會根據(jù)用戶設(shè)置的期望狀態(tài)和現(xiàn)有資源的當(dāng)前狀態(tài)進(jìn)行比較,來增加或移除資源。
?
Step 3:應(yīng)用
最終,接受計(jì)劃的更改,來增加或刪除任何基礎(chǔ)設(shè)施資源。然后基礎(chǔ)設(shè)施將在 Terraform 的幫助下進(jìn)行全面部署。
?
Terraform 最佳實(shí)踐
使用版本控制來管理 Terraform 配置
在存儲后端遠(yuǎn)程保存你的 Terraform 狀態(tài)
使用變量來確保你的配置更靈活和可復(fù)用
使用模塊來整理你的配置并將其共享給他人
使用 terraform plan 命令來在應(yīng)用之前預(yù)覽更改
?
總結(jié)
Terraform 是 IaC 領(lǐng)域備受開發(fā)者青睞的開源工具,本文介紹了 Terraform 的基礎(chǔ),包括其工作流程、工作原理、核心概念以及架構(gòu)解釋,希望可以幫助你初步了解這個強(qiáng)大的工具。除了 Terraform 本身擁有強(qiáng)大的功能之外,還有非常完善的配套文檔和教程,幫助開發(fā)者快速上手使用。
?
教程地址:
https://developer.hashicorp.com/terraform/tutorials