Skip to content
Go back

Terraform 学习笔记(二)Terraform 是什么以及如何使用

| 0 Views Edit page

仅做个人学习笔记复习使用,如果侵权请联系。

前言

关于 Terraform 的优势、特性、使用场景、架构(实现)以及常用命令等。


什么是 Terraform

Terraform 是一款强大的工具,它可以帮助自动化并管理:

  • 基础设施
  • 平台
  • 运行在平台上的各种服务

一、优势和特性

这款工具是开源的,并且使用声明式语言进行操作,这意味着您无需定义每一步的自动化和管理过程,你只需要明确你想要的最终的结果,而 Terraform 会帮助搞定如何实现。

它这与命令式(程序式)风格的操作方式不同,命令式风格需要您详细定义每一步的执行过程。
声明式与命令式的区别

二、能力和角色

Terraform 是一款专注于基础设施配置和部署的工具
简单来说它可以帮助快速搭建起运行应用程序所需的基础设施环境。

在我们实际的应用程序部署中,往往包含两个独立任务的过程:

  1. 提供并配置基础设施,并准备部署应用程序所需的一切。
  2. 在基础设施上实际部署应用程序。

这两个任务甚至可能需要有两个独立的团队或人员来执行。
两个独立的任务过程

例如:您刚开始一个新项目,想要从头开始设置一个基础设施来运行您的应用程序。
这个基础设施可能包括几台服务器,用于部署您的微服务应用程序,而这些微服务以 Docker 容器的形式存在。
Docker 形式的微服务应用程序
此外您可能还需要一个数据库容器,您决定选择 AWS 作为构建整个基础设施的平台。在 AWS 上准备和配置资源,以便部署应用程序。这是一个复杂的过程,需要:创建私有网络空间和 EC2 服务器实例;在每个实例上安装所需的其他的工具;设置服务器安全性(防火墙等);配置网络等等…
一旦基础设施就绪,就需要将 Docker 应用程序或容器部署到已经准备好的基础设施上。
大致架构

那么在这其中,Terraform 扮演什么角色呢?
很明显,它负责第一部分的工作:基础设施的配置和部署,以准备应用程序的部署。
它可以帮助您创建 VPC、启动服务器、设置安全性、创建 AWS 用户和权限,以及比如在服务器上安装特定版本的 Docker 等等…

BTW 所有这些任务都需要以正确的顺序完成,因为一项任务可能依赖于另一项任务。

三、Ansible 和 Terraform 的区别

1、相同

都是基础设施及代码的工具,用于自动化提供配置和管理基础设施。

2、不同

  1. 侧重点不同。

    • Terraform 主要用于基础设施的配置和部署。

      当然也支持在该基础设施上通过其他工具部署应用程序。

    • Ansible 主要是配置工具,一旦提供了基础设施,就可以对其进行配置。

      例如:配置基础设施、该基础设施上部署应用程序安装和更新软件。

  2. 新旧差异。

    • Terraform 较新,还在不断地动态的发展。
    • Ansible 在 2012 年被创造,历经 12 年的发展,相对成熟。
  3. 通常使用的领域不同。

    • Terraform 在资源编排方面展现出了更强大的能力,因此被用于基础设施的预配置。
    • Ansible 则更多地被用于配置基础设施,以及部署和安装软件、应用程序等任务。

使用场景

一、创建基础设施

这是 Terraform 的强项且反复被提及,因此不再赘述。

二、管理现有的基础设施

回到之前的微服务部署案例,现在我们使用了 Terraform 成功地创建了基础设施,并在 AWS 上为项目进行了一些必要的配置,随后在基础设施上面部署了应用程序

然而随着开发团队开发出更多的新功能需要部署,我们决定要在现有的基础设施中增加 6 台服务器以支持更多的微服务的部署需求,然后还想添加一些安全配置,以及删除一些在开始时配置的东西。
在微服务项目中添加和修改现有基础设施
很明显现在我们处于管理现有基础设施的阶段,包括添加一些东西,重新配置删除一些东西等等…

使用 Terraform,上述的这些操作也都可以很容易的实现。
管理基础设施的任务同样重要,因为一旦为项目创建了初始的基础设施之后,就需要不断的调整和更改它。
也正因为如此,就更需要自动化的工具来完成大部分繁重的工作,而不必每次都需要手动来完成这些任务。

三、复制基础设施

通过前面创建和调整,在测试了配置并确保一切正常后,你可能希望将开发环境的应用程序发布到生产环境中。
因此你可能需要创建生产环境,然后完全复制之前的这套环境所有的设置。因为这套环境的基础设施和环境等配置都是测试验证过了,直接复制是最好的选择,不容易出现问题且效率高,而不是在生产环境中重新再从头来一遍

Terraform 同样能在这里表现的很好。
使用 Terraform 可以复制构建一套与开发环境相同的基础设施,也就是直接使用与第一个设置开发环境相同的 Terraform 代码,轻松地进行复制启动和设置相同的基础设施。


Terraform 架构

Terraform 是如何实现这上述场景中对应功能的呢?它是如何与这些基础设施提供商平台通信对接,并利用各种技术来配置资源的呢?
这就要讲到 Terraform 的架构了。

一、核心的两组件(Core 和 State)

Terraform 主要由两个组件构成其架构:

  1. 第一个主要组件是其核心库 (Core)​:它负责接收并处理输入源,以执行相应的操作。

    这些输入源主要是用户编写的 Terraform 配置文件,其中定义了需要创建配置或管理的资源。

  2. 第二个组件是状态 (State)​Terraform 用它来跟踪和更新基础设施的当前配置状态。

Core 接收到用户提供的配置输入后,它会根据这些信息计算出需要执行的操作计划,以确保实际的基础设施状态与期望的状态一致。
而之后 Terraform 会比较当前的基础设施状态与您所期望的配置状态,当检测到当前的状态与期望的状态之间存在差异时,它就会计算出需要执行的操作,用以将当前的实际状态与配置文件中所定义的状态一致,这可能包括:创建新资源、更新现有资源或删除不再需要的资源。
此外 Terraform 还会确定应该以何种顺序执行这些操作,以确保整个过程的顺利和高效。
Terraform Core 和 Terraform State

二、提供商 (Providers)

这是 Terraform 的最重要的组成部分。
通过 Providers 提供的特定的技术接口,Terraform 才得以与提供商平台进行通信,并执行相应的操作。
这些 Providers 可以是:

  • 云服务提供商 (IaaS)。

    例如:AWS、微软云、阿里云、腾讯云等。

  • 更高级别的组件、平台及服务 (PaaS) 工具。

    例如:Kubernetes 等容器编排平台。

  • 软件即服务 (SaaS) 工具。

    例如:Fastly。

你可以做到:创建 AWS 基础设施,然后在其上部署创建 Kubernetes 集群,最后在集群内部创建服务或组件。
这就实现了从基础设施到应用程序的全方位配置和管理

你可以在这里看到所有的 Providers:Providers
有些是官方提供的,有些是服务提供商自己提供的,也有一部分是用户编写并共享的。

三、流程

Core 根据配置文件和 State 的输入创建执行计划时,它会利用这些不同供应商的 Provider 来执行该计划。
而这些 Provider 负责与相应的供应商进行通讯,并执行实际的配置和管理操作。

四、配置样例

1、将 AWS 作为云服务提供商的例子

# 定义 Provider
provider "aws" {
    version = "~> 2.0"
    region  = "us-west-2"
}

# 配置 Providers 的资源
resource "aws_vpc" "test" {
    cidr_block = "10.0.0.0/16"
}

2、将 Kubernetes 作为平台及服务工具的例子

# 定义 Provider
provider "kubernetes" {
    config_context_auth_info = "ops"
    config_context_cluster   = "my_cluster"
}

# 配置 Providers 的资源
resource "kubernetes_namespace" "test" {
    metadata {
        name = "my-test-namespace"
    }
}

五、Terraform 声明式配置所带来的优势

简单来说,当创建 Terraform 的配置文件时,不需要详细定义每一步的执行过程,比如:如何创建 VPC、如何启动多台实例或如何配置网络等
而是只需要定义期望的最终状态是什么样的,比如:我想要几台具备特定网络配置的服务器,以及一个拥有特定权限的 AWS 用户来访问这些服务器,然后 Terraform 就会根据您的配置自动为您完成这些操作

在对资源进行初始配置时,声明式方法或许并不会带来太直观的感受,它与命令式方法在呈现上可能大致接近。
但当需要更新基础设施的时候,例如增删服务器或进行其他调整时,两者之间的区别就会凸显出来:

  • 命令式方法需要您在配置文件中具体的说明要执行的每一步操作。

    这些操作都需要被详细记录为步骤:删除两台服务器,添加一个防火墙配置,以及为 AWS 的用户某某某分配某些权限等。

  • 声明式方法只需要描述您期望的最终状态。

    Terraform 会自动处理所有必要的操作,确保从当前状态平滑过渡到你所描述的期望状态。

更新时的差别

这带来的好处就是:

  1. 配置足够简单。
  2. 所见即所得,可以清晰地预测最终状态是什么样子的。
  3. 降低了出错的风险,所有的参数复杂的具体操作都由 Terraform 计划和实现。

Terraform 命令

一、refresh 获取当前状态

terraform refresh

Terraform 会联系基础设施供应商,来获取基础设施的当前状态。

二、plan 创建执行计划以供预览

terraform plan

Core 会根据当前的基础设施状态 State 和配置文件中定义的目标状态,制定一个详细的执行的计划。
详细地列出需要执行的操作,以及执行这些操作的顺序。
但是它并不会实际执行这些操作,只是提供一个预览

三、apply 执行计划

terraform apply

Core 会根据 plan 生成的执行计划,执行实际的操作,以确保当前的基础设施状态与配置文件中所定义的状态一致。

四、destroy 销毁基础设置及资源

terraform destroy

Terraform 会销毁配置文件涉及到的所有资源,以确保基础设施回到最初的状态。

Terraform 当然会智能地按照资源之间的依赖关系,以正确的顺序销毁资源。

在销毁资源之前,它会再次像 apply 命令一样检查当前的状态,并制定一个详细的删除计划。


All in One

由于巨量的 ProvidersResourcesTerraform 可以帮助您实现几乎所有主流的基础设施的配置和管理。
数量众多的 Provider
当需要同时使用公司内部的私有云和多个公共云服务提供商时,Terraform 可以成为你的统一管理工具。
一个 Terraform 搞定这一切,而不再需要学习每个云服务提供商的专有工具。同时得益于 Providers 的封装,无需再学习并掌握每个工具的 API 的使用方法。
Terraform 屏蔽了底层的复杂性,让我们能够更专注于业务逻辑的实现,这太棒了不是吗


参考资料:


Edit page