Terraform語法入門

  • 2020 年 3 月 18 日
  • 筆記

HCL是Terraform的配置語言,它是HashiCorp發明的一種聲明式語言,能夠以更加簡短和人性化的方式來描述資源。本文主要介紹HCL配置語言的基本語法及使用,語法採用當前最新版本0.12。

基本組成

HCL文件以.tf結尾,Terraform執行時會讀取該目錄下所有的HCL文件。由於HCL是聲明式語言,因此對資源和變數的引用不依賴於定義的順序。通常tf文件包含provider,resource和data source,例如下面的程式碼創建一個cvm實例:

provider "tencentcloud" {      secret_id  = "xxxxxxxxxxxxx"      secret_key = "xxxxxxxxxxxxx"      region     = "ap-guangzhou"  }    data "tencentcloud_image" "my_favorate_image" {    os_name = "centos"      filter {      name   = "image-type"      values = ["PUBLIC_IMAGE"]    }  }    resource "tencentcloud_instance" "my_awesome_app" {    instance_name              = "test"    availability_zone          = "ap-guangzhou-3"    image_id                   = data.tencentcloud_image.my_favorate_image.image_id    instance_type              = "S3.SMALL1"    system_disk_type           = "CLOUD_PREMIUM"    system_disk_size           = 50    hostname                   = "user"    project_id                 = 0    internet_max_bandwidth_out = 1    allocate_public_ip         = true  }
  • provider對應一個雲廠商的基礎設施,它提供了雲廠商對應的resource和data source。使用provider需要設置對應的密鑰、地區等,這些參數名稱可以在各個雲廠商的插件文檔中找到,比如騰訊雲的文檔在這裡。執行terraform init時會根據provider來下載需要使用的插件,默認會從terraform官方倉庫下載最新版本的插件,也可以在provider中使用version來指定版本。
  • resource是Teraform中最重要的組成元素,每個resource塊代表一個或多個雲產品實例,比如多個CVM實例或者多個VPC實例。resource的定義可以參考這篇文章。
  • data source用來查詢一些資訊給其他的resource配置使用,比如上面通過data source查詢centos的共有鏡像的ID,然後cvm實例中引用它。

類型

基本類型

  • string:字元串類型,由一個或多個Unicode字元組成,例如"hello"。
  • number: 數字類型,可以表示整數,也可以表示浮點數。
  • bool:布爾類型,只能是true或false。

數字類型和布爾類型在配置中都可以自動轉換為字元串類型,相反,只要字元串值能代表有效的數字或布爾類型,都可以自動轉換。比如true可以轉換為字元串"true","true"也可以轉換為true。

複雜類型

  • list:列表類型,它的所有元素類型必須是相同類型,下標從0開始。當tf文件中表示對象的列表時寫法為data_disks { data_disk_type = "CLOUD_SSD" data_disk_size = 100 } data_disks { data_disk_type = "CLOUD_SSD" data_disk_size = 100 }tags = { test = "test1" }
  • map: 包含多個key: value形式。在tf文件中的寫法為

特殊類型

  • null:表示空,如果將一個參數設置為null,表示這個參數未填寫,Terraform會完全忽略這個參數。null在條件表達式中比較有用,比如當var.test的值為""忽略該欄位可以這樣寫name = var.test == "" ? null : var.test

變數引用

Terraform中resource和data source之間通常會引用屬性值,引用方式如下:

  • 引用resource屬性:可以使用<RESOURCE TYPE>.<NAME>.<ARGUEMENT>引用resource屬性,比如引用上面示例中cvm的id,tencentcloud_instance.my_awesome_app.id。
  • 引用data source屬性:可以使用data.<DATA TYPE>.<NAME>引用data source屬性,比如引用上面實例中鏡像的id, data.tencentcloud_image.my_favorate_image.image_id
  • 當創建多個實例時,resource中的count不為1,可以使用count.index引用實例的索引
  • 引用對象列表的所有的name可以使用tencentcloud_instance.my_awesome_app.data_disks[*].data_size表示cvm的所有data_disks的data_size所組成的列表

表達式

運算符

terraform支援的運算符包括:

  • 算術運算符: +, -, *, /, %, -a
  • 比較運算符: ==, !=, < , <=, >, >=
  • 邏輯運算符: ||, &&, !a

條件表達式

terraform支援條件表達式,表示如果條件為真,結果時true_val, 否則結果為false_val。

condition ? true_val : false_val

總結

以上就是terraform的基本使用語法,更多使用例子可以參考這裡。

Tags: