在使用Terraform的过程中,通常会接触到很多名词,如Configuration、Provider、Resource、Datasource、State、Backend、Provisioner等,本文给大家简单介绍这些概念。
Configuration:基础设施的定义和描述
“基础设施即代码(Infrastructure as Code)”,这里的Code是对基础设施资源的代码定义和描述,也就是通过代码表达我们想要管理的资源。对所有资源的代码描述都需要定义在一个以tf
结尾的文件用于Terraform加载和解析,这个文件我们称之为“Terraform模板”或者“Configuration”。
- Resource:资源,指新创建的资源。
- Data Source:数据资源,查询已有的资源信息并获取其属性。
通常Provider包含两个主要元素:Resource和Data Source。通过资源类型索引可以查找当前Terraform Alibaba Cloud Provider支持的所有Resource和Data Source。
Provider:基础设施管理组件
Terraform通常用于对云上基础设施如虚拟机、网络资源、容器资源、存储资源等的创建、更新、查看、删除等管理动作,也可以实现对物理机的管理,如安装软件、部署应用等。
Provider是一个与OpenAPI直接交互的后端驱动,Terraform就是通过Provider来完成对基础设施资源的管理。不同的基础设施提供商都需要提供一个Provider来实现对自家基础设施的统一管理。Terraform目前支持超过160多种的Providers。大多数云平台的Provider插件均已经实现了,阿里云对应的Provider为alicloud
。
- Resource:资源,指新创建的资源。
- Data Source:数据资源,查询已有的资源信息并获取其属性。
Resource:基础设施资源和服务的管理
在Terraform中,一个具体的资源或者服务称为一个Resource,比如一台ECS实例、一个VPC网络、一个SLB实例。每个特定的Resource包含了若干可用于描述对应资源或者服务的属性字段,通过这些字段来定义一个完整的资源或者服务,比如实例的名称(name)、实例的规格(instance_type)、VPC或者vSwitch的网段(cidr_block)等。
定义一个Resource的语法非常简单,通过resource
关键字声明。
Data Source:基础设施资源和服务的查询
对资源的查询是运维人员或者系统最常使用的操作,比如,查看某个Region下有哪些可用区、某个可用区下有哪些实例规格、每个Region下有哪些镜像、当前账号下有多少机器等,通过对资源及其资源属性的查询可以帮助和引导开发者进行下一步操作。除此之外,在编写Terraform模板时,Resource使用的参数有些是固定的静态变量,但有些情况下可能参数变量不确定或者参数可能随时变化。比如我们创建ECS实例时,通常需要指定我们自己的镜像ID和实例规格,但我们的模板可能随时更新,如果在代码中指定ImageID和Instance,则一旦我们更新镜像模板就需要重新修改代码。
在Terraform中,Data Source提供的就是一个查询资源的功能。不同于Resource使用的部分参数是静态变量,每个Data Source实现对一个资源的动态查询,Data Source的结果可以认为是动态变量,只有在运行时才能知道变量的值。
Data Sources通过data
关键字声明。
State:保存资源关系及其属性文件的数据库
Terraform创建和管理的所有资源都会保存到自己的数据库上,这个数据库不是通常意义上的数据库(MySQL、Redis等),而是一个文件名为terraform.tfstate
的文件,在Terraform中称之为state,默认存放在执行Terraform命令的本地目录下。这个 state
文件非常重要,如果该文件损坏,Terraform将认为已创建的资源被破坏或者需要重建(实际的云资源通常不会受到影响),因为在执行Terraform命令时,Terraform将会利用该文件与当前目录下的模板做Diff比较,如果出现不一致,Terraform将按照模板中的定义重新创建或者修改已有资源,直到没有Diff,因此可以认为Terraform是一个有状态服务。
当涉及多人协作时不仅需要拷贝模板,还需要拷贝 state
文件,这无形中增加了维护成本。幸运的是,目前Terraform支持把 state
文件放到远端的存储服务OSS
上或者consul
上,来实现 state
文件拷贝。
Backend:存放State文件的载体
正如上节提到,Terraform在创建完资源后,会将资源的属性存放在一个 state
文件中,这个文件可以存放在本地也可以存放在远端。存放 state
文件的载体就是Backend。
Backend分为本地(local)和远端(remote)两类,默认为本地。远端的类型也非常多,目前官方网站提供的有13种,并且阿里云的OSS就位列其中。使用远端的Backend既可以降低多人协作时对 state
的维护成本,又可以存放敏感数据保证数据安全性。
Provisioner:在机器上执行操作的组件
Provisioner通常用来在本地机器或者远程主机登录并执行相关操作,如Provisioner用 local-exec
用来执行本地的命令,用chef
在远程机器安装、配置和执行Chef client,用remote-exec
登录远程主机并在其上执行命令。
Provisioner通常跟Provider配合使用,Provider用来创建和管理资源,Provisioner在创建好的机器上执行各种操作。
更多关于Terraform的关键概念,请参见玩转阿里云 Terraform(二):Terraform 的几个关键概念。