正文
系列文章
👉 Terraform 系列文章
前言
最近在使用 Terraform 来置备 OCI 的 Always Free Tier, 发现它非常好用。总结学习下:Terraform 的基础知识。
Terraform 是一种基础架构即代码(IaC)工具,可让您安全高效地构建、更改云和本地资源并对其进行版本控制。
HashiCorp Terraform 是一种基础架构即代码工具,可让您在人类可读的配置文件中定义云和本地资源,您可以对这些文件进行版本控制、重用和共享。然后,您可以使用一致的工作流程在其整个生命周期内配置和管理所有基础设施。Terraform 可以管理计算、存储和网络资源等低级组件,以及 DNS 条目和 SaaS 功能等高级组件。
-
基础设施即代码(IaC):基础设施使用高级配置语法进行描述。这允许对数据中心的蓝图进行版本控制,并像对待任何其他代码一样对待它。此外,基础设施可以共享和重复使用。
-
执行计划(Plan):Terraform 有一个“计划”步骤,它可以生成执行计划。执行计划显示了 Terraform 在您调用 apply 时将执行的操作。这可以让您在 Terraform 操作基础设施时避免任何意外。
-
资源图(Resource Map):Terraform 构建所有资源的图,并并行化任何非依赖资源的创建和修改。正因为如此,Terraform 尽可能高效地构建基础设施,并且运营商可以深入了解其基础设施中的依赖关系。
-
变更自动化:复杂的变更集可以以最少的人工交互应用于您的基础架构。有了前面提到的执行计划和资源图,您就可以确切地知道 Terraform 将更改什么以及更改的顺序,从而避免许多可能的人为错误。
这里简单罗列一下,由于笔者水平所限,可能有遗漏,请帮忙补充:
- IaC
- 工作空间(WorkSpace): Workspace 允许相同的配置代码有一个以上的状态 (State) 文件。这意味着部署到多个环境时,不需要将配置代码复制粘贴到不同的文件夹。每个工作空间可以使用自己的变量定义文件来参数化环境。
- 变量(Variable): 即用户提供的值,它们能够参数化 Terraform 模块 (modules), 而不必修改源代码。
- 运行(Run)-计划和应用(Plan & Apply)
- 资源图
- 供应商(Provider): Provider 是上游 API 的逻辑抽象。他们负责了解 API 交互和公开资源。如:AWS/Azure/GCP/Kubernetes/Aliyun/OCI Providers
- 模块(Modules): 模块是 Terraform 配置的独立包,允许把相关资源组合到一起,创建出可复用的组件。要使用模块,你并不需要知道模块的工作方式,只需要知道如何设置输入和输出即可。对于提升软件抽象度和代码复用,模块是很有用的工具。类似于积木块或 Python 的 library.
- 注册表(Registry): 发现为所有 Terraform 资源类型提供支持的 Terraform 提供程序,或查找用于快速部署通用基础结构配置的模块。类似于 Docker Registry 或 Python PypI.
- 声明式编程: 表达计算逻辑(做什么), 但不描述控制流(怎么做). 其关注的是结果,而不是过程。
- 云无关: 能够使用一组相同的工具和工作流,无缝运行在任意云平台上。Terraform 是云无关的,使用它能把基础设施部署到 AWS 与部署到 GCP、Azure 甚至私有云一样简单。不会被特定云供应商(如 AWS CloudFormation)所绑定,也不需要在每次改变云供应商时学习一种全新的技术。
- 表达能力强且高度可扩展:通过使用条件语句、for 表达式、指令、模版文件、动态块、变量和许多内置函数,我们可以轻松地编写代码来实现自己的目的。Terraform 提供以下特性:
- 115+ 个函数
- 支持条件语句
- 支持 for 循环
- 支持多种类型:字符串、数字、列表、映射、布尔值、对象、复杂类型
- 支持插件
- 模块化
- 等待条件
- 模板(Template)
- 动态块
- 协同工作:利用 Terraform 的后端(Backend)、注册表、工作空间以及代码仓库可以做到与朋友、同事协同工作。
- 生命周期管理:Create、Read、Update、Delete(or Destory)以及可以自定义生命周期的
create_before_destory
prevent_destory
ignore_changes
标志。
- 测试: 可以通过
go test
配合 fixture 测试 Terraform 代码。
- HCL: 人机友好的结构化配置语言,用于命令行工具。尽管旨在普遍使用,但它主要针对 devops 工具、服务器等。HCL 是专门为构建结构化配置格式而设计的语法和 API。试图在通用序列化格式(如 JSON)和围绕完整编程语言(如 Ruby)构建的配置格式之间取得折衷。
- 安全和密钥管理: 通过和 HashiCorp(Terraform 母公司) Vault 的无缝集成实现对安全和密钥的管理。
基于以上 Terraform 的主要功能和特点,我们将 Terraform 和 它的竞品 做一个初步比较:
📝免责声明
以下仅为笔者个人观点,由于眼界和知识所限,并不一定准确。仅供参考。
- 相比 Ansible/Chef/Puppet/SaltStack 等配置管理工具. 配置管理工具主要用途是在已经存在的机器上安装和管理软件。Terraform 不是配置管理工具,它的主要作用是置备资源。Terraform 专注于数据中心和相关服务的更高级别的抽象。另外,Ansible/Chef/Puppet/SaltStack 等主要是命令式的,Terraform 是声明式的。但是它们都有丰富的扩展和生态。
- 相比 AWS CloudFormation/GCP Deployment Manager/Azure Resource Manager. Terraform 更好,它云无关,并且支持多个提供商和服务的组合和组合。另外 Terraform 还通过使用执行计划的概念将计划阶段与执行阶段分开,以确保它完全符合预期。
- 相比 Pulumi. Pulumi 和 Terraform 最为类似,唯一的区别在于 Pulumi 不是声明式的。孰弱孰强各有优势。
- 相比 CrossPlane, Terraform 在面向用户/开发人员侧的抽象能力比 CrossPlane 弱一些,另外在保障配置不漂移这方面也相比 CrossPlane 弱一些。但是 Terraform 的生态(供应商和模块)要比 CrossPlane 强的多得多。
总结
本文讨论了什么是 Terraform, 它的优势、特点、使用场景, 相对于其他 IaC 工具有哪些优缺点。
本篇基本上都是一些概念性的东西,还没有进入实战环节,敬请期待后续更新。
EOF