文法是terraform最重要的一點,有兩個部分來講解,第一部分是基礎,第二部分是更加進階的擴充。
後面各種實踐其實就是對terraform文法編寫。
第一部分是provider插件,provider提供了資源和資料源,插件,資源,資料源都是三個比較重要的内容。
其次是變量和輸出。
Terraform 配置文法
terraform配置檔案都是以.tf為字尾的,python以.py結尾。java以.java結尾。是以tf都是以.tf為字尾的。
就是在目前的目錄下,有多少個以.tf為字尾的檔案,那麼在執行terraform指令的時候就會去加載。
我們看到每個目錄下的tf檔案,這個目錄可以稱作為叫做子產品,叫做module。
tf支援兩種文法格式,一個是hcl,一個是json,這兩者之間是有差別的,這兩者是有差別的。
hcl我們每個人看起來比較醒目,一個是開發定制工具的時候json這種格式。
這裡面我們使用的是hcl文法,我們這些配置檔案都是通過hcl來寫的。
json和它類似,隻不過改為了json的格式。
terraform主要是通過provider來管理基礎設施的,provider通過和雲供應商提供的api互動來實作資源的釋出。
這裡子產品就是目錄,
你可以了解為這個目錄就是子產品,子產品下面有很多terraform的配置檔案,最上面一層叫做根子產品。
假設要使用阿裡雲的資源就要使用阿裡雲的provider,不然terraform也不知道怎麼去安裝和使用它。
是以在terraform的語句塊裡面通過關鍵字required_providers語句塊裡面定義了所有的provider。
terraform是一個混合雲的管理工具,required_providers語句塊裡面可以定義多個provider。aws,華為雲,阿裡雲都可以在下面寫。
裡面寫好源位址,和版本資訊即可。
source = "aliyun/alicloud"
version = "1.189.0"
聲明是讓terraform知道要使用哪個provider,而接下來就需要配置provider了,調用雲資源。
那就需要去控制台,就要去每個産品裡面管理,這是控制台日常操作。
provider的名稱你可以自定義,裡面主要是ak sk rg的資訊,這樣就定義好了我們的provider。
這裡有個問題,定義了provider,裡面定義了region,比如我要操作阿裡雲不同的region,不同區域,它的這些資源,在這裡寫死了region,那麼下次再調用的時候就是預設使用裡面配置寫死的region。
當你有多個地域的時候就涉及别名了。
也就是在配置檔案裡面聲明了兩遍provider, 都是同一個provider,唯一不同的就是配置不同。
後面資源在調用的時候使用就是provider的名稱+alias就可以了。
要調用北京,那麼就使用alicloud.beijing。
在資源裡面有個屬性provider。
provider "alicloud" {
access_key = "LTAI5tNcApxzkS5RG9e"
secret_key = "aVXPqQYyJ1u1SusXUgBDJaH"
alias = "hangzhou"
region = "cn-hangzhou"
}
provider "alicloud" {
alias = "beijing"
region = "cn-beijing"
}
這樣就在配置檔案裡面定義了兩個區域,一個北京,一個杭州,那麼在我的資源裡面去調用。
//vpc專有網絡
resource "alicloud_vpc" "vpc" {
provider = alicloud.hangzhou
vpc_name = "tf_test_foo"
cidr_block = "172.16.0.0/12"
}
//switch交換機
resource "alicloud_vswitch" "vsw" {
provider = alicloud.hangzhou
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.16.0.0/21"
zone_id = "cn-hangzhou-b"
}
provider "alicloud" {
access_key = "LTAI5tNcApxzkS53FHNHRG9e"
secret_key = "aVXPqQYyJ1u1SusXUgBo9rKfVyDJaH"
region = "cn-hangzhou"
}
provider "alicloud" {
access_key = "LTAI5tNcApxzkS53FHNHRG9e"
secret_key = "aVXPqQYyJ1u1SusXUgBo9rKfVyDJaH"
alias = "shanghai"
region = "cn-shanghai"
}
provider "alicloud" {
access_key = "LTAI5tNcApxzkS53FHNHRG9e"
secret_key = "aVXPqQYyJ1u1SusXUgBo9rKfVyDJaH"
alias = "beijing"
region = "cn-beijing"
}