Terraform简介

简介

Terraform的定义

  • Terraform是一个可以安全、高效地建立、变更、以及版本化管理基础设施的工具,可以在主流的服务提供商上提供自定义的解决方案;
  • 以配置文件为驱动,在文件中定义所需要管理的组件(基础设施),以此生成一个可执行的计划,通过执行这个计划来完成所定义组件的创建、增量式的变更和持续的管理。
  • Terraform不仅可以管理Iaas的资源,也可以管理更上层的服务,如DNS解析,SaaS应用等。

Terraform的特点

  • 基础设施即代码:Terraform基于一种特定的配置语言HCL(Hashicorp Configuration Language)来描述基础设施资源。可以像对待任何其他代码一样,实现对所描述的解决方案,或者基础架构的版本控制和管理。同时,通用的解决方案和基础架构可以以模板的形式进行便捷的共享和复用。
  • 执行计划:Terraform在执行前,可以通过terraform plan命令先解析模板生成一个可执行的计划,这个计划展示了当前模板需要创建、变更的资源和属性。操作人可以预览这个计划,在确认无误后在执行apply命令,完成所定义资源的创建和变更。
  • 资源拓扑:可以根据模板中的定义,构建所需资源的图形,以并行的方式创建和修改没有任何依赖资源的资源,以保证执行的高效性。有依赖的动作,被依赖的资源会优先执行。
  • 自动化变更:不管多么复杂的资源,当模板创建完成,通过apply一个命令,即可完成数个变更操作,避免人为操作带来的错误。

关键概念

Configuration:基础设施的定义和描述

基础设施即代码,其中的代码Code就是对基础设施资源的代码定义和描述,通过代码表达需要管理的资源。

所有资源的代码描述都是定义在一个以.tf结尾的文件,用于terraform的加载和解析。这个文件就称之为“Terraform模板”或者“configuration”

Provider: 基础设施管理组件

Terraform常用于公有云上基础设施的管理,如虚拟机、网络、容器等。Provider就是与OpenAPI交互的后端驱动,Terraform通过Provider完成对基础设施资源的管理。

每个基础设施提供商,aliyun、aws等都需要提供一个provider来实现对自家资源的统一管理。目前我们使用的阿里云对应的provider就是alicloud。

在运行环境中,Terraform和Provider是两个独立存在的package,执行Terraform时,会根据用户模板中指定的Provider或者resource/datasource的标志自动下载模板使用的provider,并放在当前目录下的.terraform隐藏目录下。

Resource:基础设施资源和服务的管理

在Terraform中,一个具体的资源或者服务称为resource,比如一个ECS,一个SLB、一个域名解析记录。每个特定的resource包含了若干可用于描述对应资源或服务的属性字段。通过这些字段来定义一个完整的资源或者服务,比如dns的domain_name、ttl等。

如下定义一个resource:

|
resource "alicloud_alidns_record" "dns701438486351555584" {
domain_name = "test.com"
line = "default"
priority = 0
rr = "mobile.api"
status = "ENABLE"
ttl = 600
type = "A"
value = "1.1.1.4"
}
|

  • 其中alicloud_alidns_record为资源类型,定义这个资源的类型,告诉terraform这个resource是域名解析记录。
  • dns701438486351555584为资源名称,资源名称在同一个模板中必须唯一,可以用于其他资源引用该资源。
  • 大括号里面的block为配置参数,定义资源的属性。

Data Source:基础设施资源和服务的查询

Data Source提供查询资源的功能,每个data source实现对一个资源的动态查询,其结果可以认为是动态变量,只有运行时才知道其值。
|
data "alicloud_alidns_records" "records_ds_uni" {
domain_name = "test.com"
type = "A"
line = "unicom"
rr_regex = "mobile*.api"
output_file = "records-uni.txt"
}
|

如上定义一个records_ds_uni的资源,其通过data引用,查询test.com域名下,解析记录匹配mobile*.api的,解析线路为unicom的所有A记录,并输出到records-uni.txt文本中。

state:保存资源关系以及属性文件的数据库

Terraform创建和管理所有资源都保存在自己的数据库上,这个数据库是一个名为terraform.tfstate文件,在terraform中称之为state,默认存放在执行命令的本地目录中。

在执行terraform命令时,terraform会利用state文件与模板文件进行diff对比,如果出现不一致,terraform将按照模板中的定义重新创建,或者修改资源,直到没有diff。所以这个文件非常重要,如果损坏,terraform将认为已创建的资源被破坏,或者需要重建。当然实际的云资源不会收到影响。

Backend:存储state文件的载体

因terraform创建资源后,会将资源属性保存在state文件中,而这个文件可以放本地,也可以存放在远端,实现state和模板代码的分离,这个存放state文件的载体就是backend。

Backend分为本地和remote两类,默认为本地。目前已支持多达13中远端存储方案,如console、etcd、oss等,可以降低多人协作对state维护的成本,也可以保障数据的安全性。

Provisioner:在机器上执行操作的组件

用来在本地机器或者登录远程主机执行相关的操作,如local-exec在本地执行命令,chef用来在远程主机安装、配置、执行chef client,remote-exec用来登录远程主机执行命令。

通常与provider搭配实现,provider创建资源后,使用provisioner在创建的资源上执行各种操作。

常用命令

  • terraform init: 初始化,加载所需模块
  • terraform plan: 资源预览

用于对模板定义的资源进行预览。如预览当前模板中定义的资源是否符合预期,如果存在state文件则展示diff结果,即变更的内容。

  • terraform apply:新建、变更资源
  • terraform show:资源展示,展示当前state中所管理的资源以及所有属性
  • terraform destroy: 资源释放
  • terraform import: 资源导入,将存量的云资源导入到state中,进而加入到terraform的管理体系中。适用一下场景
    • 从来没使用terraform管理过资源,现在需要切换到terraform管理;
    • 在不影响资源使用的前提下,重构资源模板中的定义;
    • Provider有升级支持了更多的参数,需要把新参数同步过来。
  • terraform fmt: 格式化模板文件。将编写的tf文件进行就地格式化。

概念和命令的理解可以参考下图:

image

操作生命周期

image

资源编排的动作的生命周期如上,其中左侧为Terraform系统系统的能力,右侧provider、provisioner为厂商提供。

当执行terraform apply命令时:

  1. terraform唤醒进程,初始化backend(默认为local-file);
  2. 解析用户定义的模板文件,并获取最新的资源状态,进行对比;
  3. 构建DAG,将所有编排动作依次发送给provider;
  4. provider调用云API管理云资源
  5. 将返回的结果写回state
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容