Terraform入门 - 2. 构建基础设施

感谢光顾,简书停更,迁移至sengmentfault: https://segmentfault.com/a/1190000018145618

原文地址:https://www.terraform.io/intro/getting-started/build.html

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_HERESECRET_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构建了你的第一个基础设施。你已经看到了配置语法,一个基本的执行计划实例,并且理解了状态文件。

下一步,我们将继续变更和销毁基础设施

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 1. 前言 目前IT设备对于大多数企业公司来说是必不可少的基础设施,由于云计算的按需付费,便捷配置计算资源(资源包...
    liewuweifeng阅读 8,939评论 0 6
  • 利用亚马逊AWS搭建个人服务器 注册 注册地址:https://portal.aws.amazon.com/bil...
    恪晨阅读 20,081评论 0 19
  • 人相处规律跳不出8个字:缘聚则成,缘尽则灭!
    湾湾yunyi阅读 129评论 0 0
  • 感赏儿子今早精神不错 今天和儿子聊起周末作业拖到周日晚再做好不好,他说不好,我说我预计了你做作业要4小时,你认为安...
    辉_0495阅读 124评论 2 1
  • 缓缓的季节,没有寒冷,没有燥热。 沿途跑步,风景很美,
    尖娃阅读 262评论 0 0