Terraform 是什么?
Terraform 是一種安全有效地構建、更改和版本控制基礎設施的工具(基礎架構自動化的編排工具)。它的目標是 "Write, Plan, and create Infrastructure as Code", 基礎架構即代碼。Terraform 幾乎可以支持所有市面上能見到的雲服務。具體的說就是可以用代碼來管理維護 IT 資源,把之前需要手動操作的一部分任務通過程序來自動化的完成,這樣的做的結果非常明顯:高效、不易出錯。
Terraform 提供了對資源和提供者的靈活抽象。該模型允許表示從物理硬件、虛擬機和容器到電子郵件和 DNS 提供者的所有內容。由於這種靈活性,Terraform 可以用來解決許多不同的問題。這意味着有許多現有的工具與Terraform 的功能重疊。但是需要注意的是,Terraform 與其他系統並不相互排斥。它可以用於管理小到單個應用程序或達到整個數據中心的不同對象。
Terraform 使用配置文件描述管理的組件(小到單個應用程序,達到整個數據中心)。Terraform 生成一個執行計划,描述它將做什么來達到所需的狀態,然后執行它來構建所描述的基礎結構。隨着配置的變化,Terraform 能夠確定發生了什么變化,並創建可應用的增量執行計划。
Terraform 是用 Go 語言開發的開源項目,你可以在 github 上訪問到它的源代碼。
Terraform 核心功能
- 基礎架構即代碼(Infrastructure as Code)
- 執行計划(Execution Plans)
- 資源圖(Resource Graph)
- 自動化變更(Change Automation)
基礎架構即代碼(Infrastructure as Code)
使用高級配置語法來描述基礎架構,這樣就可以對數據中心的藍圖進行版本控制,就像對待其他代碼一樣對待它。
執行計划(Execution Plans)
Terraform 有一個 plan 步驟,它生成一個執行計划。執行計划顯示了當執行 apply 命令時 Terraform 將做什么。通過 plan 進行提前檢查,可以使 Terraform 操作真正的基礎結構時避免意外。
資源圖(Resource Graph)
Terraform 構建的所有資源的圖表,它能夠並行地創建和修改任何沒有相互依賴的資源。因此,Terraform 可以高效地構建基礎設施,操作人員也可以通過圖表深入地解其基礎設施中的依賴關系。
自動化變更(Change Automation)
把復雜的變更集應用到基礎設施中,而無需人工交互。通過前面提到的執行計划和資源圖,我們可以確切地知道 Terraform 將會改變什么,以什么順序改變,從而避免許多可能的人為錯誤。
下載安裝
https://www.terraform.io/downloads.html
unzip terraform_0.13.5_linux_amd64.zip
mv terraform /usr/local/bin/
terraform -version # 查看Terraform版本和Provider的接口版本信息
Terraform是通過一個非常容易使用的命令行界面(CLI)來控制的,並且有且僅有一個命令行程序:terraform
進行管理。輸入terraform
,可以看到當前版本可用的子命令列表,如apply
,plan
等。同時,terraform
也響應-h
和help
,輸入terraform -h
或terraform help
也可以查看所有可用命令。
初始化provider,使用Terraform配置語法生成 .tf 資源文件,使用CLI實現資源管理;Terraform會將整個資源部署情況更新在 *.tf.state
文件中,讓用戶在前端控制台和后端平台都清晰的把控自己的雲資源
vi k8smain.tf
provider "kubernetes" {}
terraform init
ls -al
# 執行 terraform init 初始化Terraform。此步驟,Terraform會自動檢測 .tf 文件中的 provider 字段,發送請求到Terraform官方GitHub下載最新版本相關資源的模塊和插件,初始化成功時當前腳本的版本信息也會顯示出來。
# 有新的版本發布時,可以通過 terraform init -upgrade 指令更新腳本,獲取最新的應用。
# 同時,可以通過 terraform plan 預覽將要完成的操作,准備好創建資源后,可以通過 terraform apply 進行資源部署。
Terraform 關鍵概念
Configuration:基礎設施的定義和描述
“基礎設施即代碼(Infrastructure as Code)”,這里的Code就是對基礎設施資源的代碼定義和描述,也就是通過代碼表達我們想要管理的資源。
# VPC 資源
resource "alicloud_vpc" "vpc" {
name = "tf_vpc"
cidr_block = "172.16.0.0/16"
}
# VSwitch 資源
resource "alicloud_vswitch" "vswitch" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.16.1.0/24"
availability_zone = "cn-beijing-a"
}
對所有資源的代碼描述都需要定義在一個以 tf
結尾的文件用於Terraform加載和解析,這個文件我們稱之為“Terraform模板”或者“Configuration”。
Provider:基礎設施管理組件
Terraform 通常用於對雲上基礎設施,如虛擬機,網絡資源,容器資源,存儲資源等的創建,更新,查看,刪除等管理動作,也可以實現對物理機的管理,如安裝軟件,部署應用等。
【Provider】 是一個與Open API直接交互的后端驅動,Terraform 就是通過Provider來完成對基礎設施資源的管理的。不同的基礎設施提供商都需要提供一個Provider來實現對自家基礎設施的統一管理。目前Terraform目前支持超過160多種的providers,大多數雲平台的Provider插件均已經實現了,阿里雲對應的Provider為 alicloud
。
在操作環境中,Terraform和Provider是兩個獨立存在的package,當運行Terraform時,Terraform會根據用戶模板中指定的provider或者resource/datasource的標志自動的下載模板所用到的所有provider,並將其放在執行目錄下的一個隱藏目錄 .terraform
下。
provider "alicloud" {
version = ">=1.56.0"
region = "cn-hangzhou"
configuration_source = "terraform-alicloud-modules/classic-load-balance"
}
模板中顯示指定了一個阿里雲的Provider,並顯示設置了provider的版本為 1.56.0+
(默認下載最新的版本),指定了需要管理資源的region,指定了當前這個模板的標識。
通常Provider都包含兩個主要元素 resource 和 data source。
Resource:基礎設施資源和服務的管理
在Terraform中,一個具體的資源或者服務稱之為一個resource,比如一台ECS 實例,一個VPC網絡,一個SLB實例。每個特定的resource包含了若干可用於描述對應資源或者服務的屬性字段,通過這些字段來定義一個完整的資源或者服務,比如實例的名稱(name),實例的規格(instance_type),VPC或者VSwitch的網段(cidr_block)等。
定義一個Resource的語法非常簡單,通過 resource
關鍵字聲明,如下:
# 定義一個ECS實例
resource "alicloud_instance" "default" {
image_id = "ubuntu_16_04_64_20G_alibase_20190620.vhd"
instance_type = "ecs.sn1ne.large"
instance_name = "my-first-vm"
system_disk_category = "cloud_ssd"
...
}
- 其中
alicloud_instance
為資源類型(Resource Type),定義這個資源的類型,告訴Terraform這個Resource是阿里雲的ECS實例還是阿里雲的VPC。 default
為資源名稱(Resource Name),資源名稱在同一個模塊中必須唯一,主要用於供其他資源引用該資源。- 大括號里面的block塊為配置參數(Configuration Arguments),定義資源的屬性,比如ECS 實例的規格、鏡像、名稱等。
顯然這個Terraform模板的功能為在阿里雲上創建一個ECS實例,鏡像ID為 ubuntu_16_04_64_20G_alibase_20190620.vhd
,規格為 ecs.sn1ne.large
,自定義了實例名稱和系統盤的類型。
除此之外,在Terraform中,一個資源與另一個資源的關系也定義為一個資源,如一塊雲盤與一台ECS實例的掛載,一個彈性IP(EIP)與一台ECS或者SLB實例的綁定關系。這樣定義的好處是,一方面資源架構非常清晰,另一方面,當模板中有若干個EIP需要與若干台ECS實例綁定時,只需要通過Terraform的 count
功能就可以在無需編寫大量重復代碼的前提下實現綁定功能。
resource "alicloud_instance" "default" {
count = 5
...
}
resource "alicloud_eip" "default" {
count = 5
...
}
resource "alicloud_eip_association" "default" {
count = 5
instance_id = alicloud_instance.default[count.index].id
allocation_id = alicloud_eip.default[count.index].id
}
顯然這個Terraform模板的功能為在阿里雲上創建5個ECS實例和5個彈性IP,並將它們一一綁定。
Data Source:基礎設施資源和服務的查詢
對資源的查詢是運維人員或者系統最常使用的操作,比如,查看某個region下有哪些可用區,某個可用區下有哪些實例規格,每個region下有哪些鏡像,當前賬號下有多少機器等,通過對資源及其資源屬性的查詢可以幫助和引導開發者進行下一步的操作。
除此之外,在編寫Terraform模板時,Resource使用的參數有些是固定的靜態變量,但有些情況下可能參數變量不確定或者參數可能隨時變化。比如我們創建ECS 實例時,通常需要指定我們自己的鏡像ID和實例規格,但我們的模板可能隨時更新,如果在代碼中指定ImageID和Instance,則一旦我們更新鏡像模板就需要重新修改代碼。
在Terraform 中,Data Source 提供的就是一個查詢資源的功能,每個data source實現對一個資源的動態查詢,Data Souce的結果可以認為是動態變量,只有在運行時才能知道變量的值。
Data Sources通過 data
關鍵字聲明,如下:
// Images data source for image_id
data "alicloud_images" "default" {
most_recent = true
owners = "system"
name_regex = "^ubuntu_18.*_64"
}
data "alicloud_zones" "default" {
available_resource_creation = "VSwitch"
enable_details = true
}
// Instance_types data source for instance_type
data "alicloud_instance_types" "default" {
availability_zone = data.alicloud_zones.default.zones.0.id
cpu_core_count = 2
memory_size = 4
}
resource "alicloud_instance" "web" {
image_id = data.alicloud_images.default.images[0].id
instance_type = data.alicloud_instance_types.default.instance_types[0].id
instance_name = "my-first-vm"
system_disk_category = "cloud_ssd"
...
}
如上例子中的ECS Instance 沒有指定鏡像ImageID和實例規格,而是通過 data
引用,Terraform運行時將首先根據鏡像名稱前綴選擇系統鏡像,如果同時有多個鏡像滿足條件,則選擇最新的鏡像。實例規格也是類似,在某個可用區下選擇2核4G的實例規格進行返回。
State:保存資源關系及其屬性文件的數據庫
Terraform創建和管理的所有資源都會保存到自己的數據庫上,這個數據庫不是通常意義上的數據庫(MySQL,Redis等),而是一個文件名為 terraform.tfstate
的文件,在Terraform 中稱之為 state
,默認存放在執行Terraform命令的本地目錄下。這個 state
文件非常重要,如果該文件損壞,Terraform 將認為已創建的資源被破壞或者需要重建(實際的雲資源通常不會受到影響),因為在執行Terraform命令是,Terraform將會利用該文件與當前目錄下的模板做Diff比較,如果出現不一致,Terraform將按照模板中的定義重新創建或者修改已有資源,直到沒有Diff,因此可以認為Terraform是一個有狀態服務。
當涉及多人協作時不僅需要拷貝模板,還需要拷貝 state
文件,這無形中增加了維護成本。幸運的是,目前Terraform支持把 state
文件放到遠端的存儲服務 OSS
上或者 consul
上,來實現 state
文件和模板代碼的分離。具體細節可參考官方文檔Remote State或者關注后續文章的詳細介紹。
Backend:存放 State 文件的載體
正如上節提到,Terraform 在創建完資源后,會將資源的屬性存放在一個 state
文件中,這個文件可以存放在本地也可以存放在遠端。存放 state
文件的載體就是 Backend
。
Backend
分為本地(local)和遠端(remote)兩類,默認為本地。遠端的類型也非常多,目前官方網站提供的有13種,並且阿里雲的OSS就位列其中。
使用遠端的Backend,既可以降低多人協作時對state的維護成本,而且可以將一些敏感的數據存放在遠端,保證了數據的安全性。
Provisioner:在機器上執行操作的組件
Provisioner 通常用來在本地機器或者登陸遠程主機執行相關的操作,如 local-exec
provisioner 用來執行本地的命令, chef
provisioner 用來在遠程機器安裝,配置和執行chef client, remote-exec
provisioner 用來登錄遠程主機並在其上執行命令。
Provisioner 通常跟 Provider一起配合使用,provider用來創建和管理資源,provisioner在創建好的機器上執行各種操作。
變量
Terraform 運行時會讀取工作目錄中所有的 *.tf, *.tfvars 文件,所以我們不必把所有的東西都寫在單個文件中去,應按職責分列在不同的文件中,例如:
provider.tf -- provider 配置
terraform.tfvars -- 配置 provider 要用到的變量
varable.tf -- 通用變量
resource.tf -- 資源定義
data.tf -- 包文件定義
output.tf -- 輸出
Terraform引用了一些環境變量來控制部分功能,這些環境變量都不是必需的,但是可以改變一些Terraform的默認行為,幫助用戶適配更多應用場景
# 操作日志是重要的運維信息來源,用戶可以通過設置日志類型TF_LOG和日志保存路徑TF_LOG_PATH,將詳細的日志打印到stderr,以獲取調試信息。TF_LOG支持五種可用值,TRACE,DEBUG,INFO,WARN,ERROR,分別代表五種不同的日志級別,其中TRACE表示最詳細的日志
export TF_LOG=TRACE # DEBUG INFO WARN ERROR
export TF_LOG_PATH=/root/optf/tf.log
Terraform中輸入變量
variable
是Terraform重要的配置文件類型之一,通過對變量的集中管理,用戶可以在資源文件中直接引用變量名進行賦值。首先需要先定義(聲明)變量,放到一個.tf
文件中,如:
創建variable.tf
文件,配置參數的默認值
variable "access_key" {}variable "secret_key" {}variable "region" { default = "us-east-1"}variable "f5user" { type = string default = "admin"}variable "f5pass" { type = string default = "admin"}
上面定義了變量。前兩個變量是空的,第三個給了一個默認值(默認參數)。此時運行terraform plan
,Terraform會提示輸入這些尚未定義的變量。
引用變量,使用${var.xxx}
的形式。這樣在資源配置文件中,參數可以直接調用var.f5user
provider "aws" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "${var.region}"}
變量賦值
前面我們聲明了變量,但是還沒有給變量賦值,無法真正使用。給變量賦值,有以下幾種方法,下面幾種方法按照變量賦值的優先順序排序。
1 命令行聲明
使用terraform的各種命令時,使用-var
選項,可以在后面直接跟變量的定義,如:
# terraform apply \ -var 'access_key=foo' -var 'secret_key=bar' # ...
以這種方式賦值變量是一次性的,並不會保存它們的值,也就是說下一次重新執行命令時,需要重新賦值。
在terraform apply中,直接設置變量值會覆蓋掉variable.tf
中設置的默認值
2 從文件導入
為永久性存儲一個變量的值,可以將其放在文件中保存。Terraform會自動加載當前目錄下擴展名為.tfvars
和.auto.tfvars
的文件來填充定義的變量。如果以其他格式存放,可以使用-var-file
選項來手動指定需要加載的變量值文件。這些文件使用Terraform格式或JSON格式。
使用文件也方便版本控制,但是用戶名、密碼這種東西就不要用版本控制管理的。因此可以將用戶名和密碼這類信息單獨放在一個文件中,使用-var-file
來手動指定。其他的,可以自動填充,方便使用版本控制管理的,可以直接放在.tfvars
文件中,Terraform會自動加載。
3 環境變量
Terraform會讀取TF_VAR_name
這種格式的環境變量,用來填充定義好的變量。比如,環境變量中有一個TF_VAR_access_key
的變量,Terraform就會讀取到,並用於填充access_key
變量。
4 default值
如果某個變量沒有采用以上任何一種方法來進行賦值,那么如果在變量的定義中有個default
屬性,那么Terraform就會使用default
的值來對變量進行賦值。
5 交互輸入
沒有使用任何方法來對變量賦值,在輸入命令時使得Terraform不知道如何處理,此時就會出現交互界面,讓用戶手動輸入變量值,來給變量賦值。
也可以利用TF_VAR_name
把變量設置在環境變量中
export TF_VAR_f5user="admin"
配置TF_INPUT
,可以關閉對未指定值的變量的提示。將剛才的variable.tf
中設置的參數刪除
export export TF_INPUT=1
執行Terraform指令,會要求寫入參數值
設置TF_INPUT
為false
或0
,再次執行指令,系統報錯:未指定變量的值
export export TF_INPUT=0
CLI Config File
用戶可以通過CLI的配置文件對CLI進行一些設置,適用於所有Terraform的工作目錄,與資源配置文件是區分開的。
配置文件中支持的參數有:
① 是否開啟更新與安全檢查:disable_checkpoint
② 允許更新與安全檢查,但禁止使用匿名id刪除警告消息:disable_checkpoint_signature
③ 啟用插件緩存,以字符串的形式指定插件緩存目錄的位置:plugin_cache_dir
④ Terraform企業版憑證:credentials
可以在環境變量中配置CLI Config File的位置
export TF_CLI_CONFIG_FILE="$HOME/.terraformrc-custom"
資源管理常用命令
terraform plan:資源的預覽
在初始化目錄下執行 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 taint:標記資源為被污染
taint命令用於把某個資源標記為被污染狀態,當再次執行apply命令時,這個被污染的資源將會被先釋放,然后再創建一個新的,相當於對這個特定資源做了先刪除后新建的操作。
命令的詳細格式為: terraform taint <資源類型>.<資源名稱>
,如:
terraform taint bigip_ltm_pool_attachment.attach_nodeqat01Resource instance bigip_ltm_pool_attachment.attach_nodeqat01 has been marked as tainted.
terraform untaint:取消被污染標記
untaint命令是taint的逆向操作,用於取消被污染標記,使其恢復到正常的狀態。命令的詳細格式和taint類似為:terraform untaint <資源類型>.<資源名稱>
,如:
terraform untaint untaint bigip_ltm_pool_attachment.attach_nodeqat01Resource instance bigip_ltm_pool_attachment.attach_nodeqat01 has been successfully untainted.
terraform output:打印出參及其值
如果在模板中顯示定義了output參數,那么這個output的值將在apply命令之后展示,但plan命令並不會展示,如果想隨時隨地快速查看output的值,可以直接運行命令 terraform output
Terraform對資源狀態的管理,實際上是對State文件中數據的管理。State文件保存了當前Terraform管理的所有資源及其屬性,內容都是由Terraform自動存儲的,為了保證數據的完整性,不建議手動修改State內容。對State數據的操作可以通過terraform state命令來完成。
terraform state list:列出當前state中的所有資源
state list命令會按照 <資源類型>.<資源名稱>
的格式列出當前state中存在的所有資源(包括datasource),例如:
$ terraform state listdata.alicloud_slbs.defaultalicloud_vpc.defaultalicloud_vswitch.this
terraform state show:展示某一個資源的屬性
state show命令按照Key-Value的格式展示出特定資源的所有屬性及其值,命令的完整格式為 terraformstate 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中的某個資源移除,但是實際上並不會真正刪除這個資源,命令格式為:terraformstate rm <資源類型>.<資源名稱>
,例如:
$ terraform state rm alicloud_vswitch.thisRemoved alicloud_vswitch.thisSuccessfully 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.defaultMove "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文件中。
terraform graph:輸出當前模板定義的資源關系圖
每個模板定義的資源之間都存在不同程度的關系,如果想看資源關系圖,可以使用命令terraform graph:
$ terraform graphdigraph { 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來檢查和定位錯誤出現的詳細位置和原因。
詳細介紹每一個具體的指令,包括如何使用和可能遇到的問題
- apply
terraform apply
用於應用所需的更改,以達到所需的配置狀態,同時執行結果會保存在本地狀態文件terraform.tfstate
中。
標准語法:terraform apply [options] [dir-or-plan]
options
用來填寫apply
的flagsdir-or-plan
用來指定配置計划或計划的路徑
在當前目錄只配置provider.tf
,不添加任何資源文件,執行terraform apply
,顯示沒有任何資源被部署
在當前目錄執行terraform apply ./tftest
命令,創建在/tftest
目錄的資源文件將被部署
terraform apply ./tftest
options
-backup=path
- 備份文件的路徑,設置為-
時表示禁用
terraform apply -backup=-
刪除terraform.tfstate.backup
,執行terraform apply -backup=-
,不再自動保存備份
-auto-approve
- 跳過部署計划前的審批過程,直接創建資源
terraform apply -auto-approve
-no-color
- 禁用輸出時字符的顏色
terraform apply -no-color
-parallelism=n
- 限制並發操作的數量,默認是10
terraform apply -parallelism=5
-refresh=true
- 在計划和應用之前,更新每一個資源的狀態
terraform apply -refresh=true
-state=path
- 狀態文件的路徑,默認為terraform.tfstate
terraform apply -state=./test_state
刪除terraform.tfstate
,執行terraform apply -state=./test_state
,將狀態文件保存在當前文件夾下的test_state
中
- console
terraform console
提供了一個用於評估和驗證表達式的交互控制台。
標准語法:terraform console [options] [dir]
options
用來填寫console
的flagsdir
用來指定要使用的目錄,默認為當前目錄
// Evaluating and experimenting with expressions $ echo "1 + 2" | terraform console
- destroy
terraform destroy
用於銷毀terraform管理的基礎設施。
標准語法:terraform destroy [options] [dir]
options
用來填寫destroy
的flags
-
dir
用來指定要使用的目錄,默認為當前目錄 -
-auto-approve
- 同apply
命令中的-auto-approve
,跳過銷毀計划前的審批過程,直接銷毀資源
- fmt
terraform fmt
用於將terraform配置文件重寫為規范格式和樣式,確保文件的一致性。在升級Terraform之后,建議您在模塊上預先運行Terraform fmt
,使之前的文件適配新版本。
標准語法:terraform fmt [options] [dir]
-
options
用來填寫fmt
的flags -
dir
用來指定要使用的目錄,默認為當前目錄 -
-list=false
- 不列出格式不一致的文件
// Don't list the files containing formatting inconsistencies $ terraform fmt -list=false
-diff
- 顯示格式更改的差異
// Display diffs of formatting changes $ terraform fmt -diff
1、force-unlock
terraform force-unlock
用於刪除當前配置狀態上的鎖,並不會修改用戶的基礎設施。配置是否可以進入鎖狀態取決於后端服務的類型,有關鎖定狀態的更多信息點擊這里。
標准語法:terraform force-unlock LOCK_ID [dir]
dir
用來指定要使用的目錄,默認為當前目錄
// Removes the lock on the state for the current configuration $ terraform force-unlock LOCK_ID
2、get
terraform get
用於下載和安裝配置模塊。模塊可用於創建輕量級的抽象,這樣用戶就可以根據模塊的體系結構來配置基礎資源,有關模塊化的更多信息點擊這里。
標准語法:terraform get [options] [dir]
options
用來填寫get
的flagsdir
用來指定要使用的目錄,默認為當前目錄
dir
更新用戶目錄中tencentcloud
目錄下的模塊
// Sets the path of the root module $ terraform get -update ~/tencentcloud
options
-update
- 將檢查已經下載的模塊是否有更新,如果有更新,則下載這些更新
// Modules are downloaded will be checked for updates $ terraform get -update
3、graph
terraform graph
用於生成配置或執行計划的可視化依賴關系信息,輸出為DOT
格式,可以通過GraphViz
生成圖表。
標准語法:terraform graph [options] [dir]
options
用來填寫graph
的flagsdir
用來指定要輸出圖表信息的目錄,默認為當前目錄
輸出tencentcloud
目錄下資源的依賴關系(配置了私有網絡與服務器)
// Output the dependencies of resources in the current directory $ terraform graph
輸出的依賴關系
可以看到服務器(CVM)與所屬的安全組(security_group)和子網(subnet)的依賴關系
dir
在tencentcloud
目錄下輸出test
目錄中的配置資源依賴關系(test
中未配置任何資源)
// Output the dependencies of resources in the specified directory $ terraform graph ./test
test空目錄依賴關系
以圖形的方式顯示依賴關系更為直觀,能夠讀取DOT
格式的典型程序是GraphViz
,但是也有許多web服務可以應用在這個格式上 。
利用GraphViz
對其的支持,可以創建*.svg
文件,這里命名為graph
// Dependency diagram $ terraform graph | dot -Tsvg > graph.svg
生成graph.svg
使用瀏覽器將此文件打開,可以清楚的看到所有資源的拓撲圖
graph.svg資源拓撲圖
options
-draw-cycles
- 用顏色標亮依賴中循環的部分,有助於分析循環出現的問題
// Highlight any cycles in the graph with colored edges $ terraform graph -drwa-cycles | dot -Tsvg > graph.svg
-module-depth=n
設置輸出中模塊的深度,默認情況下這是-1
,顯示所有
// Specifies the depth of modules to show in the output $ terraform graph -module-depth=-1
-type=plan
輸出依賴圖內容的類型,可以指定為plan
,plan-destroy
,apply
,validate
,input
,refresh
// Sets type of graph to output $ terraform graph -type=plan
可以看到不同類型的輸出內容有所區別
plan類型的graph輸出內容
apply類型的graph輸出內容
4、import
terraform import
用於將已有的資源導入到terraform
中。
標准語法:terraform import [options] ADDRESS ID
options
-backup=path
- 設置備份現有狀態的路徑,默認為-state-out
的路徑,備份為.backup
文件,設置為-
時不進行備份
// Sets path to backup the existing state file $ terraform import -backup=-
-lock=true
- 支持鎖定狀態時,鎖定狀態文件
// Lock the state file when locking is supported $ terraform import -lock=true
有關import
指令的更多信息,請點擊這里,后續文章中將詳細介紹有關import
的使用方式。
5、init
terraform init
用於初始化包含terraform配置文件的工作目錄。
標准語法:terraform init [options] [dir]
options
用來填寫init
的flagsdir
用來指定要初始化的目錄,默認為當前目錄
options
-upgrade
- 升級模塊和加載插件分別作為初始化的一個步驟-lock=false
- 禁止使用狀態鎖
Copy a Source Module
默認情況下,terraform init
會假設工作目錄已經包含一個配置,並初始化該配置,但是在一個空目錄下,執行terraform init
時會報錯,因為找不到任何配置信息(這里的空目錄為test
)
空目錄下初始化失敗
用戶可以選擇對空目錄使用-from-module=MODULE-SOURCE
選項運行init(等號后面為需要復制的資源地址),在這種情況下,指定的模塊將被復制到目標目錄中,例如可以將tencentcloud
目錄下的資源復制到此空目錄test
中並初始化
// Copy a Source Module $ terraform init -from-module=/home/ubuntu/tencentcloud
復制tencentcloud目錄中的資源並初始化
可以看到初始化成功,並把tencentcloud
目錄中的資源復制過來。這種方式的好處在於用戶在新目錄下配置資源時不需要將provider的信息二次填寫,直接激活憑證,並把之前版本的配置作為新配置的基礎。
Plugin Initialization
在初始化的過程中,Terraform會根據provider的信息,加載所需插件,插件加載后的目錄為.terraform/
插件所在目錄
-get-plugins=false
跳過安裝插件的步驟,使用插件目錄和安裝在當前工作目錄中的已有插件,如果所安裝的插件不足以進行配置,初始化將失敗
// Skips plugin installation $ terraform init -get-plugins=false
-plugin-dir=PATH
跳過安裝插件的步驟,從指定的PATH
目錄下加載插件
// Loads plugins from the specified directory $ terraform init -plugin-dir=PATH
有關init
指令的更多信息,請點擊這里。
6、output
terraform output
指令用於從狀態文件中提取輸出變量的值。
標准語法:terraform output [options] [NAME]
options
用來填寫output
的flagsNAME
用來指定要輸出的變量的值,默認為根模塊的所有輸出
配置output.tf
文件,設置要輸出的內容,案例中設置查看服務器的id
和availability_zone
兩個參數
// output.tf output "cvm_az" { value = "${tencentcloud_instance.cvm.availability_zone}" } output "cvm_id" { value = "${tencentcloud_instance.cvm.id}" }
配置output.tf文件
執行terraform apply
,output
的內容自動顯示出來,也可以執行terraform output
再次查看全部輸出內容
// View output $ terraform output
顯示輸出內容
NAME
通過terraform output cvm_id
單獨查看服務器id
// Output cvm_id $ terraform output cvm_id
只查看服務器id
options
-json
- 設置輸出的格式為JSON對象-no-color
- 設置后輸出內容沒有其他顏色標識
有關output
指令的更多信息,請點擊這里。
7、plan
terraform plan
用於創建執行計划,以確定實現配置文件中指定的資源狀態所需的操作,是一種讓用戶可以十分方便的檢查一組更改的執行計划是否符合期望的方法,而無需對實際資源或狀態進行任何更改。
標准語法:terraform plan [options] [dir]
options
用來填寫plan
的flagsdir
用來指定需要創建計划的目錄,默認為當前目錄
創建執行計划
options
-destroy
- 生成一個銷毀所有資源的計划-detailed-exitcode
- 返回詳細的退出代碼,每個退出代碼對應不同的含義
`0` = 計划成功,沒有更改 `1` = 錯誤 `2` = 計划成功,有更改
-out=path
- 設置執行計划保存的路徑-refresh=true
- 在差異檢查之前更新狀態-target
- 用來將Terraform的注意力集中在資源的一個子集上,例如在cvm.tf
文件中設置了count=2
,一次創建2個服務器,可以通過索引針對其中一個創建計划
執行terraform plan -target=tencentcloud_instance.cvm[1]
對其中一台服務器創建計划
// Create plan $ terraform plan -target=tencentcloud_instance.cvm[1]
對一台服務器創建計划
有關plan
指令的更多信息,請點擊這里。
8、providers
terraform providers
輸出關於當前配置中使用的雲提供商的信息。
標准語法:terraform providers [config-path]
config-path
指定配置文件的路徑
// Provider information $ terraform providers
1、refresh
terraform refresh
通過狀態文件協調當前狀態與實際的基礎設施狀態, 用於檢測不一致的內容,並更新狀態文件。
標准語法:terraform refresh [options] [dir]
options
用來填寫refresh
的flagsdir
用來指定要刷新的目錄,默認為當前目錄
默認情況下refresh
不需要任何標志,並在當前目錄中查找要刷新的配置和狀態文件
使用terraform refresh
命令,刷新已有資源狀態
// Refresh the resource $ terraform refresh
刷新已有資源
options
-backup=path
- 設置備份文件的路徑,取值-
時,不備份-state=path
- 設置狀態文件的路徑
有關refresh
指令的更多信息,請點擊這里
2、show
terraform show
用於查看已經部署的資源。
標准語法:terraform show [options] [path]
options
用來填寫show
的flagspath
用來指定要查看的目錄,默認為當前目錄
查看當前目錄下部署的資源信息
// Show the resource $ terraform show
查看當前目錄下部署的資源信息
options
-json
- 顯示狀態的JSON
表示,有關JSON
的輸出格式請點擊這里
3、taint
terraform taint
用於對資源進行標記,強制被標記的資源在下一次應用中被銷毀並重新創建。
標准語法:terraform taint [options] address
options
用來填寫taint
的flagsaddress
用來指定被標記資源的地址
對已創建的服務器進行標記,使其在下一次應用中銷毀並重新創建。注意:這里的address
填寫的是資源的引用格式,如果資源中有count
參數,需要加上索引數
// Taint the resource $ terraform taint tencentcloud_instance.cvm[0]
標記服務器資源
再次執行terraform apply
時,會提示被標記的資源銷毀后,重新創建
提示重新創建被標記資源
options
-allow-missing
- 允許標記丟失的資源
標記不存在的資源
// Taint the missing resource $ terraform taint -allow-missing tencentcloud_instance.cvm[1]
使用-allow-missing
的前后對比
標記不存在資源時不同的提示信息
-backup=path
- 設置備份文件的路徑,取值-
時,不備份-state=path
- 設置狀態文件的路徑
有關taint
指令的更多信息,請點擊這里
4、validate
terraform validate
用於驗證.tf
文件的語法。
標准語法:terraform validate [options] [dir]
options
用來填寫validate
的flagsdir
用來指定要驗證的目錄,默認為當前目錄
默認情況下,validate
不需要任何標志,並在當前目錄中查找配置
// Validate the resource $ terraform validate
驗證目錄下的.tf文件
options
-check-variables=true
- 檢查是否制定了所有必需的變量,默認是true
有關validate
指令的更多信息,請點擊這里
5、untaint
terraform untaint
取消對已有資源的標記。
標准語法:terraform untaint [options] name
options
用來填寫untaint
的flagsname
用來指定資源,同taint
的address
參數
options
-backup=path
- 設置備份文件的路徑,取值-
時,不備份-state=path
- 設置狀態文件的路徑
有關untaint
指令的更多信息,請點擊這里
6、workspace
terraform workspace
用於管理工作區,包含一些子命令。
標准語法:terraform workspace <subcommand> [options] [args]
subcommand
用來填寫workspace
的子命令options
用來填寫workspace
的flagsargs
用來填寫參數
terraform workspace new [NAME]
創建一個新的工作區,NAME
用來指定新工作區的名字
創建命名為test
的新工作區
//Create a new workspace $ terraform workspace new test
創建新工作區
terraform workspace list
列出現有的工作區,使用星號*
標記指示當前工作區
// List the workspace $ terraform workspace list
查看所有工作區
terraform workspace select [NAME]
選擇一個進一步操作的工作區,NAME
用來指定新工作區的名字
// Select the workspace $ terraform workspace select
將workspace從test
變成default
進入default工作區
terraform workspace delete [NAME]
刪除已有的工作區
刪除test
工作區
// Delete the workspace $ terraform workspace delete test
刪除test工作區
terraform workspace show
輸出當前工作區的名字
// Show the workspace $ terraform workspace show