玩轉阿里雲 Terraform(四):Terraform 經常使用命令詳解

經過前幾篇文章的介紹,相信你們對Terraform已經有了大體的熟悉和了解,本文將從實踐開始,向你們介紹Terraform的幾個常見命令。安全

Terraform是一個面向客戶端的工具,因此對全部資源的管理都是經過Terraform命令來實現的。本文將主要圍繞資源的管理和狀態的管理來兩個方面來介紹涉及到的經常使用命令。app

 

1 資源管理經常使用命令

Terraform 對資源的管理主要是對資源生命週期的管理,即經過命令實現對Terraform模板中所定義資源的建立,修改,查看和刪除。對這部分的講解,在以前的文章《Terraform 一分鐘部署阿里雲ECS集羣》的 #3.3 章節有過詳細的介紹和代碼的演示,你們可移步瞭解。本文只作基本的回顧。ide

1.1 terraform plan:資源的預覽

plan 命令用於對模板中所定義資源的預覽,主要用於如下幾個場景:svg

  • 預覽當前模板中定義的資源是否符合管理預期,和Markdown的預覽功能相似
  • 若是當前模板已經存在對應的state文件,那麼 plan 命令將會展現模板定義與state文件內容的diff結果,若是有變動,將會展現結果並在下方顯示出來
  • 對DataSource而言,執行 plan 命令,便可直接獲取並輸出所要查詢的資源及其屬性

1.2 terraform apply:資源的新建和變動

apply 命令用於實際資源的新建和變動操做,爲了安全起見,在命令運行過程當中增長了人工交互的過程,即須要手動確認是否繼續,固然也能夠經過 --auto-approve 參數來跳過人工確認的過程。
apply 命令適用於如下幾種場景:工具

  • 建立新的資源
  • 經過修改模板參數來修改資源的屬性
  • 若是從當前模板中刪除某個資源的定義, apply 命令會將該資源完全刪除。能夠理解爲「資源的移除也是一種變動」

1.3 terraform show:資源的展現

show 命令用於展現當前state中全部被管理的資源及其全部屬性值。學習

1.4 terraform destroy:資源的釋放

destroy 命令用於對資源的釋放操做,爲了安全起見,在命令執行過程當中,也增長了人工交互的過程,若是想要跳過手動確認操做,能夠經過 --force 參數來跳過。
terraform destroy 默認會釋放當前模板中定義的全部資源,若是隻想釋放其中某個特定的資源,能夠經過參數 -target=<資源類型>.<資源名稱>  來指定。this

1.5 terraform import:資源的導入

import 命令用於將存量的雲資源導入到terraform state中,進而加入到Terraform的管理體系中,適用的場景包含但不限於如下幾種:阿里雲

  • 歷來沒有使用Terraform管控過任何資源,當前全部的存量雲資源都是經過控制檯,阿里雲CLI,ROS或者直接調用API建立和管理的,如今想要切換爲Terraform管理
  • 在不影響資源正常使用的前提下,重構資源模板中的資源定義
  • 阿里雲的Provider進行了兼容性升級,新版Provider對原有模板中所定義的資源支持了更多的參數,須要把最新的參數同步進來

有關 import 如何實現存量資源的管理,已經在文章《一文揭祕存量雲資源的管理難題》中有過詳細的闡述,此處再也不贅述。spa

1.6 terraform taint: 標記資源爲「被污染」

taint 命令用於把某個資源標記爲「被污染」狀態,當再次執行 apply 命令時,這個被污染的資源將會被先釋放,而後再建立一個新的,至關於對這個特定資源作了先刪除後新建的操做。
命令的詳細格式爲: terraform taint <資源類型>.<資源名稱> ,如:code

$ 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 ):
_2019_11_14_9_52_35

 

3.3 terraform validate:驗證模板語法是否正確

Terraform 模板的編寫須要遵循其自身定義的一套簡單的語法規範,編寫完成後,若是想要檢查模板是否存在語法錯誤或者在運行 plan 和 apply 命令的時候報語法錯誤,能夠經過執行命令 terraform validate 來檢查和定位錯誤出現的詳細位置和緣由。

4 寫在最後

本文主要介紹了一些在使用Terraform過程常常會遇到的一些命令,這些命令覆蓋了模塊下載,模板的檢查,資源的管理,資源狀態的管理等幾個方面。看得出這些命令使用起來並不複雜,不一樣命令的組合使用能夠知足不一樣複雜的使用場景。本文只介紹了全部命令中的一部分,更多命令能夠直接運行 terraform 或者 terraform --help 詳細查看。
Terraform是面向客戶端的工具,而且主要以命令驅動,所以對Terraform的學習最好的方法即是勤動手,多嘗試,熟能生巧。

 

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索