Terraform簡(jiǎn)介

簡(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)行就地格式化臭家。

概念和命令的理解可以參考下圖:

image

操作生命周期

image

資源編排的動(dòng)作的生命周期如上,其中左側(cè)為T(mén)erraform系統(tǒng)系統(tǒng)的能力方淤,右側(cè)provider钉赁、provisioner為廠商提供。

當(dāng)執(zhí)行terraform apply命令時(shí):

  1. terraform喚醒進(jìn)程携茂,初始化backend(默認(rèn)為local-file)你踩;
  2. 解析用戶(hù)定義的模板文件,并獲取最新的資源狀態(tài)讳苦,進(jìn)行對(duì)比带膜;
  3. 構(gòu)建DAG,將所有編排動(dòng)作依次發(fā)送給provider鸳谜;
  4. provider調(diào)用云API管理云資源
  5. 將返回的結(jié)果寫(xiě)回state
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膝藕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咐扭,更是在濱河造成了極大的恐慌芭挽,老刑警劉巖滑废,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袜爪,居然都是意外死亡蠕趁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)辛馆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妻导,“玉大人,你說(shuō)我怎么就攤上這事怀各【缶拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵瓢对,是天一觀的道長(zhǎng)寿酌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硕蛹,這世上最難降的妖魔是什么醇疼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮法焰,結(jié)果婚禮上秧荆,老公的妹妹穿的比我還像新娘。我一直安慰自己埃仪,他們只是感情好乙濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著卵蛉,像睡著了一般颁股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傻丝,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天甘有,我揣著相機(jī)與錄音,去河邊找鬼葡缰。 笑死亏掀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泛释。 我是一名探鬼主播滤愕,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胁澳!你這毒婦竟也來(lái)了该互?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤韭畸,失蹤者是張志新(化名)和其女友劉穎宇智,沒(méi)想到半個(gè)月后蔓搞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡随橘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年喂分,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片机蔗。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒲祈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萝嘁,到底是詐尸還是另有隱情梆掸,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布牙言,位于F島的核電站酸钦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咱枉。R本人自食惡果不足惜卑硫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚕断。 院中可真熱鬧欢伏,春花似錦、人聲如沸亿乳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)风皿。三九已至河爹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桐款,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工夷恍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魔眨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓酿雪,卻偏偏與公主長(zhǎng)得像遏暴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子指黎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容