小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
本文重点讲Terraform的特点和生命周期,以及基础语法。
一、显著特点
Terraform
作为基础设施即代码的先驱者,有很多领先的思想,下面是它的一些主要特点。
- 基于
IaC
(基础设施即代码,Infrastructure as Code)的设计,可以将基础设施以一种领域特定语言(HasiCorp的HCL/DCL)描述出来,消除了在基础设施自动化时描述语义上的歧义,同时减轻了人为因素造成的不确影响。 Terraform
在执行编排动作前,会生成一份可读性良好的执行计划,关键基础设施的变更可以得到充分审查,保证了基础设施的可靠性- 基于 DAG(有向无环图,Directed Acyclic Graph)描述资源与资源之间的关系,由于 DAG 良好的拓扑性质,当资源属性与资源关系发生改变时,变更动作将被充分并行地执行
二、生命周期
根据示例图,左侧的部分是 Terraform
本身提供的能力,右侧是由云厂商提供的能力。图上一共包含三个主要的线程,包括Terraform 核心进程、Provider 进程、Provisioner 进程。三个线程的能力分别如下:
- Terraform 核心进程:负责资源定义文件,构建有向无环图,管理状态存储;
- Provider 进程:即提供资源编排能力的进程,包括由云厂商实现的能力(比如 UCloud),和应用程序提供的能力(比如 TLS)等;
- •Provisioner 进程:即提供资源编排后处理操作的进程,比如执行 Shell 命令,上传文件等;
三、基础语法规则
3.1 类型
原始类型(三种类型可隐式转换)
-
string
其代表一组Unicode字符串,例如:"hello"。
-
number
其代表数字,可以为整数,也可以为小数
-
bool
逻辑判断,true or false
复杂类型
集合类型
- list(连续集合)
- map(字典类型)
- set(集合类型,代表一组不重复的值)
结构化类型
-
object(名称+属性)
- 格式:object({age=number, name=string})
- 例子:object({age=number,name=string}),赋值{ age=18, name="john" }
- tuple(类似于list,但每个元素都可具有独立的类型)
特殊类型
- any(占位符,可以用于赋值任何类型)
- null(无类型,表示数据缺失)
3.2 配置语法
参数赋值
将一个值赋给一个特定的名称,例子:image_id="abc123"
块
说明:一个块是包含一组其它内容的容器,块可以嵌套
- 一个块类型可以规定任意多个标签,也可以没有标签
- 内置了顶级块,可独立定义在配置文件中,例如resource, variable, output, data
注释
说明:注释掉不解释执行
- 单行注释,其后的内容为注释,默认优先使用这个!
- // 单行注释,其后的内容为注释
- /* 和 */,多行注释,可以注释多行
编码格式
- 配置文件必须始终使用UTF-8编码
- 分隔符必须使用ASCII符号
- 其他标识符、注释以及字符串字面量均可使用非ASCII字符
标识符
说明:参数名、块类型名以及其他Terraform规范中定义的结构的名称
- 合法的标识符可以包含字母、数字、下划线(_)以及减号(-)
- 标识符首字母不可以为数字