Terraform入門 - 2. 構建基礎設施
Terraform安裝完成以後,我們直接開始建立一些基礎設施。
我們在AWS 上建立一些基礎設施來開始入門指南,因為它最流行且通常可以被理解,但是Terraform可以管理許多provider ,包含在單個配置檔案中管理多個provider。在使用案例中 有一些例子。
如果你沒有AWS賬號,就建立一個 。在入門指南中,我們將只會用AWS免費試用的資源,也就是說它是免費的。如果你已經有一個AWS賬號,你可能要充一些錢,但是最多不會超過幾美元。
警告!如果你使用的不是一個AWS免費試用賬號,你可能需要充值來執行這些例子。你最多需要充值幾美元,但是我們不對任何可能產生的費用負責。
配置
Terraform中用來描述基礎設施的的檔案被叫做Terraform配置檔案。現在我們將寫下我們第一個配置檔案來啟動一個AWS的EC2例項。
配置檔案的文件在這裡 。配置檔案也可以是一給json檔案 ,但是我們建議只在機器生成配置檔案時使用json格式。
整個配置檔案內容如下所示。我們將在隨後的每一步逐步講解。將下面內容儲存到一個名為example.tf
的檔案中。確認在你的目錄中沒有其他*.tf
檔案,因為Terraform將載入所有的*.tf
檔案。
provider "aws" { access_key = "ACCESS_KEY_HERE" secret_key = "SECRET_KEY_HERE" region= "us-east-1" } resource "aws_instance" "example" { ami= "ami-2757f631" instance_type = "t2.micro" }
注意:上面的配置工作於大部分AWS賬戶,將訪問預設VPC。EC2經典網路使用者請為instance_type
指定t1.micro
,併為ami
指定ami-408c7f28
。如果你使用一個非us-east-1
的region你將需要指定該region的ami因為每個region的ami都是特定的。
用你的access key和secret key替換ACCESS_KEY_HERE
和SECRET_KEY_HERE
,可從此頁面
獲取。我們現在將他們硬編碼,但是在入門指南後面的將會將他們提取到變數裡。
注意:如果你僅僅遺漏了AWS憑證,Terraform將自動從已儲存的API憑證中搜索(如:在~/.aws/credentials中)。或者IAM例項配置檔案憑據。對於將檔案簽入原始碼管理或者有多個管理員的情況,該選擇要乾淨很多。到這裡 檢視細節。將憑據資訊遺留到配置檔案以外,使你可以將憑據資訊放在原始碼管理之外,並且也可以為不同的使用者使用不同的IAM憑據而不需要修改配置檔案。
這是一個完整的可執行的Terraform配置檔案。一般結構應該直觀並且直接。
provider
塊用於指定provider名稱,在我們的例項中叫"aws"。provider
負責建立和管理資源。如果一個Terraform配置檔案由多個provider組成,可以有多個provider塊,這是常見的情況。
resource
塊定一個基礎設施中存在的資源。一個資源可能是物理元件,如:EC2例項,或也可以是一個邏輯資源比如Heroku應用。
resource
塊開始前有兩個字串:資源型別和資源名稱。在我們的例項中資源型別是"aws_instance",資源名為"example"。資源型別的字首對映到provider
。在我們的例項中,"aws_instance"自動告知你Terraform被"aws"provider管理。
resource
塊內部是該資源的配置。它獨立於每個資源provider並且在provider參考
完全列出來。對於我們的EC2例項,我們為ubuntu指定一個AMI,然後請求一個"t2.micro"的例項因為我們有免費資格。
安裝
為一個新配置檔案或從版本控制工具中檢出的已存在的配置執行的第一個命令是terraform init
,它將初始化各種本地配置和資料為後面的命令使用。
Terraform使用基於外掛的結構來支援眾多的基礎設施和服務提供商。從Terraform"0.10.0"起,每個提供商有他們自己封裝和髮型的二進位制檔案,從Terraform分離出來。terraform init
將自動為下載配置檔案中包含provider下載外掛。在該例項中只包含"aws"外掛。
$ terraform init Initializing the backend... Initializing provider plugins... - downloading plugin for provider "aws"... The following providers do not have any version constraints in configuration, so the latest version was installed. To prevent automatic upgrades to new major versions that may contain breaking changes, it is recommended to add version = "..." constraints to the corresponding provider blocks in configuration, with the constraint strings suggested below. * provider.aws: version = "~> 1.0" Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your environment. If you forget, other commands will detect it and remind you to do so if necessary.
aws provider外掛與其他薄記檔案一起被下載安裝到當前目錄子目錄。
輸出資訊會顯示所安裝外掛的版本,以及建議在配置檔案中指定版本以確保terraform init
在未來安裝一個相容的版本。對於後面步驟來說這一步不是必須的,因為該配置檔案後面將會被廢棄。
應用變更
注意:本指南中列出的命令適用於terraform0.11及以上版本。更早版本需要在應用前使用terraform plan
命令檢視執行計劃。使用terraform version
命令確認你當前terraform版本。
在當前目錄中你建立的example.tf
為例,執行terraform apply
。你將看到以下類似輸出,我們刪節了部分輸出以節省空間:
$ terraform apply # ... + aws_instance.example ami:"ami-2757f631" availability_zone:"<computed>" ebs_block_device.#:"<computed>" ephemeral_block_device.#: "<computed>" instance_state:"<computed>" instance_type:"t2.micro" key_name:"<computed>" placement_group:"<computed>" private_dns:"<computed>" private_ip:"<computed>" public_dns:"<computed>" public_ip:"<computed>" root_block_device.#:"<computed>" security_groups.#:"<computed>" source_dest_check:"true" subnet_id:"<computed>" tenancy:"<computed>" vpc_security_group_ids.#: "<computed>"
該輸出顯示執行計劃,描述terraform將根據配置檔案執行那些動作來改變基礎設施。輸出格式與工具輸出的diff產生的格式類似,比如git。輸出內容在aws_instance.example
有個+
意味著Terraform將會建立該資源。在那些之下,顯示將會被設定的屬性。當值為<computed>
時,意味著資源被建立後才能知道。
terraform apply
執行失敗報錯時,讀取錯誤資訊並修復所報錯誤。在這一步,它可能是配置檔案中的語法錯誤。
如果計劃被成功建立,Terraform將在執行前暫停並等待確認。如果計劃中有任何不對或危險資訊,在這裡終止很安全,它不會對你的基礎設施做任何改變。這是如果計劃看起來可接受,在確認終端輸入yes
執行。
執行該計劃會花幾分鐘時間,直到EC2例項可用:
# ... aws_instance.example: Creating... ami:"" => "ami-2757f631" instance_type:"" => "t2.micro" [...] aws_instance.example: Still creating... (10s elapsed) aws_instance.example: Creation complete Apply complete! Resources: 1 added, 0 changed, 0 destroyed. # ...
在此之後Terraform執行完成,你可以到EC2終端檢視建立號的EC2例項。(確保你在檢視與配置檔案中相同的可用區!)Terraform也會寫一些資料到terraform.tfstate
。該狀態檔案極其重要;它追蹤建立的資源ID,所以Terraform知道它管理的是什麼資源。該檔案必須被儲存並分發給可能使用terraform的任何人。通常建議在使用Terraform時設定遠端狀態
,來自動分享狀態,但是針對像入門指南這樣簡單的環境這不是必須的。
你可以使用terraform show
檢查當前狀態:
$ terraform show aws_instance.example: id = i-32cf65a8 ami = ami-2757f631 availability_zone = us-east-1a instance_state = running instance_type = t2.micro private_ip = 172.31.30.244 public_dns = ec2-52-90-212-55.compute-1.amazonaws.com public_ip = 52.90.212.55 subnet_id = subnet-1497024d vpc_security_group_ids.# = 1 vpc_security_group_ids.3348721628 = sg-67652003
你可以看到,通過建立資源,我們收集了很多資訊。這些值可以被引用以配置其他資源和輸出,這些將會在入門指南後面的部分講到。
準備
我們在這一節建立的EC2是基於已給出的AMI,但是沒有安裝額外的軟體。如果你在執行一個基於映象的的架構
(或許是使用Packer 建立的映象),那麼這就是你所需要的。
不論如何,許多基礎設施都需要一些不同程度的初始化或者軟體準備階段。做到這些,Terraform支援provisioner這將會在稍後的入門指南中講到。
下一步
恭喜你已經使用Terraform構建了你的第一個基礎設施。你已經看到了配置語法,一個基本的執行計劃例項,並且理解了狀態檔案。
下一步,我們將繼續變更和銷燬基礎設施 。
<!-- more -->
<!--//
硬啃官方文件產物,若有不妥之處,歡迎指正,請以官方文件為準!
//-->