感謝光顧,簡書停更诉位,遷移至sengmentfault: https://segmentfault.com/a/1190000018145618
原文地址:https://www.terraform.io/intro/getting-started/build.html
Terraform安裝完成以后,我們直接開始創(chuàng)建一些基礎(chǔ)設(shè)施逊彭。
我們在AWS上創(chuàng)建一些基礎(chǔ)設(shè)施來開始入門指南瓦戚,因為它最流行且通常可以被理解摸吠,但是Terraform可以管理許多provider空凸,包含在單個配置文件中管理多個provider。在使用案例中有一些例子寸痢。
如果你沒有AWS賬號呀洲,就創(chuàng)建一個。在入門指南中啼止,我們將只會用AWS免費試用的資源道逗,也就是說它是免費的。如果你已經(jīng)有一個AWS賬號献烦,你可能要充一些錢憔辫,但是最多不會超過幾美元。
警告仿荆!如果你使用的不是一個AWS免費試用賬號贰您,你可能需要充值來執(zhí)行這些例子。你最多需要充值幾美元拢操,但是我們不對任何可能產(chǎn)生的費用負(fù)責(zé)锦亦。
配置
Terraform中用來描述基礎(chǔ)設(shè)施的的文件被叫做Terraform配置文件。現(xiàn)在我們將寫下我們第一個配置文件來啟動一個AWS的EC2實例令境。
配置文件的文檔在這里杠园。配置文件也可以是一給json文件,但是我們建議只在機(jī)器生成配置文件時使用json格式舔庶。
整個配置文件內(nèi)容如下所示抛蚁。我們將在隨后的每一步逐步講解陈醒。將下面內(nèi)容保存到一個名為example.tf
的文件中。確認(rèn)在你的目錄中沒有其他*.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賬戶,將訪問默認(rèn)VPC肚逸。EC2經(jīng)典網(wǎng)絡(luò)用戶請為
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
膝晾,可從此頁面獲取。我們現(xiàn)在將他們硬編碼务冕,但是在入門指南后面的將會將他們提取到變量里血当。
注意:如果你僅僅遺漏了AWS憑證,Terraform將自動從已保存的API憑證中搜索(如:在~/.aws/credentials中)禀忆〈跬牵或者IAM實例配置文件憑據(jù)。對于將文件簽入源代碼管理或者有多個管理員的情況油湖,該選擇要干凈很多巍扛。到這里查看細(xì)節(jié)。將憑據(jù)信息遺留到配置文件以外乏德,使你可以將憑據(jù)信息放在源代碼管理之外撤奸,并且也可以為不同的用戶使用不同的IAM憑據(jù)而不需要修改配置文件。
這是一個完整的可執(zhí)行的Terraform配置文件喊括。一般結(jié)構(gòu)應(yīng)該直觀并且直接胧瓜。
provider
塊用于指定provider名稱,在我們的實例中叫"aws"郑什。provider
負(fù)責(zé)創(chuàng)建和管理資源府喳。如果一個Terraform配置文件由多個provider組成,可以有多個provider塊蘑拯,這是常見的情況钝满。
resource
塊定一個基礎(chǔ)設(shè)施中存在的資源。一個資源可能是物理組件申窘,如:EC2實例弯蚜,或也可以是一個邏輯資源比如Heroku應(yīng)用。
resource
塊開始前有兩個字符串:資源類型和資源名稱剃法。在我們的實例中資源類型是"aws_instance"碎捺,資源名為"example"。資源類型的前綴映射到provider
。在我們的實例中收厨,"aws_instance"自動告知你Terraform被"aws"provider管理晋柱。
resource
塊內(nèi)部是該資源的配置。它獨立于每個資源provider并且在provider參考完全列出來诵叁。對于我們的EC2實例雁竞,我們?yōu)閡buntu指定一個AMI,然后請求一個"t2.micro"的實例因為我們有免費資格黎休。
安裝
為一個新配置文件或從版本控制工具中檢出的已存在的配置執(zhí)行的第一個命令是terraform init
浓领,它將初始化各種本地配置和數(shù)據(jù)為后面的命令使用玉凯。
Terraform使用基于插件的結(jié)構(gòu)來支持眾多的基礎(chǔ)設(shè)施和服務(wù)提供商势腮。從Terraform"0.10.0"起,每個提供商有他們自己封裝和發(fā)型的二進(jìn)制文件漫仆,從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插件與其他薄記文件一起被下載安裝到當(dāng)前目錄子目錄署照。
輸出信息會顯示所安裝插件的版本,以及建議在配置文件中指定版本以確保terraform init
在未來安裝一個兼容的版本吗浩。對于后面步驟來說這一步不是必須的建芙,因為該配置文件后面將會被廢棄。
應(yīng)用變更
注意:本指南中列出的命令適用于terraform0.11及以上版本懂扼。更早版本需要在應(yīng)用前使用
terraform plan
命令查看執(zhí)行計劃禁荸。使用terraform version
命令確認(rèn)你當(dāng)前terraform版本。
在當(dāng)前目錄中你創(chuàng)建的example.tf
為例阀湿,執(zhí)行terraform apply
赶熟。你將看到以下類似輸出,我們刪節(jié)了部分輸出以節(jié)省空間:
$ 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>"
該輸出顯示執(zhí)行計劃陷嘴,描述terraform將根據(jù)配置文件執(zhí)行那些動作來改變基礎(chǔ)設(shè)施映砖。輸出格式與工具輸出的diff產(chǎn)生的格式類似,比如git灾挨。輸出內(nèi)容在 aws_instance.example
有個 +
意味著Terraform將會創(chuàng)建該資源邑退。在那些之下,顯示將會被設(shè)置的屬性劳澄。當(dāng)值為<computed>
時瓜饥,意味著資源被創(chuàng)建后才能知道。
terraform apply
執(zhí)行失敗報錯時浴骂,讀取錯誤信息并修復(fù)所報錯誤乓土。在這一步,它可能是配置文件中的語法錯誤。
如果計劃被成功創(chuàng)建趣苏,Terraform將在執(zhí)行前暫停并等待確認(rèn)狡相。如果計劃中有任何不對或危險信息,在這里終止很安全食磕,它不會對你的基礎(chǔ)設(shè)施做任何改變尽棕。這是如果計劃看起來可接受,在確認(rèn)終端輸入yes
執(zhí)行彬伦。
執(zhí)行該計劃會花幾分鐘時間滔悉,直到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執(zhí)行完成,你可以到EC2終端查看創(chuàng)建號的EC2實例单绑。(確保你在查看與配置文件中相同的可用區(qū)回官!)Terraform也會寫一些數(shù)據(jù)到terraform.tfstate
。該狀態(tài)文件極其重要搂橙;它追蹤創(chuàng)建的資源ID歉提,所以Terraform知道它管理的是什么資源。該文件必須被保存并分發(fā)給可能使用terraform的任何人区转。通常建議在使用Terraform時設(shè)置遠(yuǎn)程狀態(tài)苔巨,來自動分享狀態(tài),但是針對像入門指南這樣簡單的環(huán)境這不是必須的废离。
你可以使用terraform show
檢查當(dāng)前狀態(tài):
$ 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
你可以看到侄泽,通過創(chuàng)建資源,我們收集了很多信息蜻韭。這些值可以被引用以配置其他資源和輸出悼尾,這些將會在入門指南后面的部分講到。
準(zhǔn)備
我們在這一節(jié)創(chuàng)建的EC2是基于已給出的AMI湘捎,但是沒有安裝額外的軟件诀豁。如果你在運行一個基于鏡像的的架構(gòu)
(或許是使用Packer創(chuàng)建的鏡像),那么這就是你所需要的窥妇。
不論如何舷胜,許多基礎(chǔ)設(shè)施都需要一些不同程度的初始化或者軟件準(zhǔn)備階段。做到這些活翩,Terraform支持provisioner這將會在稍后的入門指南中講到烹骨。
下一步
恭喜你已經(jīng)使用Terraform構(gòu)建了你的第一個基礎(chǔ)設(shè)施。你已經(jīng)看到了配置語法材泄,一個基本的執(zhí)行計劃實例沮焕,并且理解了狀態(tài)文件。
下一步拉宗,我們將繼續(xù)變更和銷毀基礎(chǔ)設(shè)施峦树。