Terraform
Terraform 是什么
Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 “Write, Plan, and create Infrastructure as Code”, 基础架构即代码。
通俗的讲,Terraform是一个运行在客户端的开源的用于资源编排的自动化运维工具。通过代码的形式将所要管理的资源定义在模板中,解析并执行模板来自动化完成资源的创建、变更和管理,进而达到自动化运维的目标。
Terraform是由Hashicorp公司推出的一个开源项目,使用Go语言编写。目前主流的云厂商如AWS、GCP、腾讯云、阿里云等都支持使用Terraform进行云上资源的自动编排管理。
Terraform核心功能
基础设施即代码(IaC, Infrastructure as Code)
Terraform 基于一种特定的配置语言(HCL, Hashicorp Configuration Language)来描述基础设施资源。由此,可以像对待任何其他代码一样,实现对所描述的解决方案或者基础架构的版本控制和管理。
执行计划(Execution Plans)
Terraform 在执行模板前,可以执行plan步骤(terraform plan)解析模板生成一个可执行的计划,展示当前模板所要创建或变更的资源及其属性。操作人员可以预览这个计划j进行检查,以免操作真正的基础结构时发生一些超预期的问题。
资源图(Resource Graph)
Terraform 会根据模板中的定义,构建所有资源的图形,并且以并行的方式创建和修改任何没有相互依赖的资源。因此,Terraform 可以高效地构建基础设施,操作人员也可以通过图表深入地解其基础设施中的依赖关系。
自动化变更(Change Automation)
当模板中定义的资源内容发生变更时,Terraform 都会基于新的资源拓扑图将变更的内容plan 出来,从而避免了人为操作带来的错误。
配置介绍
Terraform使用文本文件来描述基础设施和设置变量。这些文件称为Terraform 配置。配置文件的格式可以有两种格式:Terraform格式和JSON。
Terraform格式更加人性化,支持注释,推荐使用该格式。Terraform格式后缀名以.tf结尾,JSON格式后缀名以.tf.json结尾。
在调用加载Terraform配置的任何命令时,Terraform将按字母顺序加载指定目录中的所有配置文件。加载文件的后缀名必须是.tf或.tf.json。否则,文件将被忽略。
Terraform配置是声明式的,因此对其他资源和变量的引用不依赖于它们定义的顺序。
配置语法
Terraform配置的语法称为HashiCorp配置语言(HCL)。示例如下:
1 | provider "tencentcloud" { |
资源
基础设施和服务统称为资源,如私有网络、子网、物理机、虚拟机、镜像、NAT网关等等都可以称之为资源,也是开发和运维人员经常要打交道要维护的东西。Terraform把资源大致分为resurce和data source。
resource
1 | resource "资源类名" "映射到本地的唯一资源名" { |
这类资源一般是抽象的真正的云服务资源,支持增删改,如私有网络、NAT网关、虚拟机实例。
1 | resource "tencentcloud_instance" "web" { |
data source
1 | data "资源类名" "映射到本地的唯一资源名" { |
这类资源一般是固定的一些可读资源,如可用区列表、镜像列表。大部分情况下,resource资源也会封装一个data source方法,用于资源查询。
1 | data "tencentcloud_images" "centos" { |
使用演示
环境
安装Terraform
1 | $ terraform -h |
获取 AccessKey/SecretKey
腾讯云控制台 访问管理->访问秘钥->API秘钥管理,查看或新建秘钥,得到SecretId
和SecretKey
创建配置文件
Terraform通过Provider来扩展对新的基础架构的支持,几乎支持所有的云服务平台,tencentcloud只是Terraform内建 Providers 中的一种。
1 | provider "tencentcloud" { |
tencentcloud凭据配置支持静态凭据和环境变量两种方式。
静态凭据
1
2
3
4
5provider "tencentcloud" {
secret_id = "your_secret_id"
secret_key = "your_secret_key"
region = "ap-guangzhou"
}
环境变量
1
2
3
4
5$ export TENCENTCLOUD_SECRET_ID="your_fancy_accesskey"
$ export TENCENTCLOUD_SECRET_KEY="your_fancy_secretkey"
$ export TENCENTCLOUD_REGION="ap-guangzhou"
provider "tencentcloud" {}
资源文件
1 | # cvm.tf |
初始化工作目录
1 | $ terraform init |
plan预览
1 | $ terraform plan |
资源apply
1 | $ terraform apply |

查看状态
1 | $ terraform show |
查看依赖图
1 | terraform graph | dot -Tsvg > graph.svg |

资源销毁
1 | $ terraform destroy |
扩展
常见规范
Terraform 运行时会读取工作目录中所有的 .tf, .tfvars文件,不必把所有的东西都写在单个文件中去,应按职责分列在不同的文件中,例如
1 | provider.tf ### provider 配置 |
使用ssh key
1 | variable "tf_ssh_key" { |
AWS
provider
AWS Provider被用来与AWS支持的许多资源进行交互。在使用该提供程序之前, 需要使用适当的Credentials进行配置。https://www.terraform.io/docs/providers/aws/index.html
静态凭据
1
2
3
4
5provider "aws" {
region = "us-west-2"
access_key = "anaccesskey"
secret_key = "ansecret_key"
}环境变量
1
2
3
4
5provider "aws" {}
$ export AWS_ACCESS_KEY_ID="anaccesskey"
$ export AWS_SECRET_ACCESS_KEY="ansecret_key"
$ export AWS_DEFAULT_REGION="us-west-2"共享凭据文件
1
2
3
4
5provider "aws" {
region = "us-west-2"
shared_credentials_file = "/USers/tf_user/.aws/creds"
profile = "customprofile"
}aws 共享凭据文件,默认路径为
1
2OSX and Linux: $HOME/.aws/credentials
Windows: "%USERPROFILE%\.aws\credentials"