Terraform常用命令
Terraform是一個管理IT資源的客戶端工具,您可以使用Terraform提供的命令來實現(xiàn)對所有資源的管理。本文將主要圍繞資源管理和狀態(tài)管理兩個方面為您介紹涉及到的常用命令。
資源管理常用命令
Terraform對資源的管理主要是對資源生命周期的管理,即通過命令實現(xiàn)對Terraform模板中所定義資源的創(chuàng)建,修改,查看和刪除。
terraform plan:資源的預(yù)覽
plan命令用于對模板中所定義資源的預(yù)覽,主要用于以下幾個場景:
預(yù)覽當(dāng)前模板中定義的資源是否符合管理預(yù)期,和Markdown的預(yù)覽功能類似。
如果當(dāng)前模板已經(jīng)存在對應(yīng)的state文件,那么plan命令將會展示模板定義與state文件內(nèi)容的diff結(jié)果,如果有變更,會將結(jié)果在下方顯示出來。
對DataSource而言,執(zhí)行plan命令,即可直接獲取并輸出所要查詢的資源及其屬性。
terraform apply:資源的新建和變更
apply命令用于實際資源的新建和變更操作,為了安全起見,在命令運行過程中增加了人工交互的過程,即需要手動確認(rèn)是否繼續(xù),當(dāng)然也可以通過--auto-approve參數(shù)來跳過人工確認(rèn)的過程。
apply命令適用于以下幾種場景:
創(chuàng)建新的資源。
通過修改模板參數(shù)來修改資源的屬性。
如果從當(dāng)前模板中刪除某個資源的定義,apply命令會將該資源徹底刪除。可以理解為“資源的移除也是一種變更”。
terraform show:資源的展示
show命令用于展示當(dāng)前state中所有被管理的資源及其所有屬性值。
terraform destroy:資源的釋放
destroy命令用于對資源的釋放操作,為了安全起見,在命令執(zhí)行過程中,也增加了人工交互的過程,如果想要跳過手動確認(rèn)操作,可以通過--force參數(shù)來跳過。
terraform destroy默認(rèn)會釋放當(dāng)前模板中定義的所有資源,如果只想釋放其中某個特定的資源,可以通過參數(shù)
-target=<資源類型>.<資源名稱>
來指定。terraform import:資源的導(dǎo)入
import命令用于將存量的云資源導(dǎo)入到terraform state中,進(jìn)而加入到Terraform的管理體系中,適用的場景包含但不限于以下幾種:
從來沒有使用Terraform管控過任何資源,當(dāng)前所有的存量云資源都是通過控制臺,阿里云CLI,ROS或者直接調(diào)用API創(chuàng)建和管理的,現(xiàn)在想要切換為Terraform管理。
在不影響資源正常使用的前提下,重構(gòu)資源模板中的資源定義。
阿里云的Provider進(jìn)行了兼容性升級,新版Provider對原有模板中所定義的資源支持了更多的參數(shù),需要把最新的參數(shù)同步進(jìn)來。
說明有關(guān)import如何實現(xiàn)存量資源的管理,請參見如何解決存量云資源的管理難題。
terraform taint:標(biāo)記資源為被污染
taint命令用于把某個資源標(biāo)記為被污染狀態(tài),當(dāng)再次執(zhí)行apply命令時,這個被污染的資源將會被先釋放,然后再創(chuàng)建一個新的,相當(dāng)于對這個特定資源做了先刪除后新建的操作。
命令的詳細(xì)格式為:
terraform taint <資源類型>.<資源名稱>
,如:$ terraform taint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been marked as tainted.
terraform untaint:取消被污染標(biāo)記
untaint命令是taint的逆向操作,用于取消被污染標(biāo)記,使其恢復(fù)到正常的狀態(tài)。命令的詳細(xì)格式和taint類似為:
terraform untaint <資源類型>.<資源名稱>
,如:$ terraform untaint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been successfully untainted.
terraform output:打印出參及其值
如果在模板中顯示定義了output參數(shù),那么這個output的值將在apply命令之后展示,但plan命令并不會展示,如果想隨時隨地快速查看output的值,可以直接運行命令 terraform output :
$ terraform output vswitchId = vsw-gw8gl31wz********
狀態(tài)管理常用命令
Terraform對資源狀態(tài)的管理,實際上是對State文件中數(shù)據(jù)的管理。State文件保存了當(dāng)前Terraform管理的所有資源及其屬性,內(nèi)容都是由Terraform自動存儲的,為了保證數(shù)據(jù)的完整性,不建議手動修改State內(nèi)容。對State數(shù)據(jù)的操作可以通過terraform state命令來完成。
terraform state list:列出當(dāng)前state中的所有資源
state list命令會按照
<資源類型>.<資源名稱>
的格式列出當(dāng)前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:獲取當(dāng)前state內(nèi)容并展示
state pull命令用于原樣展示當(dāng)前state文件數(shù)據(jù),類似于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).
移除后,如果模板內(nèi)容不變并且再次執(zhí)行apply命令,將會新增一個同樣的資源。移除后的資源可以再次通過import命令再次加入。
terraform state mv:變更特定資源的存放地址
如果想調(diào)整某個資源所在的state文件,可以通過state mv命令來完成,類似于Shell下的mv命令,這個命令的使用有多種選項,可以通過命令 terraform state mv --help 來詳細(xì)了解。本文只介紹最常用的一種:
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)
如上命令省略了默認(rèn)的
--state=./terraform.tfstate
選項,命令最終的結(jié)果是將當(dāng)前State中的vSwitch資源移動到了上層目錄下名為tf.tfstate
的State中,并且將vSwitch的資源名稱由“this”改為了“default”。terraform refresh:刷新當(dāng)前state
refresh命令可以用來刷新當(dāng)前State的內(nèi)容,即再次調(diào)用API并拉取最新的數(shù)據(jù)寫入到state文件中。
其他常用命令
除了資源和狀態(tài)的管理命令外,還有一些常用的應(yīng)用在模板,Provider等多種場景下的命令。
terraform init:初始化加載模塊
init用來初始化加載所需的模塊,包括Provider,Provisioner,Module等。
terraform graph:輸出當(dāng)前模板定義的資源關(guān)系圖
每個模板定義的資源之間都存在不同程度的關(guān)系,如果想看資源關(guān)系圖,可以使用命令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)" } }
該命令的結(jié)果還可以通過命令
terraform graph | dot -Tsvg > graph.svg
直接導(dǎo)出為一張圖片(需要提前安裝graphviz:brew install graphviz
):terraform validate:驗證模板語法是否正確
Terraform模板的編寫需要遵循其自身定義的一套簡單的語法規(guī)范,編寫完成后,如果想要檢查模板是否存在語法錯誤或者在運行plan和apply命令的時候報語法錯誤,可以通過執(zhí)行命令terraform validate來檢查和定位錯誤出現(xiàn)的詳細(xì)位置和原因。