从本文开始,将持续推出关于百度云Terraform的实战介绍,本系列文章旨在帮助用户熟悉并快速上手Terraform的使用,从而让用户可以更高效便捷的管理云上资源的生命周期。
Terraform 是一个面向云资源的基础架构自动化编排工具,可管理的基础设施不仅包含计算实例,存储,网络等底层组件,也包含DNS条目,SaaS服务等高级组件;几乎支持所有的主流云厂商,同时也支持私有云的资源编排,适合多云对接它的口号是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。具体的说就是可以用代码来管理维护 IT 资源,并且在真正运行之前可以看到执行计划(即干运行-dryrun)。由于状态保存到文件中,因此能够离线方式查看资源情况 。Terraform 配置的状态除了能够保存在本地文件中,也可以保存到 Consul, S3, azure, http, swift 等处。
Terraform 官方的定义如下:
Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions.
Configuration files describe to Terraform the components needed to run a single application or your entire datacenter. Terraform generates an execution plan describing what it will do to reach the desired state, and then executes it to build the described infrastructure. As the configuration changes, Terraform is able to determine what changed and create incremental execution plans which can be applied.
The infrastructure Terraform can manage includes low-level components such as compute instances, storage, and networking, as well as high-level components such as DNS entries, SaaS features, etc.
基于一种特定的配置语言(HCL, Hashicorp Configuration Language)来描述基础设施资源,使对待云资源像对待代码一样,进行部署、管理、版本控制;可以将基础设施以一种领域特定语言描述出来,消除了在基础设施自动化时描述语义上的歧义(虽然不同厂商的资源,语义上是不同的),实例如下:
terraform {
required_providers {
baiducloud = {
source = "baidubce/baiducloud"
version = "1.12.0"
}
}
}
provider "baiducloud" {
access_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
region = "bj"
}
resource "baiducloud_instance" "terra-server" {
count = var.num
image_id = "m-iRhVlGGb"
name = "terratest-${format(count.index + 1)}"
availability_zone = "cn-bj-d"
cpu_count = "2"
memory_capacity_in_gb = "8"
admin_pass = "******"
billing = {
payment_timing = "Postpaid"
}
action = "stop"
}Provider:基础设施管理组件
Terraform仅仅相当于一个构建工具,对于所有的云平台都会开放对应的接口,而这个接口我们就可以叫它“提供者”(Providers),provider是与Open API直接交互的后端驱动,通过Provider来完成对基础设施资源的管理。不同的基础设施提供商都需要提供一个Provider来实现对自家基础设施的统一管理,目前Terraform目前支持超过160多种的providers。
运行Terraform时,会根据用户模板中指定的provider或者resource/datasource的标志自动的下载模板所用到的所有provider,并将其放在执行目录下的一个隐藏目录.terraform 下:通常Provider都包含两个主要元素 resource 和 data source(Resource:一个具体的资源或者服务,比如BCC实例,每个特定的resource包含了若干可用于描述对应资源或者服务的属性字段;Data Sources:提供资源查询的功能,支持模糊匹配)。每一个云厂商的实现(Provider)都是一个独立的进程,可以进程隔离云厂商的实现,防止共享内存带来的安全性问题;同时核心与插件分离,保证了核心简单可靠。
执行计划(Execution Plans)
Terraform 在执行模板前,运行 terraform plan 命令会先通过解析模板生成一个可执行的计划,这个计划展示了当前模板所要创建或变更的资源及其属性。操作人员可以预览这个计划,在确认无误后执行 terraform apply 命令,即可完成对所定义资源的快速创建和变更,以免发生一些超预期的问题。
自动化变更(Change Automation)
不论多复杂的资源,当模板中定义的资源内容发生变更时,Terraform 都会基于新的资源拓扑图将变更的内容plan 出来,在确认无误后,只需一个命令即可完成数个变更操作,避免了人为操作带来的错误。
State:
资源状态保存在terraform.tfstate 文件中;如果该文件损坏,Terraform 将认为已创建的资源被破坏或者需要重建。
执行Terraform命令时,Terraform将会利用该文件与当前目录下的模板做Diff比较,如果出现不一致,Terraform将按照模板中的定义重新创建或者修改已有资源,直到没有Diff。
Backend:
Terraform 在创建完资源后,会将资源的属性存放在一个 state 文件中,这个文件可以存放在本地也可以存放在远端。存放 state 文件的载体就是 Backend 。
Backend 分为本地(local)和远端(remote)两类,默认为本地。
当多人协作时,可存于远端的存储服务上,远端类型支持10余种,如阿里的oss或者consul,来实现 state 文件和模板代码的分离。
terraform init
介绍:
这个命令会首先去安装对应provider需要的那些配置和数据,也就相当于是执行前的准备工作,所有下载下来的配置,会保存在工作目录下的一个隐藏的目录中。
用法:
terraform init [options] [DIR]
常用参数:
-input=true:是否在取不到输入变量值时提示用户输入
-lock=false:是否在运行时锁定状态文件
-lock-timeout=:尝试获取状态文件锁时的超时时间,默认为0,意为一旦发现锁已被其他进程获取立即报错
-no-color:禁止输出中包含颜色
-upgrade:是否升级模块代码以及插件
terraform plan
介绍:
提前演练,并没有真正执行,会列出所有即将创建和即将删除的资源的信息,该命令可以方便地审查状态迁移的所有细节而不会实际更改现有资源以及状态文件
用法:
terraform plan [options] [dir]
常用参数:
-destroy:生成销毁所有资源的计划
-input=true:在取不到值的情况下是否提示用户给定输入变量值
-out=path:将变更计划保存到指定路径下的文件中,随后我们可以使用terraform apply执行该计划
-parallelism-n:限制Terraform遍历图的最大并行度,默认值为10
-refresh=true:计算变更前先执行refresh
-state=path:状态文件的位置,默认为"terraform.tfstate"。如果启用了远程Backend则该参数设置无效
-target=resource:目标资源的地址,该参数可反复声明,用以对基础设施进行部分更新
terraform apply
介绍:
apply命令被用来生成执行计划(可选)并执行之,使得基础设施资源状态符合代码的描述。真正的去执行文件,apply会扫描当前目录下的代码文件,并执行相应的变更
用法:
terraform apply [options] [dir-or-plan]
常用参数:
-input=true:在无法获取输入变量的值是是否提示用户输入
-auto-approve:跳过交互确认步骤,直接执行变更
-parallelism=n:限制Terraform遍历图时的最大并行度,默认值为10(考试高频考点)
-refresh=true:指定变更计划及执行变更前是否先查询记录的基础设施对象现在的状态以刷新状态文件。如果命令行指定了要执行的变更计划文件,该参数设置无效
-state=path:保存状态文件的路径,默认值是"terraform.tfstate"。如果使用了远程Backend该参数设置无效。该参数不影响其他命令,比如执行init时会找不到它设置的状态文件。如果要使得所有命令都可以使用同一个特定位置的状态文件
-var 'foo=bar':设置一组输入变量的值。该参数可以反复设置以传入多个输入变量值
terraform destroy
介绍:
真正的去删除资源,可以用来销毁并回收所有Terraform管理的基础设施资源。
用法:
terraform destroy [options] [dir]
常用参数:
-auto-approve:参数被设置为true,那么将不会征求用户确认直接销毁。
-target:参数指定了某项资源,那么不但会销毁该资源,同时也会销毁一切依赖于该资源的资源。我们会在随后介绍plan命令时详细介绍。
terraform show‘
介绍
显示我们 .tfstate 结尾文件中的内容的。从状态文件或是变更计划文件中打印人类可读的输出信息
用法
terraform show [options] [path]
常用参数
-no-color:与apply类似,不再赘述
-json:以JSON格式输出
优势:
通过git管理资源
借助IaC的特性,可以像管理代码一样管理云资源,好处如下:
更轻量的管理方式
模板特性,便于多个环境的快速搭建
资源变更审批→CR
资源伸缩→代码变更/回滚
声明式VS命令式
声明式编程可以直接指定资源的最终状态,由工具(terraform)本身保证如何实现该状态
相比命令式编程,有着精简的代码逻辑,减少了API调用等代码逻辑
不需要额外的状态轮训和事务控制
扩展性
多云扩展更加容易,下载新的provider+编写tf,即可创建新的云厂商资源 可通过更新provider的版本,直接使用云厂商新的OpenAPI特性
工具部署方便
相比puppet、chef等工具,terraform无agent和master,仅需一个client文件并下载对应的provider即可使用terraform
不足
不适用对云资源的运维操作管理
terraform本身更适合基础设施的构建,不适合日常运维工作,比如重启、重装这样的操作
存量处理较复杂
Terraform最好在刚刚开始上云的时候就用起来,主要原因在于Terraform是有状态的,当已经运行了很多云上的服务之后,把这些服务的配置导入Terraform较复杂,而且需要很多手动配置来保证本地的状态与云上的状态是一致的
简介: baiducloud provider是baidu openAPI的逻辑抽象,可以通过标准化的形式进行扩展,以支持私有云和更多云厂商 图示:

Terraform Registry 入口:(https://registry.terraform.io/providers/baidubce/baiducloud/latest/docs)
社区源码地址:(https://github.com/baidubce/terraform-provider-baiducloud)