Terraform的几个关键概念

2019-08-23 10:32:00 浏览数 (1)

Terraform是由HashiCorp公司在2014年左右推出的开源工具, 目前几乎所有的主流云服务商都支持Terraform,包括腾讯云、AWS、Azure和GCP等。腾讯云在2017年即开始支持terraform进行资源编排,截止目前共有10余款基础产品完美支持terraform,涉及计算、存储、网络、数据库等类别。经过两年的多实践,包括Roit、EF和Unity等在内的众多大客户都在腾讯云上基于terraform构建自己的基础架构。

Terraform通过编写代码来实现云资源的高效编排,为了让大家更好的使用terraform,特别对几个概念做出解释。

Terraform的架构

Terraform本身是基于插件的架构,可扩展性很强,可以方便程序员对Terraform进行扩展。Terraform从逻辑上可以分为两层,核心层(Terraform Core)和插件层(Terraform Provider)。

核心层

核心层其实就是terraform的命令行工具,它是用go语言开发的,它负责:

  1. 读取.tf代码,并对配置文件和代码进行变量取值替换
  2. 资源状态文件管理
  3. 依据图论,对代码中创建的资源依赖关系进行分析,并创建依赖关系图谱
  4. 根据依赖关系图谱,执行资源先后创建。对于没有依赖关系的资源,会并行进行创建(缺省10个并行进程),这也是Terraform能够高效快速管理云资源的原因。
  5. 用RPC调用插件层

插件层

插件层也是由go语言开发的,Terraform有超过250个不同的插件,它们负责:

  1. 接受核心层的RPC调用
  2. 具体提供某一项服务的执行

插件层又有两种:

Provider

Provider,负责与外界API的集成,比如腾讯云Provider就提供了在腾讯云创建、修改、删除云资源的功能。这个插件负责和腾讯云API的接口,并提供一层抽象,这样程序员可以在不了解API细节的情况下,通过terraform来编排资源。它负责:

  1. 初始化以及外界API通信
  2. 外界API的认证
  3. 定义云资源与外界服务的关系

Provisioner

Provisioner,负责在资源创建或者删除完成后,执行一些脚本。比如Puppet Provisioner就可以在云虚拟机资源创建完成后,在该资源上下载、安装、配置Puppet agent。

声明式语言在云资源编排的好处

Terraform是通过HashiCorp Configuration Language来编写代码的,HCL是声明式的,也就是说,程序员用HCL来描述整个基础架构应该是什么样的,然后把具体的实施工作交给Terraform就可以了,程序员不需要了解实施的具体步骤和细节,不需要了解terraform如何与云服务商的API进行对接。Terraform会根据代码,自动下载相应的Provider和Provisioner来负责具体步骤和细节。于声明式对应的是命令式。命令式语言是按照步骤执行的,先后顺序很重要,对固定输入执行命令式语言会得到固定的输出。声明式和命令式并无高下之分,只是在云资源编排这一领域,声明式会比较方便实现。我们日常见到的云资源编排工具都是声明式的,包括AWS CloudFormation、Azure Resource Template、Google Cloud Deoplyment Manager。大家如果通过调用腾讯云API来在腾讯云上实施资源编排,那通常就是命令式的。

资源状态文件

Terraform初始化以后,会生成一个状态文件,该状态文件记录了最近一次操作的时间、各资源的相关属性、各变量的当前值、状态文件的版本、等等。下一次再操作的时候,terraform首先会把当前状态文件与云服务商上的状态进行一次更新,找出是否后有被删除或者更改了的资源,然后再根据.tf文件,决定那些资源需要删除、更新、创建。操作完成后,会重新生成一个状态文件。

Terraform后台

基于资源状态文件的重要程度,它的完整性就非常重要了。一般而言,对这个文件我们至少需要做到在操作开始时自动加锁,直到操作结束,这样别人无法更改。另外还需要做到版本跟踪,这样可以知道云资源的变化情况。状态文件也有可能存有敏感信息,比如在腾讯云上创建cvm时用的密码,所以状态文件的读取权限也需要严格控制。Terraform后台的概念就跟状态文件如何读取、存储、锁定,以及terraform apply如何执行严密相关。terraform缺省使用本地后台,也就是说,状态文件会存放在当前目录下,terraform代码的执行也在本地虚拟机运行。这对一个人管理的云资源是没有问题的,但当团队人员数目加多以后,大家可能都有自己的工作台,但是需要一个共有的地方来存储资源状态文件。这是后就可以用到远程存储。目前terraform支持多种远程存储后台,包括AWS s3,Hashicorp Consul,etcd,Terraform云,以及terraform企业版等等,这些远程后台都提供在远程存储、锁定状态文件。其中terraform企业版提供远程运行terraform,以及其他一些企业级特性。

Terraform模块

牛顿曾经说过:如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。人类进步就是因为我们可以重新使用前人的发现和创造的知识、工具。作为程序员,我们最喜欢的就是代码重用。Terraform模块就是把一些高度可重用的代码写成模块,方便其他人使用。模块由输入参数、输出参数以及主逻辑组成。这就跟传统编程语言里的函数很像。Terraform提供了公开的模块注册器,模块编写完成以后,只要符合规范,就可以发布到模块注册器中让大家使用。

0 人点赞