首頁 > 軟體

Terraform 使用範例詳解

2020-06-16 16:56:26

Terraform 是一個 IT 基礎架構自動化編排工具,它的口號是 "Write, Plan, and create Infrastructure as Code", 基礎架構即程式碼。具體的說就是可以用程式碼來管理維護 IT 資源,比如針對 AWS,我們可以用它建立,修改,刪除 S3 Bucket, Lambda, EC2 範例,Kinesis, VPC 等各種資源。並且在真正執行之前可以看到執行計劃(即干執行-dryrun)。由於狀態儲存到檔案中,因此能夠離線方式檢視資源情況 -- 當然,前提是不要在 Terraform 之外對資源進行修改。

Terraform 設定的狀態除了能夠儲存在本地檔案中,也可以儲存到 ConsulS3, azure, http, swift 等處。

Terraform 是一個高度可延伸的工具,通過 Provider 來支援新的基礎架構,AWS 不過為目前官方內建 68 個 Providers 中的一個。其他能用 Terraform 的地方有 Alicloud(阿里雲, 實名制備案才能用), Google Cloud, Heroku, Kubernetes, Microsoft Azure, MySQL, RabbitMQ, Docker 等等。願意的話可以寫自己的 Provider, 如搞個 Kafka 的話,用來管理 Topic 等的建立,維護工作。

Terraform 之前我們對 AWS 的操作用的是 awscli, 或 Serverless。awscli 什麼都能做,但它是無狀態的,必須明確用不同的命令來建立,修改和刪除。Serverless 不是用來管理基礎架構的,用它建立  Lambda 時建立資源都是很麻煩的事。AWS 提供的 CloudFormation 才是與 Terraform 較類似的工具,但是看到用法就頭疼。

下面從最簡單例子開始,看看怎麼用 Terraform 建立,刪改,修改 S3 Bucket。本地系統為 Mac OS。

1. Terraform 安裝

brew install terraform

安裝後 shell 命令就是 terraform, 常用的是 terraform init, terraform plan, terraform apply

2. 建立組態檔

像 git 一樣,每個 Terraform 專案需要自己單獨的目錄空間,所以我們建立一個 terraform-learning 目錄

mkdir terraform-learning
cd terraform-learning

該目錄下的所有  *.tf 檔案都會被 Terraform 載入,在初始化 Terraform 工作空間之前必須至少要有一個 *.tf 檔案。我們這裡建立檔案 main.tf, 內容如下

Terraform 設定的語法是該公司 HashiCorp 獨創的 HCL(HashiCorp configuration language), 它可以相容 JSON 格式。

上面 tf 檔案在 Vim 中的語法加亮是安裝的 hashivim/vim-terraform 外掛。

我們寫好了 *.tf 檔案後可以呼叫 terraform fmt 對組態檔進行格式化,它比較喜歡被 Java 棄用的等號對齊的格式。

3. 組態檔介紹

從正式跨入 terraform 命令正題之前先來大概的介紹一下上面那個 main.tf 檔案。

1) provider "aws" 部分,它指定選用什麼 provider, 以及驗證資訊。aws 既允許指定 access_key 和 secret_key

provider "aws" {
    region           = "us-east-1"
    access_key  = "your-access-key-here"
    secret_key   = "your-secret-key-here"
}

也能夠指定證書檔案中的 profile

provider "aws" {
    region                                  = "us-east-1"
    shared_credentials_file  = "~/.aws/credentials"   //不指定的話,預設值是 "~/.aws/credentials"
    profile                                  = "yanbin"                        //不指定的話,預設值是 "default"
}

如果是使用 shared_credentials_file 中的 profile, 請確定您以預先生成好的 credentials 檔案及有效的 profile。

更多關於 AWS Provider 的設定請參考 https://www.terraform.io/docs/providers/aws/index.html

2) resource "aws_s3_bucket" "s3_bucket" 部分

這只是我們今天舉的一個小例子,點選連結 aws_s3_bucket 檢視 S3 Bucket 所有的設定項。Terraform 能夠管理的所有 AWS 資源也能從前面那個連結中看到。

如果 bucket yanbin-test-bucket 不存在的話,執行 terraform apply 將會建立它,否則試圖更新該 bucket。此例子只指定了 bucket 的 acl 和 tag 資訊。terraform destroy 用來刪除已存在的  bucket。

注意:terraform 組態檔中只指定要管理的資源物件,並不關心操作資源的行為--建立,修改,刪除操作。操作行為與 Terraform 的狀態有關係,無則建立,有則修改,更名會拆分為除舊立新兩個操作,terraform destroy 用於顯式刪除資源。後面範例操作時會講到。

註:resource "aws_s3_bucket" "s3_bucket" { 中,resource 後第一個是 type, 即資源名,第二個參是 name。其實 "s3_bucket" 在這裡沒什麼用,只是一個描述或助記符而已(2017-08-28): 更正一下,在作為變數參照的時候就要用到它,例如在後面要為 Lambda 建立一個 S3 Event 的 Trigger, 就要寫成 event_source_arn = "${aws_s3_bucket.s3_bucket.arn}", 參照時不需要知道實際的名稱。

4. 初始化工作目錄

在初始化 Terraform 工作目錄之前, 其他命令如 apply, plan 多是不可用的,提示需要初始化工作目錄,命令是

terraform init

它要做的事情像是 git init 加上 npm install,執行完了 terraform init 之後會在當前目錄中生成 .terraform 目錄,並依照 *.tf 檔案中的設定下載相應的外掛。

5. 執行 Terraform 管理命令

有了前面的準備之後,終於可以開始執行 Terraform 的管理命令了。Terraform 在正式執行之前提供了預覽執行計劃的機會,讓我們清楚的了解將要做什麼

terraform plan

由此計劃還能知道關於 aws_s3_bucket 有些什麼設定項,比如設定中可以加上 acceleration_status = "Enabled"

terraform apply

這樣便在 AWS 上建立了一個 S3 bucket "yanbin-test-bucket", 同時會在當前目錄中生成一個狀態檔案 terraform.tfstate, 它是一個標準的 JSON 檔案。這個檔案對 Terraform 來說很重要,它會影響 terraform plan 的決策,雖然不會影響到實際的執行效果。我們可以把它存到遠端,如 S3 或 Consul。terraform state [list|mv|pull|push|rm|show] 用來操作狀態檔案??

此時什麼也不改,再次執行 terraform plan, 會顯示沒什麼要做的

aws_s3_bucket.s3_bucket: Refreshing state... (ID: yanbin-test-bucket)
No changes. Infrastructure is up-to-date.

如果對 main.tf 作點小改,改個 tag 屬性,再次 terraform plan

~ aws_s3_bucket.s3_bucket
tags.Name: "Created by Terraform" => "sCreated by Terraform"

Plan: 0 to add, 1 to change, 0 to destroy.

為什麼說 terraform plan 是基於狀態檔案 terraform.tfstate 作出的呢?我們可以刪除這個狀態檔案,然後執行 terraform plan 看看

+ aws_s3_bucket.s3_bucket
    .....
    bucket: "yanbin-test-bucket"
    ......
    tags.Environment: "QA"
    ......

Plan: 1 to add, 0 to change, 0 to destroy.

Terraform 由於缺乏 terraform.tfstate 對比,所以認為是要新增一個 bucket, 但是實際執行 terraform apply 時,連線到遠端 AWS, 發現該 bucket 已存在就只是進行更新。terraform apply 總能給出正確的操作結果。同理如果狀態檔案中說有那個 bucket, terraform plan 會說是更新,但 AWS 沒有那個  bucket,實際執行 terraform apply 也會進行新增的。

資源更名

如果把 main.tf 中的

bucket = "yanbin-test-bucket"

改成

bucket = "yanbin-test-bucket-rename"

即欲為 bucket 更名,用 terraform plan 看下計劃

實際上 terraform apply 也是先刪除舊的,再建立新的。Terraform 像 git 一樣用不同顏色和  +/- 號來顯示變動操作

最後是 terraform destroy 命令,把 *.tf 檔案中設定的所有資源從 AWS 上清理掉。

關於 Terraform 工作目錄中檔案命名

Terraform 執行時會讀取工作目錄中所有的 *.tf, *.tfvars 檔案,所以我們不必把所有的東西都寫在單個檔案中去,應按職責分列在不同的檔案中,例如:

provider.tf                -- provider 設定
terraform.tfvars      -- 設定 provider 要用到的變數
varable.tf                  -- 通用變數
resource.tf                -- 資源定義
data.tf                        -- 包檔案定義
output.tf                    -- 輸出

以此篇最簡單的入門出發,以後可以深入了解 Lambda, Lambda 觸發器,及 API Gateway, EC2 範例怎麼用 Terraform 來管理,也知曉了資源的可用屬性應該到哪裡去查。

一個小提示:在執行像 terraform plan 或 terraform apply 等命令的時候,可以按下 ctrl + c 讓控制台輸出詳細的紀錄檔資訊。

本文永久更新連結地址http://www.linuxidc.com/Linux/2018-01/150452.htm


IT145.com E-mail:sddin#qq.com