Terraform是一個管理IT資源的用戶端工具,您可以使用Terraform提供的命令來實現對所有資源的管理。本文將主要圍繞資源管理和狀態管理兩個方面為您介紹涉及到的常用命令。
資源管理常用命令
Terraform對資源的管理主要是對資源生命週期的管理,即通過命令實現對Terraform模板中所定義資源的建立,修改,查看和刪除。
terraform plan:資源的預覽
plan命令用於對模板中所定義資源的預覽,主要用於以下幾個情境:
預覽當前模板中定義的資源是否符合管理預期,和Markdown的預覽功能類似。
如果當前模板已經存在對應的state檔案,那麼plan命令將會展示模板定義與state檔案內容的diff結果,如果有變更,會將結果在下方顯示出來。
對DataSource而言,執行plan命令,即可直接擷取並輸出所要查詢的資源及其屬性。
terraform apply:資源的建立和變更
apply命令用於實際資源的建立和變更操作,為了安全起見,在命令運行過程中增加了人工互動的過程,即需要手動確認是否繼續,當然也可以通過--auto-approve參數來跳過人工確認的過程。
apply命令適用於以下幾種情境:
建立新的資源。
通過修改模板參數來修改資源的屬性。
如果從當前模板中刪除某個資源的定義,apply命令會將該資源徹底刪除。可以理解為“資源的移除也是一種變更”。
terraform show:資源的展示
show命令用於展示當前state中所有被管理的資源及其所有屬性值。
terraform destroy:資源的釋放
destroy命令用於對資源的釋放操作,為了安全起見,在命令執行過程中,也增加了人工互動的過程,如果想要跳過手動確認操作,可以通過--force參數來跳過。
terraform destroy預設會釋放當前模板中定義的所有資源,如果只想釋放其中某個特定的資源,可以通過參數
-target=<資源類型>.<資源名稱>
來指定。terraform import:資源的匯入
import命令用於將存量的雲資源匯入到terraform state中,進而加入到Terraform的管理體系中,適用的情境包含但不限於以下幾種:
從來沒有使用Terraform管控過任何資源,當前所有的存量雲資源都是通過控制台,阿里雲CLI,ROS或者直接調用API建立和管理的,現在想要切換為Terraform管理。
在不影響資源正常使用的前提下,重構資源模板中的資源定義。
阿里雲的Provider進行了相容性升級,新版Provider對原有模板中所定義的資源支援了更多的參數,需要把最新的參數同步進來。
說明有關import如何?存量資源的管理,請參見如何解決存量雲資源的管理難題。
terraform taint:標記資源為被汙染
taint命令用於把某個資源標記為被汙染狀態,當再次執行apply命令時,這個被汙染的資源將會被先釋放,然後再建立一個新的,相當於對這個特定資源做了先刪除後建立的操作。
命令的詳細格式為:
terraform taint <資源類型>.<資源名稱>
,如:$ terraform taint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been marked as tainted.
terraform untaint:取消被汙染標記
untaint命令是taint的逆向操作,用於取消被汙染標記,使其恢複到正常的狀態。命令的詳細格式和taint類似為:
terraform untaint <資源類型>.<資源名稱>
,如:$ terraform untaint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been successfully untainted.
terraform output:列印出參及其值
如果在模板中顯示定義了output參數,那麼這個output的值將在apply命令之後展示,但plan命令並不會展示,如果想隨時隨地快速查看output的值,可以直接運行命令 terraform output :
$ terraform output vswitchId = vsw-gw8gl31wz********
狀態管理常用命令
Terraform對資源狀態的管理,實際上是對State檔案中資料的管理。State檔案儲存了當前Terraform管理的所有資源及其屬性,內容都是由Terraform自動儲存的,為了保證資料的完整性,不建議手動修改State內容。對State資料的操作可以通過terraform state命令來完成。
terraform state list:列出當前state中的所有資源
state list命令會按照
<資源類型>.<資源名稱>
的格式列出當前state中存在的所有資源(包括datasource),例如:$ terraform state list data.alicloud_slbs.default alicloud_vpc.default alicloud_vswitch.this
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*******" }
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", *** } ] }
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命令再次加入。
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”。terraform refresh:重新整理當前state
refresh命令可以用來重新整理當前State的內容,即再次調用API並拉取最新的資料寫入到state檔案中。
其他常用命令
除了資源和狀態的管理命令外,還有一些常用的應用在模板,Provider等多種情境下的命令。
terraform init:初始化載入模組
init用來初始化載入所需的模組,包括Provider,Provisioner,Module等。
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
):terraform validate:驗證模板文法是否正確
Terraform模板的編寫需要遵循其自身定義的一套簡單的文法規範,編寫完成後,如果想要檢查模板是否存在語法錯誤或者在運行plan和apply命令的時候報語法錯誤,可以通過執行命令terraform validate來檢查和定位錯誤出現的詳細位置和原因。