通過前幾篇文章的介紹,相信大家對Terraform已經有了大緻的熟悉和了解,本文将從實踐開始,向大家介紹Terraform的幾個常見指令。
Terraform是一個面向用戶端的工具,是以對所有資源的管理都是通過Terraform指令來實作的。本文将主要圍繞資源的管理和狀态的管理來兩個方面來介紹涉及到的常用指令。
1 資源管理常用指令
Terraform 對資源的管理主要是對資源生命周期的管理,即通過指令實作對Terraform模闆中所定義資源的建立,修改,檢視和删除。對這部分的講解,在之前的文章《
Terraform 一分鐘部署阿裡雲ECS叢集》的
#3.3
章節有過詳細的介紹和代碼的示範,大家可移步了解。本文隻做基本的回顧。
1.1 terraform plan:資源的預覽
plan
指令用于對模闆中所定義資源的預覽,主要用于以下幾個場景:
- 預覽目前模闆中定義的資源是否符合管理預期,和Markdown的預覽功能類似
- 如果目前模闆已經存在對應的state檔案,那麼
指令将會展示模闆定義與state檔案内容的diff結果,如果有變更,将會展示結果并在下方顯示出來plan
- 對DataSource而言,執行
指令,即可直接擷取并輸出所要查詢的資源及其屬性plan
1.2 terraform apply:資源的建立和變更
apply
指令用于實際資源的建立和變更操作,為了安全起見,在指令運作過程中增加了人工互動的過程,即需要手動确認是否繼續,當然也可以通過
--auto-approve
參數來跳過人工确認的過程。
apply
指令适用于以下幾種場景:
1.3 terraform show:資源的展示
show
指令用于展示目前state中所有被管理的資源及其所有屬性值。
1.4 terraform destroy:資源的釋放
destroy
指令用于對資源的釋放操作,為了安全起見,在指令執行過程中,也增加了人工互動的過程,如果想要跳過手動确認操作,可以通過
--force
參數來跳過。
terraform destroy
預設會釋放目前模闆中定義的所有資源,如果隻想釋放其中某個特定的資源,可以通過參數
-target=<資源類型>.<資源名稱>
來指定。
1.5 terraform import:資源的導入
import
指令用于将存量的雲資源導入到terraform state中,進而加入到Terraform的管理體系中,适用的場景包含但不限于以下幾種:
- 從來沒有使用Terraform管控過任何資源,目前所有的存量雲資源都是通過控制台,阿裡雲CLI,ROS或者直接調用API建立和管理的,現在想要切換為Terraform管理
- 在不影響資源正常使用的前提下,重構資源模闆中的資源定義
- 阿裡雲的Provider進行了相容性更新,新版Provider對原有模闆中所定義的資源支援了更多的參數,需要把最新的參數同步進來
有關
import
如何實作存量資源的管理,已經在文章《
一文揭秘存量雲資源的管理難題》中有過詳細的闡述,此處不再贅述。
1.6 terraform taint: 标記資源為“被污染”
taint
指令用于把某個資源标記為“被污染”狀态,當再次執行
apply
指令時,這個被污染的資源将會被先釋放,然後再建立一個新的,相當于對這個特定資源做了先删除後建立的操作。
指令的詳細格式為:
terraform taint <資源類型>.<資源名稱>
,如:
$ terraform taint alicloud_vswitch.this
Resource instance alicloud_vswitch.this has been marked as tainted.
1.7 terraform untaint:取消“被污染”标記
untaint
指令是
taint
的逆向操作,用于取消“被污染”标記,使其恢複到正常的狀态。指令的詳細格式和
taint
類似為:
terraform untaint <資源類型>.<資源名稱>
$ terraform untaint alicloud_vswitch.this
Resource instance alicloud_vswitch.this has been successfully untainted.
1.8 terraform output:列印出參及其值
如果在模闆中顯示定義了
output
參數,那麼這個output的值将在
apply
指令之後展示,但
plan
指令并不會展示,如果想随時随地快速檢視output的值,可以直接運作指令
terraform output
:
$ terraform output
vswitchId = vsw-gw8gl31wz********
2 狀态管理常用指令
Terraform 對資源狀态的管理,實際上是對State檔案中資料的管理。State檔案儲存了目前Terraform管理的所有資源及其屬性,内容都是由Terraform自動存儲的,為了保證資料的完整性,不建議手動修改State内容。
對State資料的操作可以通過
terraform state
指令來完成。
2.1 terraform state list:列出目前state中的所有資源
state list
按照
<資源類型>.<資源名稱>
的格式列出目前state中存在的所有資源(包括datasource),如:
$ terraform state list
data.alicloud_slbs.default
alicloud_vpc.default
alicloud_vswitch.this
2.2 terraform state show:展示某一個資源的屬性
state show
指令按照Key-Value的格式展示出特定資源的所有屬性及其值,指令的完整格式為
terraform state show <資源類型>.<資源名稱>
$ terraform state show alicloud_vswitch.this
# alicloud_vswitch.this:
resource "alicloud_vswitch" "this" {
availability_zone = "eu-central-1a"
cidr_block = "172.16.0.0/24"
id = "vsw-gw8gl31wz******"
vpc_id = "vpc-gw8calnzt*******"
}
2.3 terraform state pull:擷取目前state内容并展示
state pull
指令用于原樣展示目前state檔案資料,類似與Shell下的cat指令,如:
$ terraform state pull
{
"version": 4,
"terraform_version": "0.12.8",
"serial": 615,
"lineage": "39aeeee2-b3bd-8130-c897-2cb8595cf8ec",
"outputs": {
***
}
},
"resources": [
{
"mode": "data",
"type": "alicloud_slbs",
"name": "default",
"provider": "provider.alicloud",
***
},
{
"mode": "managed",
"type": "alicloud_vpc",
"name": "default",
"provider": "provider.alicloud",
***
}
]
}
2.4 terraform state rm:移除特定的資源
state rm
指令用于将state中的某個資源移除,但是實際上并不會真正删除這個資源,指令格式為:
terraform state rm <資源類型>.<資源名稱>
terraform state rm alicloud_vswitch.this
Removed alicloud_vswitch.this
Successfully removed 1 resource instance(s).
移除後,如果模闆内容不變并且再次執行
apply
指令,将會新增一個同樣的資源。移除後的資源可以再次通過
import
指令再次加入,針對這部分的介紹,同樣可以移步文章《
》詳細了解。
2.5 terraform state mv:變更特定資源的存放位址
如果想調整某個資源所在的state檔案,可以通過
state mv
指令來完成,類似于Shell下的mv指令,這個指令的使用有多種選項,可以通過指令
terraform state mv --help
來詳細了解。本文隻介紹最常用的一種:
terraform state mv --state=./terraform.tfstate --state-out=<target path>/terraform-target.tfstate <資源類型>.<資源名稱A> <資源類型>.<資源名稱B>
$ terraform state mv -state-out=../tf.tfstate alicloud_vswitch.this alicloud_vswitch.default
Move "alicloud_vswitch.this" to "alicloud_vswitch.default"
Successfully moved 1 object(s).
如上指令省略了預設的
--state=./terraform.tfstate
選項,指令最終的結果是将目前State中的VSwitch 資源移動到了上層目錄下名為
tf.tfstate
的State中,并且将VSwitch的資源名稱由"this"改為了"default"。
2.6 terraform refresh:重新整理目前state
refresh
指令可以用來重新整理目前State的内容,即再次調用API并拉取最新的資料寫入到state檔案中。
3 其他常用指令
除了資源和state的管理指令外,還有一些常用的應用在模闆,provider等多種場景下的指令。
3.1 terraform init:初始化加載子產品
init
用來初始化加載所需的子產品,包括Provider,Provisioner,Module等。
3.2 terraform graph:輸出目前模闆定義的資源關系圖
每個模闆定義的資源之間都存在不同程度的關系,如果想看資源關系大圖,可以使用指令
terraform graph
$ terraform graph
digraph {
compound = "true"
newrank = "true"
subgraph "root" {
"[root] alicloud_vpc.default" [label = "alicloud_vpc.default", shape = "box"]
"[root] alicloud_vswitch.this" [label = "alicloud_vswitch.this", shape = "box"]
******
"[root] output.vswitchId" -> "[root] alicloud_vswitch.this"
"[root] provider.alicloud (close)" -> "[root] alicloud_vswitch.this"
******
"[root] root" -> "[root] provider.alicloud (close)"
}
}
該指令的結果還可以通過指令
terraform graph | dot -Tsvg > graph.svg
直接導出為一張圖檔(需要提前安裝graphviz:
brew install graphviz
):

3.3 terraform validate:驗證模闆文法是否正确
Terraform 模闆的編寫需要遵循其自身定義的一套簡單的文法規範,編寫完成後,如果想要檢查模闆是否存在文法錯誤或者在運作
plan
和
apply
指令的時候報文法錯誤,可以通過執行指令
terraform validate
來檢查和定位錯誤出現的詳細位置和原因。
4 寫在最後
本文主要介紹了一些在使用Terraform過程經常會遇到的一些指令,這些指令覆寫了子產品下載下傳,模闆的檢查,資源的管理,資源狀态的管理等幾個方面。看得出這些指令使用起來并不複雜,不同指令的組合使用可以滿足不同複雜的使用場景。本文隻介紹了所有指令中的一部分,更多指令可以直接運作
terraform
或者
terraform --help
詳細檢視。
Terraform是面向用戶端的工具,并且主要以指令驅動,是以對Terraform的學習最好的方法便是勤動手,多嘗試,熟能生巧。