目前为了更快的开发产品,现在很多项目都对基础设施进行了代码化 (Infrastructure as Code)。
现在的项目中使用 Terraform 对基础设施进行了代码化,分享下 Terraform 的使用。
在使用 Terraform 之前,基本上是在 AWS 管理画面进行操作或者用 AWS CLI 写一些脚本来构建。
主要有以下一些问题
用 Terraform 可以比较好的解决以上问题,以下是用 Terraform 修改的流程
好处是修改流程类似 app 修改的流程,大家很容易上手。
操作时间短,所有的更改记录都进行了版本管理,容易对修改进行审查。
使用了什么资源,看代码一目了然。
开发了 Vagrant 的hashicorp 公司开发的用代码来管理基础设施的一个工具,支持绝大多数的平台。查看支持的平台
我觉的最大的优点是学习成本低,非常简单。
只需要了解三个概念就完全可以进行开发了。
开发文档可以在这里查看,很多 sample,很多时候稍微修改一下就可以用
对应于 aws 的 resouce
# 建立VPC
resource "aws_vpc" "app" {
cidr_block = "10.1.0.0/16"
assign_generated_ipv6_cidr_block = "true"
tags {
Name = "sample-vpc"
}
}
# 建立ecs cluster
resource "aws_ecs_cluster" "foo" {
name = "white-hart"
}
有时候需要从 AWS 中获取信息的时候可以使用 data
比如获取目前操作中的 AWS 账号信息
data "aws_caller_identity" "current" {}
# 定义变量
variable "region" {
default = "sample-region"
}
variable "access_key" {}
variable "secret_key" {}
# 使用变量
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
Terraform 会执行当前文件夹下面的所有.tf 文件
预执行,不会对 AWS 作出任何改动,可以确认下下有哪些改变
$ terraform plan
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ module.shared_fluentd.aws_vpc.app
id: <computed>
arn: <computed>
assign_generated_ipv6_cidr_block: "true"
cidr_block: "10.1.0.0/16"
tags.Name: "sample-vpc"
Plan: 1 to add, 0 to change, 0 to destroy.
实际执行,这里会再次输出有哪些改变,然后输入 yes 就会在 AWS 上面进行构建
$ terraform apply
比如要同时创建 sandbox 和 production 的 fluentd 服务器,基本都是一样的,只是一些参数不同。
这时候就可以使用 module 来归类类似的代码,然后传入变量来构建。
比如要同时创建 sandbox 和 production 的的 fluentd 服务器。
# 文件结构
terraform
├── modules
│ ├── fluentd
│ │ ├── main.tf
├── production_instance.tf
├── sandbox_instance.tf
# terraform/sandbox_instance.tf
module "sandbox_fluentd" {
source = "./modules/fluentd"
vpc_id = "your sandbox vpc id"
}
# terraform/production_instance.tf
module "production_fluentd" {
source = "./modules/fluentd"
vpc_id = "your production vpc id"
# 其他的变量
}
这时候可以指定执行的对象来缩小执行范围。
terraform plan -target module.shared_fluentd
terraform plan -target module.production_fluentd
写在一个文件里面虽然也可以执行,但是内容多的时候,阅读起来不太容易,这个时候可以分成几个文件。
比如按照 aws resource,变量,data 来分类。
├── fluentd
│ ├── cloud_watch.tf
│ ├── data.tf
│ ├── ecs.tf
│ ├── security_group.tf
│ ├── task_role.tf
│ └── variable.tf
用的很少,基本不用指定,只有必须当某个操作依赖于另外一个操作时才用。
比如在使用 AWS Service Discovery 的时候,必须当 aws_service_discovery 构建以后,才可以获得被创建的 DNS,这个时候就可以使用 depends_on
data "aws_route53_zone" "fluentd" {
name = "${aws_service_discovery_public_dns_namespace.fluentd.name}"
depends_on = ["aws_service_discovery_public_dns_namespace.fluentd"]
}
官方没有提供这个功能,有人做了个 GEM,用了一下,AWS 基本都可以自动生成代码
如果你已经构建好了环境,可以用这个来自动生成代码,避免打字手酸。
简单介绍了 Terraform 的优点和基本使用方法。
我觉的它最大的优点是学习成本低,使用方便。
如果你想简单高效的构建你的基础设施,可以考虑使用 terraform。