Terraform,變量詳解

1、定義變量

建立 variables.tf文件,定義變量名爲:aws_region。使用default關鍵字設置默認值:ap-southeast-1。默認值是可選的。若是未設
置默認值,則該變量是必需的。服務器

# variables.tf

variable "aws_region" {
  default = "ap-southeast-1"
}

注意:該文件能夠命名爲任何名稱,由於Terraform加載目錄下以*.tf結尾的全部文件。架構

2、使用變量

經過使用佔位符 ${}和var關鍵字引用定義的變量名。app

provider "aws" {
  region     = "${var.aws_region}"
}

3、分配變量

分配變量有多種方法。以變量的優先級考慮,從高到底的順序主要的方法以下:
Terraform,變量詳解ide

3.一、命令行

能夠直接在命令行中使用 -var 標誌設置變量 。在該Terraform檢查配置的任何命令接受該標誌,如apply 和 plan。命令行

terraform apply \
  -var 'aws_region=ap-southeast-1'

注意:以這種方式設置變量不會保存它們,而且在執行命令時必須重複輸入它們。版本控制

3.二、文件變量

若是想保留變量或者變量是一個固定的值,能夠考慮建立後綴爲 *.tfvars的文件。文件內容以下:code

# terraform.tfvars

aws_region = "ap-southeast-1"

對於當前目錄中匹配 terraform.tfvars 或 *.auto.tfvars 存在的全部文件,Terraform會自動加載它們以填充變量。若是文件名爲其餘名稱,則能夠-var-file直接使用該標誌指定文件。這些文件與Terraform配置文件的語法相同。與Terraform配置文件同樣,這些文件也能夠是JSON。orm

terraform apply -var-file="xxx.tfvars"

注意:不建議將用戶名和密碼保存到版本控制中,可是能夠建立一個本地祕鑰變量文件用-var-file加載。blog

-var-file 可使用屢次,指定不一樣的變量文件。例如:ci

terraform apply \
  -var-file="secret.tfvars" \
  -var-file="production.tfvars"

3.三、環境變量

Terraform將讀取前綴爲TFVAR*的環境變量。例如,TF_VAR_aws_region 能夠將變量設置爲設置aws_region變量。

注意:環境變量只能填充字符串類型的變量。列表和映射類型變量必須經過其餘機制之一進行填充。

3.四、默認值

若是沒有使用以上任何方法傳入變量值,則會採用默認值。

最後須要注意如下幾點:

  • 模塊內命名惟一
  • 變量間能夠引用
  • 不能循環引用

4、高級類型

4.一、列表(Lists)

# 隱式的定義
variable "cidrs" { default = [] }

# 顯示的定義
variable "cidrs" { type = list }

terraform.tfvars 文件內容:

cidrs = [ "10.0.0.0/16", "10.1.0.0/16" ]

4.二、字典(Map)

爲了合理分配資源,針對不一樣的運行環境,咱們想建立不一樣類型的服務器實例。例如:dev環境咱們只須要用t2.micro,prod環境咱們能夠配置高一點,使用t2.large。

variable "instance_types" {
  type = "map"
  default = {
    "dev"   = "t2.micro"
    "prod"  = "t2.large"
  }
}

variable "env" {
  default = "dev"
}

resource "aws_instance" "example" {
  instance_type = "${var.instance_types[var.env]}" 
}

在命令行中傳值:

terraform apply -var 'instance_types={ dev = "t2.micro", prod = "t2.large" }'

在terraform.tfvars 文件定義值:

instance_types = {
  "dev"  = "t2.micro"
  "prod" = "t2.large"
}

完整示例:

provider "aws" {
  region = "ap-southeast-1"
}

variable "instance_types" {
  type = "map"
  default = {
    "dev"   = "t2.micro"
    "prod"   = "t2.large"
  }
}

variable "env" {
  default = "dev"
}

resource "aws_instance" "example-instance" {
  ami           = "ami-061eb2b23f9f8839c"
  instance_type = "${var.instance_types[var.env]}" 

  tags = {
      Name = "Example by ChangSha Union"
  }
}

output "instance_type" {
  value = "${aws_instance.example-instance.instance_type}"
}

若是您喜歡這篇文章,請考慮關注我。

長沙DevOps聯盟 - 關注容器技術,K8S,自動化部署,基礎設施架構。
Terraform,變量詳解

相關文章
相關標籤/搜索