經過前幾篇文章的介紹,相信你們對Terraform已經有了大體的熟悉和了解,本文將從實踐開始,向你們介紹Terraform的幾個常見命令。安全
Terraform是一個面向客戶端的工具,因此對全部資源的管理都是經過Terraform命令來實現的。本文將主要圍繞資源的管理和狀態的管理來兩個方面來介紹涉及到的經常使用命令。app
Terraform 對資源的管理主要是對資源生命週期的管理,即經過命令實現對Terraform模板中所定義資源的建立,修改,查看和刪除。對這部分的講解,在以前的文章《Terraform 一分鐘部署阿里雲ECS集羣》的 #3.3
章節有過詳細的介紹和代碼的演示,你們可移步瞭解。本文只作基本的回顧。ide
plan
命令用於對模板中所定義資源的預覽,主要用於如下幾個場景:svg
plan
命令將會展現模板定義與state文件內容的diff結果,若是有變動,將會展現結果並在下方顯示出來plan
命令,便可直接獲取並輸出所要查詢的資源及其屬性apply
命令用於實際資源的新建和變動操做,爲了安全起見,在命令運行過程當中增長了人工交互的過程,即須要手動確認是否繼續,固然也能夠經過 --auto-approve
參數來跳過人工確認的過程。
apply
命令適用於如下幾種場景:工具
apply
命令會將該資源完全刪除。能夠理解爲「資源的移除也是一種變動」show
命令用於展現當前state中全部被管理的資源及其全部屬性值。學習
destroy
命令用於對資源的釋放操做,爲了安全起見,在命令執行過程當中,也增長了人工交互的過程,若是想要跳過手動確認操做,能夠經過 --force
參數來跳過。
terraform destroy
默認會釋放當前模板中定義的全部資源,若是隻想釋放其中某個特定的資源,能夠經過參數 -target=<資源類型>.<資源名稱>
來指定。this
import
命令用於將存量的雲資源導入到terraform state中,進而加入到Terraform的管理體系中,適用的場景包含但不限於如下幾種:阿里雲
有關 import
如何實現存量資源的管理,已經在文章《一文揭祕存量雲資源的管理難題》中有過詳細的闡述,此處再也不贅述。spa
taint
命令用於把某個資源標記爲「被污染」狀態,當再次執行 apply
命令時,這個被污染的資源將會被先釋放,而後再建立一個新的,至關於對這個特定資源作了先刪除後新建的操做。
命令的詳細格式爲: terraform taint <資源類型>.<資源名稱>
,如:code
$ terraform taint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been marked as tainted.
untaint
命令是 taint
的逆向操做,用於取消「被污染」標記,使其恢復到正常的狀態。命令的詳細格式和 taint
相似爲: terraform untaint <資源類型>.<資源名稱>
,如:
$ terraform untaint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been successfully untainted.
若是在模板中顯示定義了 output
參數,那麼這個output的值將在 apply
命令以後展現,但 plan
命令並不會展現,若是想隨時隨地快速查看output的值,能夠直接運行命令 terraform output
:
$ terraform output vswitchId = vsw-gw8gl31wz********
Terraform 對資源狀態的管理,其實是對State文件中數據的管理。State文件保存了當前Terraform管理的全部資源及其屬性,內容都是由Terraform自動存儲的,爲了保證數據的完整性,不建議手動修改State內容。
對State數據的操做能夠經過 terraform state
命令來完成。
state list
按照 <資源類型>.<資源名稱>
的格式列出當前state中存在的全部資源(包括datasource),如:
$ terraform state list data.alicloud_slbs.default alicloud_vpc.default alicloud_vswitch.this
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*******" }
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", *** } ] }
state rm
命令用於將state中的某個資源移除,可是實際上並不會真正刪除這個資源,命令格式爲: terraform state rm <資源類型>.<資源名稱>
,如:
terraform state rm alicloud_vswitch.this Removed alicloud_vswitch.this Successfully removed 1 resource instance(s).
移除後,若是模板內容不變而且再次執行 apply
命令,將會新增一個一樣的資源。移除後的資源能夠再次經過 import
命令再次加入,針對這部分的介紹,一樣能夠移步文章《一文揭祕存量雲資源的管理難題》詳細瞭解。
若是想調整某個資源所在的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"。
refresh
命令能夠用來刷新當前State的內容,即再次調用API並拉取最新的數據寫入到state文件中。
除了資源和state的管理命令外,還有一些經常使用的應用在模板,provider等多種場景下的命令。
init
用來初始化加載所需的模塊,包括Provider,Provisioner,Module等。
每一個模板定義的資源之間都存在不一樣程度的關係,若是想看資源關係大圖,可使用命令 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
):
Terraform 模板的編寫須要遵循其自身定義的一套簡單的語法規範,編寫完成後,若是想要檢查模板是否存在語法錯誤或者在運行 plan
和 apply
命令的時候報語法錯誤,能夠經過執行命令 terraform validate
來檢查和定位錯誤出現的詳細位置和緣由。
本文主要介紹了一些在使用Terraform過程常常會遇到的一些命令,這些命令覆蓋了模塊下載,模板的檢查,資源的管理,資源狀態的管理等幾個方面。看得出這些命令使用起來並不複雜,不一樣命令的組合使用能夠知足不一樣複雜的使用場景。本文只介紹了全部命令中的一部分,更多命令能夠直接運行 terraform
或者 terraform --help
詳細查看。
Terraform是面向客戶端的工具,而且主要以命令驅動,所以對Terraform的學習最好的方法即是勤動手,多嘗試,熟能生巧。
本文爲雲棲社區原創內容,未經容許不得轉載。