认识
- Terraform 是一个 IT 基础架构自动化编排工具,它的口号是 “Write, Plan, and create Infrastructure as Code”, 基础架构即代码。
- 基础设施即代码,声明式的代码工具
- 通过配置语言,实现可读的自动化部署
- 通过不同的配置语言适配不同的运营商
Overview
-
Terraform使用其自己的配置语言,旨在允许对基础结构进行简洁的描述。
-
Terraform语言是声明性的,描述的是预期目标,而不是达到目标的步骤。
-
Terraform语言的主要目的是声明资源。 所有其他语言功能的存在只是为了使资源的定义更加灵活和方便。
-
可以将一组资源收集到一个模块中,从而创建更大的配置单元。 资源描述单个基础结构对象,而模块可能描述一组对象以及它们之间的必要关系,以便创建更高级别的系统。
-
Terraform配置由一个开始评估的根模块以及一个模块调用另一个模块时创建的子模块树组成。
使用
参数、代码块以及表达式
Terraform语言的语法仅包含一些基本元素:
resource "vsphere_custom_attribute" "attribute" {
name = "terraform-test-attribute"
managed_object_type = "VirtualMachine"
}
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
BLOCK
是其他内容的容器,通常代表某种对象(例如资源)的配置。 块具有块类型,可以具有零个或多个标签,并且具有包含任意数量的参数和嵌套块的主体。 Terraform的大多数功能由配置文件中的顶级块控制。Argument
为名称分配一个值。 参数在块内使用。EXPRESSION
可以通过字面量或引用并组合其他值来表示一个值。 表达式作为参数的值使用,或者在其他表达式中作为值使用。
Terraform 常用命令
命令 | 含义 | 类型 |
---|---|---|
terraform plan | 资源的预览 | 资源管理 |
terraform apply | 资源的新建和变更 | 资源管理 |
terraform show | 资源的展示 | 资源管理 |
terraform destroy | 资源的释放 | 资源管理 |
terraform import | 资源的导入 | 资源管理 |
terraform taint | 标记资源为被污染 | 资源管理 |
terraform untaint | 取消被污染标记 | 资源管理 |
terraform output | 打印出参及其值 | 资源管理 |
terraform state list | 列出当前state中的所有资源 | 状态管理 |
terraform state show | 展示某一个资源的属性 | 状态管理 |
terraform state pull | 获取当前state内容并展示 | 状态管理 |
terraform state rm | 移除特定的资源 | 状态管理 |
terraform state mv | 变更特定资源的存放地址 | 状态管理 |
terraform init | 初始化加载模块 | 其他 |
terraform validate | 对tf脚本语法进行检查 | 其他 |
使用步骤
- 使用 Terraform 的常规流程:
- 创建一个 terrafom 项目,编写所需要的 tf 脚本。
- 在命令行下运行
terraform init
进行初始化。 - 运行 Terraform 管理命令,例如
terraform apply
对云端IT资源进行操作。 - 根据需求,修改配置文件,重新执行第三步。
- Terraform 项目执行的过程发生了什么?
- 执行
terraform init
初始化项目,Terraform 会在项目根目录下加载所有的*.tf
文件,读取配置信息,生成一个.terraform
目录,自动下载与对应的远端资源进行通行的必要插件。 - 在命令行下执行
terraform apply
命令,terraform 会根据 tf脚本对远程IT资源进行更新或者创建,IT资源的状态信息会保存在terraform.tfstate
文件中,这是一个自动创建的json
文件,可以理解为一个缓存文件。每次通过 terraform 操作远端时,会读取该文件的状态信息进行对比,然后操作,再将状态信息写回到terraform.tfstate
中。
- 执行
代码组织
-
Terraform语言使用以.tf文件扩展名命名的配置文件。 还有一种基于JSON的语言变体,其文件扩展名为.tf.json。
-
配置文件必须始终使用UTF-8编码,并且按照惯例,通常使用Unix样式的行尾(LF)而不是Windows样式的行尾(CRLF)进行维护,尽管两者均被接受。
-
模块是.tf或.tf.json文件的集合,这些文件保存在一个目录中。 运行Terraform时,根模块是根据当前工作目录中的配置文件构建的,该模块可以引用其他目录中的子模块,而这些子模块又可以引用其他模块等。
-
最简单的Terraform配置是仅包含单个.tf文件的单个根模块。 随着添加更多资源,配置可以逐渐增长,方法是在根模块中创建新的配置文件,或者将资源集组织到子模块中。
文件说明
Terraform执行时会读取工作目录中的.tf/.tfvars文件,所以可以按照不同的职责将参数放入不同的文件中。
文件名 | 说明 |
---|---|
provider.tf | provider配置 |
terraform.tfvars | 配置provider要用的变量 |
varable.tf | 通用变量 |
resource.tf | 资源定义 |
data.tf | 包文件定义 |
output.tf | 输出 |
provider
- 在 Terraform 中负责管理资源的生命周期:创建、读取、更新、删除。比如访问 AWS 中的资源需要使用 AWS 的 provider,访问 Azure 中的资源需要使用 Azure 的 provider。
resource
- 是基础设施的一个组件。它可能是一些低级组件,例如物理服务器、虚拟机或容器。也可以是更高级别的组件,如电子邮件提供程序、DNS记录或数据库提供程序。
配置顺序
因为Terraform的配置语言是声明性的,所以块的顺序通常并不重要。 (资源中预配器块的顺序是影响块顺序的唯一主要功能。)
Terraform根据配置中定义的资源之间的关系自动以正确的顺序处理资源,因此您可以采用对基础架构有意义的任何方式将资源组织到源文件中。