乐趣区

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

退出移动版