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