變量分為兩種類型,一種為輸入變量,另外一種為輸出變量。
之前在寫tf的模闆檔案的時候用了很多變量,比如在寫認證資訊的時候,定義的變量存放了阿裡雲的ak和sk,最後就是region的資訊。
變量的使用都是使用variable關鍵字,後面跟上變量的名稱,塊裡面有變量的類型。
隻需要将子產品當中經常變化的部分聲明為變量,類似于shell。
這些變量也可以跨不同的子產品去共享,比如像region資訊,當我們有多個子產品的時候,既然在同一個region下面,我們就不需要聲明很多這種變量了,這樣可以實作組合和重用。
可以從終端讀取,通過export聲明的變量。
tf會去讀取檔案裡面的變量,預設讀取的檔案terraform.tvars,當項目裡面有這個檔案,那麼tf在執行的時候會以這裡面的變量去讀取。
在UI當中顯示,就是在tf終端當中列印出來的資訊,有很多變量我們可以讓它不展示出來,這個是個布爾值,如果是true就不展示。可以看到,引用了該變量,在plan下面該變量被列印出來了。
變量參數類型還是很多的,之前在其他語言裡面聲明了變量,可能是字元串,或者是一個數值,或者是一個布爾值,甚至是any包含了下面的任意對象。
list 清單 裡面是類型,如果是string,那麼就是字元串清單。
set 序列。object是自定義的對象。
比如要配置dns的資料,dns域名裡面可能定義了多個環境,每個環境它的域名可能都不太一樣。
那麼我們根據key去定義環境,value就是每個環境定義的域名。
上面圖檔注意,一個是聲明變量,另外一個是定義變量,那麼tf才能讀取進來。
圖檔左邊是聲明變量,右邊是定義變量。
list類型是一個清單,可以說是個數組,通過list可以定義具有相同意義的值。
list裡面調用值就是通過索引去調用。
output "my_env" {
value = var.env_list[0]
}
object就是一個對象了,這個是自定義的對象。你可以自定義一些屬性,它的類型和它的值。
那麼建立ecs的時候就可以傳遞這個變量了,在調用的時候就和map是一樣的。
image_id = var.ecs_info.esc_image
instance_name = var.ecs_info.ecs_name
vswitch_id = alicloud_vswitch.vsw.id
+ image_id = "centos_7_04_64_20G_alibase_201701015.vhd"
+ instance_charge_type = "PostPaid"
+ instance_name = "my_ecs"
上面就是變量的優先級了,可以在環境變量裡面設定變量,還可以在tfvars裡面設定變量。如果是使用json寫的,那麼可以建立tfvars.json。
然後下面是可以覆寫的變量。
最後可以在指令行裡面傳遞變量。
在執行tf部署的時候,傳遞一個變量是region,可以通過-var,如果是傳遞很多變量,那麼就寫多個-var,變量類型有很多,比如list類型,注意使用單引号引用起來。
可能将變量寫到檔案裡面,但是它的檔案名稱不叫terraform.tfvars,它可能叫dev.tfvars,也是我自己定義的檔案。這個時候就需要通過-var-file參數進行指定。
最後就是環境變量,所有變量都是以TF_VAR開頭,這個時候tf在讀取環境變量的時候認為它是tf的變量,加載這裡面的值。