仅做个人学习笔记复习使用,如果侵权请联系。
前言
在开始学习使用 Terraform 之前,首先需要了解什么是基础设施即代码(IaC, Infrastructure as Code)。
自动化之前的 DevOps 任务
自动化尚未普及的时代,当编写完一个应用程序,想要部署它到服务器上,意味着要经历一系列繁琐的步骤。
常常需要:准备服务器配置网络、创建路由表、安装必要的软件、配置这些软件。
比如为 Java 应用程序安装特定版本的 Java 环境、为应用程序配置数据库,以及执行一系列其他操作来确保服务器准备就绪,以便应用程序能够顺利的运行。
所有这些繁琐的任务通常由系统管理员手动完成,这不仅耗时耗力,需要更多的人力成本,而且容易出错。
然而部署准备仅仅是开始之后的配置和维护同样的重要。
可能还需要做:更新版本、部署应用程序的新版本、执行数据库备份升级、在服务器崩溃后恢复应用程序或更改网络配置等等各种各样的工作,这些工作同样需要手动完成。
自动化之后的 DevOps 任务
好消息是不再需要手动的执行这些操作。
通过基础设施及代码,可以实现整个流程的自动化,即 IaC: Infrastructure as Code。
什么是基础设施即代码
一、概念
基础设施记代码是一种方法,它通过编写和执行代码来自动化基础设施的配置和管理。
这意味着系统管理员和运维团队的专业知识和经验被编码到各种程序或应用程序中,从而可以自动地执行上述所有的任务。
二、涉及到的工具
基础设施及代码不仅仅是一个概念,它还有一系列的工具,比如 Ansible、Puppet、Terraform 和 CloudFormation 等等,这些工具可以用于不同的场景和任务。

可能会好奇为什么有这么多不同的工具,难道我们就不能只用一个基础设施记代码工具来完成所有的任务吗?
实际上目前没有一个 IaC 工具能够从头到尾的完成上面所有的任务,每个工具都有其擅长的领域和特定的用途,因此通常需要组合使用两个或更多的工具来实现整个流程的自动化。
三、三个主要的任务类别(步骤)
为了更好地理解这些工具的使用,我们可以将配置和管理任务大致分为三个类别(步骤):
- 提供或创建基础设施。
比如:创建全新的服务器进行网络配置,创建负载均衡器以及在基础设施层面配置所有其他的内容。
- 对已提供的基础设施进行配置。
这一步涉及在服务器上安装应用程序和软件,并进行必要的配置。
比如:准备将要部署的应用程序的基础设施(服务器环境),这可能包括安装 Java、数据库以及应用程序所需的其他的服务和进程。 - 应用程序的部署。
这是前面的所有任务的最终目的。
随着 Docker 容器技术的普及,上面的第二步和第三步也就是配置和部署应用程序的步骤,在一定程度上已经合并在一起了。
因为使用 Docker 可以将应用程序及其所有的配置和所需的环境一起打包成一个容器镜像,配置已经打包在容器镜像里了。因此在第一步提供基础设施并安装 Docker 运行环境之后,只需要运行刀客容器即可,无需在服务器上进行过多的配置或安装额外的服务。
四、两个不同的阶段
此外我们还需要区分初始设置和维护这两种阶段的不同:
- 初始设置阶段是:第一次提供和配置基础设施的过程。
- 提供或创建基础设置
- 配置基础设置
- 软件的初始安装
- 软件的初始配置
- 维护阶段则涉及:对基础设施的调整更改和优化,以及添加和删除服务器更改网络设置等等
- 调整基础设置
- 添加或删除服务器
- 更新软件
- 重新配置软件
五、IaC 工具的差异
1、适合的任务类别的差异
这是我们需要了解的、它们最重要的差别!
在我们清楚任务类别和阶段的区别后,我们很容易就能意识到需要:
- 在不同阶段自动执行不同类别的任务。
- 组合使用两个或更多的工具来实现整个流程的自动化。
例如 Terraform 是一个专注于提供和管理基础设施的工具,但它也可以用于对基础设施上的应用程序进行初始化安装和配置。
然而对于这些应用程序的进一步维护,Terraform 则可能不是最佳的选择。
相比之下,Ansible、Puppet、和 CHEF 等工具更适用于配置和部署应用程序和之后对他们的管理任务,以及对于已经提供的基础设施的一些配置工作,但它们都不能用于服务器的初始配置。

一个常见的场景是:使用
Terraform来提供和配置基础设施,然后使用Ansible来安装和部署应用程序。
2、工作原理差异 - 程序性和声明性
- 程序性:需要逐步执行所需的操作来达到目标的状态。
比如:先创建服务器,然后添加服务器等等。
- 声明性:只需要声明期望的最终状态,而工具将负责实现该状态。
比如:“我想要两台服务器”。
3、工作原理差异 - 可变基础设施与不可变基础设施
- 可变基础设施:顾名思义,创建的基础设置配置可以调整。
比如:在创建三台服务器后,编辑其中一台或多台服务器的网络配置。
- 可变基础设施:核心理念是任何基础设施的实例一旦创建之后,就成为只读的状态,不可对其进行任何的更改。
如果需要对基础设施进行更新或升级,唯一的方式是创建一批新的实例来替换旧的实例子。
4、其他的差别
还有诸如代理和无代理、主节点和无主节点等等其他的差异。
由于我们的目的暂时仅是学习 Terraform 这一种工具,因此不再做深入研究,如有需要请自行了解。
参考资料:
- 📺 什么是基础设施即代码?
- Terraform – 从初级到高级
非常非常好的中文课程,恶魔老师有浅入深讲得非常好,强烈推荐!