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 -->
<!--//
硬啃官方文档产物,若有不妥之处,欢迎指正,请以官方文档为准!
//-->