簡(jiǎn)介
Terraform的定義
- Terraform是一個(gè)可以安全、高效地建立蔓腐、變更灌砖、以及版本化管理基礎(chǔ)設(shè)施的工具望侈,可以在主流的服務(wù)提供商上提供自定義的解決方案印蔬;
- 以配置文件為驅(qū)動(dòng),在文件中定義所需要管理的組件(基礎(chǔ)設(shè)施)脱衙,以此生成一個(gè)可執(zhí)行的計(jì)劃侥猬,通過(guò)執(zhí)行這個(gè)計(jì)劃來(lái)完成所定義組件的創(chuàng)建、增量式的變更和持續(xù)的管理捐韩。
- Terraform不僅可以管理Iaas的資源退唠,也可以管理更上層的服務(wù),如DNS解析荤胁,SaaS應(yīng)用等瞧预。
Terraform的特點(diǎn)
- 基礎(chǔ)設(shè)施即代碼:Terraform基于一種特定的配置語(yǔ)言HCL(Hashicorp Configuration Language)來(lái)描述基礎(chǔ)設(shè)施資源。可以像對(duì)待任何其他代碼一樣垢油,實(shí)現(xiàn)對(duì)所描述的解決方案盆驹,或者基礎(chǔ)架構(gòu)的版本控制和管理召娜。同時(shí)檀咙,通用的解決方案和基礎(chǔ)架構(gòu)可以以模板的形式進(jìn)行便捷的共享和復(fù)用。
- 執(zhí)行計(jì)劃:Terraform在執(zhí)行前棕诵,可以通過(guò)terraform plan命令先解析模板生成一個(gè)可執(zhí)行的計(jì)劃,這個(gè)計(jì)劃展示了當(dāng)前模板需要?jiǎng)?chuàng)建、變更的資源和屬性妹孙。操作人可以預(yù)覽這個(gè)計(jì)劃,在確認(rèn)無(wú)誤后在執(zhí)行apply命令,完成所定義資源的創(chuàng)建和變更。
- 資源拓?fù)洌嚎梢愿鶕?jù)模板中的定義葱跋,構(gòu)建所需資源的圖形,以并行的方式創(chuàng)建和修改沒(méi)有任何依賴(lài)資源的資源模庐,以保證執(zhí)行的高效性慎冤。有依賴(lài)的動(dòng)作醉者,被依賴(lài)的資源會(huì)優(yōu)先執(zhí)行撬即。
- 自動(dòng)化變更:不管多么復(fù)雜的資源,當(dāng)模板創(chuàng)建完成才沧,通過(guò)apply一個(gè)命令温圆,即可完成數(shù)個(gè)變更操作膝蜈,避免人為操作帶來(lái)的錯(cuò)誤推沸。
關(guān)鍵概念
Configuration:基礎(chǔ)設(shè)施的定義和描述
基礎(chǔ)設(shè)施即代碼券坞,其中的代碼Code就是對(duì)基礎(chǔ)設(shè)施資源的代碼定義和描述,通過(guò)代碼表達(dá)需要管理的資源肺素。
所有資源的代碼描述都是定義在一個(gè)以.tf結(jié)尾的文件恨锚,用于terraform的加載和解析。這個(gè)文件就稱(chēng)之為“Terraform模板”或者“configuration”
Provider: 基礎(chǔ)設(shè)施管理組件
Terraform常用于公有云上基礎(chǔ)設(shè)施的管理倍靡,如虛擬機(jī)猴伶、網(wǎng)絡(luò)、容器等塌西。Provider就是與OpenAPI交互的后端驅(qū)動(dòng)他挎,Terraform通過(guò)Provider完成對(duì)基礎(chǔ)設(shè)施資源的管理。
每個(gè)基礎(chǔ)設(shè)施提供商雨让,aliyun雇盖、aws等都需要提供一個(gè)provider來(lái)實(shí)現(xiàn)對(duì)自家資源的統(tǒng)一管理忿等。目前我們使用的阿里云對(duì)應(yīng)的provider就是alicloud栖忠。
在運(yùn)行環(huán)境中,Terraform和Provider是兩個(gè)獨(dú)立存在的package贸街,執(zhí)行Terraform時(shí)庵寞,會(huì)根據(jù)用戶(hù)模板中指定的Provider或者resource/datasource的標(biāo)志自動(dòng)下載模板使用的provider,并放在當(dāng)前目錄下的.terraform隱藏目錄下薛匪。
Resource:基礎(chǔ)設(shè)施資源和服務(wù)的管理
在Terraform中捐川,一個(gè)具體的資源或者服務(wù)稱(chēng)為resource,比如一個(gè)ECS逸尖,一個(gè)SLB古沥、一個(gè)域名解析記錄。每個(gè)特定的resource包含了若干可用于描述對(duì)應(yīng)資源或服務(wù)的屬性字段娇跟。通過(guò)這些字段來(lái)定義一個(gè)完整的資源或者服務(wù)岩齿,比如dns的domain_name、ttl等苞俘。
如下定義一個(gè)resource:
|
resource "alicloud_alidns_record" "dns701438486351555584" {
domain_name = "test.com"
line = "default"
priority = 0
rr = "mobile.api"
status = "ENABLE"
ttl = 600
type = "A"
value = "1.1.1.4"
}
|
- 其中alicloud_alidns_record為資源類(lèi)型盹沈,定義這個(gè)資源的類(lèi)型,告訴terraform這個(gè)resource是域名解析記錄吃谣。
- dns701438486351555584為資源名稱(chēng)乞封,資源名稱(chēng)在同一個(gè)模板中必須唯一,可以用于其他資源引用該資源岗憋。
- 大括號(hào)里面的block為配置參數(shù)肃晚,定義資源的屬性。
Data Source:基礎(chǔ)設(shè)施資源和服務(wù)的查詢(xún)
Data Source提供查詢(xún)資源的功能仔戈,每個(gè)data source實(shí)現(xiàn)對(duì)一個(gè)資源的動(dòng)態(tài)查詢(xún)关串,其結(jié)果可以認(rèn)為是動(dòng)態(tài)變量惋鸥,只有運(yùn)行時(shí)才知道其值。
|
data "alicloud_alidns_records" "records_ds_uni" {
domain_name = "test.com"
type = "A"
line = "unicom"
rr_regex = "mobile*.api"
output_file = "records-uni.txt"
}
|
如上定義一個(gè)records_ds_uni的資源悍缠,其通過(guò)data引用卦绣,查詢(xún)test.com域名下,解析記錄匹配mobile*.api的飞蚓,解析線(xiàn)路為unicom的所有A記錄滤港,并輸出到records-uni.txt文本中。
state:保存資源關(guān)系以及屬性文件的數(shù)據(jù)庫(kù)
Terraform創(chuàng)建和管理所有資源都保存在自己的數(shù)據(jù)庫(kù)上趴拧,這個(gè)數(shù)據(jù)庫(kù)是一個(gè)名為terraform.tfstate文件溅漾,在terraform中稱(chēng)之為state,默認(rèn)存放在執(zhí)行命令的本地目錄中著榴。
在執(zhí)行terraform命令時(shí)添履,terraform會(huì)利用state文件與模板文件進(jìn)行diff對(duì)比,如果出現(xiàn)不一致脑又,terraform將按照模板中的定義重新創(chuàng)建暮胧,或者修改資源,直到?jīng)]有diff问麸。所以這個(gè)文件非常重要往衷,如果損壞,terraform將認(rèn)為已創(chuàng)建的資源被破壞严卖,或者需要重建席舍。當(dāng)然實(shí)際的云資源不會(huì)收到影響。
Backend:存儲(chǔ)state文件的載體
因terraform創(chuàng)建資源后哮笆,會(huì)將資源屬性保存在state文件中来颤,而這個(gè)文件可以放本地,也可以存放在遠(yuǎn)端稠肘,實(shí)現(xiàn)state和模板代碼的分離福铅,這個(gè)存放state文件的載體就是backend。
Backend分為本地和remote兩類(lèi)启具,默認(rèn)為本地本讥。目前已支持多達(dá)13中遠(yuǎn)端存儲(chǔ)方案,如console鲁冯、etcd拷沸、oss等,可以降低多人協(xié)作對(duì)state維護(hù)的成本薯演,也可以保障數(shù)據(jù)的安全性撞芍。
Provisioner:在機(jī)器上執(zhí)行操作的組件
用來(lái)在本地機(jī)器或者登錄遠(yuǎn)程主機(jī)執(zhí)行相關(guān)的操作,如local-exec在本地執(zhí)行命令跨扮,chef用來(lái)在遠(yuǎn)程主機(jī)安裝序无、配置验毡、執(zhí)行chef client,remote-exec用來(lái)登錄遠(yuǎn)程主機(jī)執(zhí)行命令帝嗡。
通常與provider搭配實(shí)現(xiàn)晶通,provider創(chuàng)建資源后,使用provisioner在創(chuàng)建的資源上執(zhí)行各種操作哟玷。
常用命令
- terraform init: 初始化狮辽,加載所需模塊
- terraform plan: 資源預(yù)覽
用于對(duì)模板定義的資源進(jìn)行預(yù)覽。如預(yù)覽當(dāng)前模板中定義的資源是否符合預(yù)期巢寡,如果存在state文件則展示diff結(jié)果喉脖,即變更的內(nèi)容。
- terraform apply:新建抑月、變更資源
- terraform show:資源展示树叽,展示當(dāng)前state中所管理的資源以及所有屬性
- terraform destroy: 資源釋放
- terraform import: 資源導(dǎo)入,將存量的云資源導(dǎo)入到state中谦絮,進(jìn)而加入到terraform的管理體系中题诵。適用一下場(chǎng)景
- 從來(lái)沒(méi)使用terraform管理過(guò)資源,現(xiàn)在需要切換到terraform管理挨稿;
- 在不影響資源使用的前提下仇轻,重構(gòu)資源模板中的定義;
- Provider有升級(jí)支持了更多的參數(shù)奶甘,需要把新參數(shù)同步過(guò)來(lái)。
- terraform fmt: 格式化模板文件祭椰。將編寫(xiě)的tf文件進(jìn)行就地格式化臭家。
概念和命令的理解可以參考下圖:
操作生命周期
資源編排的動(dòng)作的生命周期如上,其中左側(cè)為T(mén)erraform系統(tǒng)系統(tǒng)的能力方淤,右側(cè)provider钉赁、provisioner為廠商提供。
當(dāng)執(zhí)行terraform apply命令時(shí):
- terraform喚醒進(jìn)程携茂,初始化backend(默認(rèn)為local-file)你踩;
- 解析用戶(hù)定義的模板文件,并獲取最新的資源狀態(tài)讳苦,進(jìn)行對(duì)比带膜;
- 構(gòu)建DAG,將所有編排動(dòng)作依次發(fā)送給provider鸳谜;
- provider調(diào)用云API管理云資源
- 將返回的結(jié)果寫(xiě)回state