AI

Terraform 笔记

Terraform notebook use NotebookLM

Posted by shake on May 21, 2025

这两天需要大量了解Terraform方面的知识,基本都是英文的,不管你英文怎么好,看起来很费劲,而且现在很多都是视频,那么如何高效看视频和文档呢?肯定是通过AI。

google出品的NotebookLM,其实我以前用过一段时间,缺点不支持中文。上周的更新,不仅仅可以支持中文,生成中文博客,还可以直接使用关键词帮你去互联网搜索资源。所有的问题回答,都是基于你提供的材料。

我的习惯以前都是直接去官网看文档,现在偷懒,直接去youtube看视频,尤其是官方的视频。这次深入使用notebookLM,同时还可以让我完成对Terraform的深入理解,看看效果如何。

下面内容,是NotebookLM分析官方网站的视频产生的材料,选取重点,放在下面。

Terraform 阶段性演进

个人阶段:

  • 个人用户编写 Terraform 配置,进行本地 plan(验证变更)和 apply(应用变更)循环。
  • 这是一个紧密的反馈循环,没有协作问题。
  • “当谈论 Terraform 时,它通常始于个人使用者,对吧?所以我们有一个个人贡献者,他们有一个非常紧密的循环,他们所做的是以 Terraform 配置的形式编写基础设施即代码。”
  • “这个流程非常规范,用 Terraform 你编写你的配置,然后在本地运行一个 terraform plan,这会告诉你 Terraform 期望做什么……然后一旦你满意了,你检查并验证了它,你实际上就进行了这些更改,所以你应用它们并在那里进行更改。”

    团队阶段:

  • 引入协作挑战:多人修改同一个基础设施定义,需要确保一致性和安全地进行变更。
  • 引入版本控制系统(如 GitHub)作为单一真相来源,避免配置分歧。
  • 变更应用需要顺序执行,避免相互干扰和状态文件损坏。
  • “一旦我们进入团队,我们就引入了一系列协作挑战。具体来说,我们现在正在修改基础设施的单一定义,但有多个成员在做这件事,所以我们如何确保我们拥有基础设施的一致定义,并且我们正在安全地进行这些更改,以免相互干扰。”
  • “关键是版本控制系统正在为我们提供一个单一的真相来源。”
  • “所以现在,当涉及到多团队时,变化的是我们现在需要做分解,这就是我们在这里真正拥有的是一组单一的 Terraform 配置来定义我们所有的基础设施,但是当我们走向许多团队时,这开始变得不切实际。”

    多团队阶段:

  • 核心挑战是基础设施的分解:从单一的整体配置分解为多个更小、独立的配置单元(称为 ​工作空间 workspaces​)。
  • 不同团队负责管理各自的工作空间(如网络团队、中间件团队、应用团队)。
  • 需要 基于角色的访问控制 (RBAC) 来管理权限,限制不同团队对其他团队管理的工作空间的写访问,同时提供读访问。
  • “我们希望做的是将这个更大的基础设施分解成一系列工作空间,然后将它们组合成一个更大的基础设施。”
  • “当涉及到多个团队时,我们可能不希望出现应用程序团队可以进来并改变我们网络拓扑的定义并简单地部署变更的情况。”
  • “我们开始希望将此与基于角色的访问控制联系起来。”

    组织阶段:

  • 面临治理和规模化挑战:不是所有人都熟悉 Terraform 或云基础设施。
  • 引入 发布者/消费者模型 和 ​模块注册表​:专家(发布者)创建标准化的、封装了最佳实践的模块,供更广泛的非专家用户(消费者)使用。
  • 通过模块抽象底层复杂性,使消费者能够通过少量参数部署基础设施。
  • 需要通过 策略即代码 (Policy as Code) 进行治理和风险控制,自动化检查和强制执行组织策略(例如,不允许开放防火墙,强制部署到特定区域)。
  • 这取代了手动审查和审批流程,提高了效率。
  • “在这里,在组织层面,存在着一套不同的治理挑战,随之而来的是如何让更多的人具有生产力的挑战。”
  • “我们如何让更多的人具有生产力?… 第一个答案是这种关于发布者和消费者的常见模式。”
  • “发布者所做的是将模块推送到一个中央注册表,这些模块基本上描述了如何部署不同类型的基础设施。”
  • “更大的消费者群体可以基本上拉出这些东西,那些消费者不必对 Terraform 或我们的模式非常熟悉。”
  • “我们如何让这么多消费者、这么多人安全地互动?… 我们不希望人们打开防火墙并允许所有流量进入,或者将他们的 S3 存储桶设置为‘宇宙’可以读取并暴露我们的数据。”
  • “我们的项目专注于此,我们称之为 Sentinel,其核心思想是如何将策略捕获为代码。”

可变基础设施 vs. 不可变基础设施

可变基础设施 (Mutable Infrastructure):

  • 创建基础设施后,通过原地修改(例如,使用配置管理工具如 Chef、Puppet、Ansible)来更新或升级它。

优点:

  • 可以重用现有基础设施,无需迁移本地数据。

缺点:

  • 风险高:原地升级可能不完美,导致系统处于难以理解的中间状态(例如,版本 1.56)。
  • 复杂性高:难以调试,尤其是在大规模部署中,可能出现各种不同的失败状态。
  • “简而言之,当我们谈论可变方法时,我们真正谈论的是,比如说我正在创建一个服务器……现在我想让这个服务器成为一个网络服务器……现在随着时间的推移,我想进行更改……我们将通过原地修改来将现有服务器升级到新的版本 2 配置,以达到新的配置。”
  • “可变性的挑战和权衡是,如果这不能完美升级会发生什么?这不是一个完美的干净升级,因为在现实世界中,事情会出错。”
  • “你最终会得到这个有点奇怪的状态,也许 nginx 没有安装,但我们确实成功部署了我们的网络服务器的第二版,所以我们现在处于一个有点有趣的情况。”
  • “这为我们带来了什么?它带来了几件事情,那就是这个升级过程有引入风险的缺点,风险是现在我们处于某种未定义的状态,某种半失败场景。”
  • “另一个方面是它增加了复杂性。”
  • “这些变得难以调试,因为你的系统处于一个难以理解的状态。”

不可变基础设施 (Immutable Infrastructure):

  • 创建基础设施后,永不原地修改。每次需要更新时,都创建一个全新的基础设施实例(基于新的镜像或配置),然后将流量切换到新的实例,最后销毁旧实例。

优点:

  • 风险低:如果新实例创建失败,可以直接抛弃,不会影响现有运行的实例。只部署经过验证的离散版本(版本 1 或版本 2),没有中间状态。
  • 复杂性低:系统状态更容易理解和推理,可以简单地用直方图来描述(例如,有多少版本 1 的机器,有多少版本 2 的机器)。

    缺点:

  • 如果应用有本地状态/数据,需要将数据外部化(例如,使用共享数据库或外部存储),否则销毁旧实例会丢失数据。
  • “不可变性的不同之处在于,当我们转向不可变性时,一旦服务器存在,我们就绝不会尝试原地升级它来达到 v2。”
  • “我们将创建一个全新的服务器……这是一个独立的机器,我们不会尝试升级现有基础设施。”
  • “如果这个成功了,如果我们启动了一个没有错误的新机器……那么我们就会切换流量,所以我们的用户现在开始访问 v2 而不是 v1,然后我们就会淘汰版本 1。”
  • “优点是我们可以拥有离散的版本概念,要么是版本 1 正在运行并且流量流向那里,要么是版本 2 正在运行并且流量流向那里。这个中间区域不存在。”
  • “这样思考风险和复杂性会大大降低风险,因为我们没有这些未经验证的未定义状态,但我们也降低了基础设施的复杂性。”
  • “这不是没有权衡的,因为如果这个应用程序有状态怎么办?……要使其有效,你通常需要将数据外部化。”

Terraform Enterprise 的价值

  • 解决协作挑战: 提供一个平台来管理 Terraform 状态文件,确保状态的一致性并防止冲突。
  • 实现安全的多团队协作 (RBAC): 允许定义团队、工作空间,并为不同团队分配对工作空间的读写权限,与单点登录集成。
  • ​促进组织级规模化和敏捷性:​提供模块注册表,使非专家用户能够轻松使用经过批准的基础设施模式。
  • 通过 Sentinel 策略即代码引擎自动化治理和风险控制,强制执行组织策略,避免手动审批流程导致的瓶颈,同时保持开发和部署的敏捷性。
  • “Terraform Enterprise 真正介入的第一点是它正在着眼于如何让一个团队的人员富有生产力,而无需强迫他们首先想出工作流程并解决如何进行协作。”
  • “Terraform Enterprise 为我们提供了定义不同团队、定义多个工作空间、管理哪些团队允许做什么的权限,并将所有这些与我们的单点登录体验联系起来的能力。”
  • “最后的挑战是如何安全地完成所有这些事情。……我们的部分目标是如何通过策略即代码来自动化这一点。”
  • “这真正着眼于如何在扩大 Terraform 使用规模时以一种控制风险的方式进行,我们不让人们做他们想做的事情,拥有所有权限,他们可以要求一千个虚拟机,但与此同时,我们如何以一种仍然富有生产力的方式进行。”

术语表

  • Terraform Cloud: HashiCorp 提供的一种 SaaS 平台,用于管理和执行 Terraform 工作流,提供协作、状态管理、运行自动化、策略执行等功能。
  • 项目 (Project): 在 Terraform Cloud 中用于组织相关工作空间和资源的逻辑分组。
  • 工作空间 (Workspace): Terraform Cloud 中的核心构建块,用于管理一组相关的基础设施资源。它可以连接到版本控制系统,管理变量和状态文件。
  • 版本控制工作流程 (Version Control workflow): Terraform Cloud 中最常见的工作流程,通过监控连接的版本控制仓库中的代码变化来触发 Terraform 运行。
  • CLI 驱动工作流程 (CLI driven workflow): 通过 Terraform CLI 命令直接与 Terraform Cloud 工作空间进行交互和触发运行的工作流程。
  • API 驱动工作流程 (API driven workflow): 通过 Terraform Cloud API 进行交互和触发运行的工作流程,常用于与其他自动化系统集成。
  • Webhook: 一种在特定事件发生时自动向指定 URL 发送 HTTP 请求的机制。在 Terraform Cloud 中,常用于版本控制系统通知代码变化。
  • 计划 (Plan): Terraform 运行的第一个阶段,分析基础设施配置,并生成一个执行计划,详细说明将要创建、修改或销毁的资源。
  • 应用 (Apply): Terraform 运行的第二个阶段,根据执行计划实际创建、修改或销毁基础设施资源。
  • 变量 (Variable): Terraform 配置中用于定义可变值的方式,可以是 Terraform 变量或环境变量。
  • 变量集 (Variable Set): 在 Terraform Cloud 中用于定义全局或应用于多个项目/工作空间的变量集合,常用于管理敏感信息或共享配置。
  • 敏感变量 (Sensitive Variable): 在 Terraform Cloud 中标记为敏感的变量,其值在 UI 或日志中会被隐藏或加密。
  • 模块 (Module): 一组相关的 Terraform 配置文件的容器,用于封装和复用基础设施配置。
  • 模块注册表 (Module Registry): 在 Terraform Cloud 中用于存储和管理私有 Terraform 模块的服务。
  • 状态文件 (State file): Terraform 用来跟踪其管理的基础设施资源实际状态的文件,记录了 Terraform 管理的所有资源的映射关系和属性。
  • RBAC (Role-Based Access Control): 基于角色的访问控制,一种安全机制,根据用户分配的角色来限制其对资源的访问权限。
  • GitOps: 一种基础设施管理实践,使用 Git 作为基础设施的单一事实来源,并通过自动化流程将 Git 仓库中的期望状态应用到基础设施中。
  • EKS (Amazon Elastic Kubernetes Service): 亚马逊提供的托管 Kubernetes 服务。

关键问题

  1. Terraform Cloud 中的项目(Project)是什么概念?
  2. 什么是 Terraform Cloud 中的工作空间(Workspace)?它有哪些类型的工作流程?
  3. 在 Terraform Cloud 中,版本控制工作流程(Version Control workflow)如何触发运行?
  4. 变量集(Variable Set)与工作空间变量(Workspace Variable)有什么区别?
  5. 为什么在使用 Terraform Cloud 模块时需要有标签(tags)?
  6. Terraform Cloud 运行计划(Plan)和应用(Apply)是两个不同的阶段。为什么在实际部署中建议由不同的人员执行这两个阶段?
  7. Terraform Cloud 的输出(Outputs)有什么作用?
  8. Terraform Cloud 的状态文件(State file)存储了什么信息?
  9. GitOps 方法论与 Terraform Cloud 的版本控制工作流程如何结合?
  10. 为什么在 Terraform Cloud 中,通过 Webhook 触发的运行在代码格式化更改时不会导致实际的基础设施变更?

回答

  1. 项目在 Terraform Cloud 中是一个逻辑分组的概念,用于将相关的工作空间和资源组织在一起,方便管理。
  2. 工作空间是 Terraform Cloud 中用来管理一组基础设施资源的构造。它有三种主要工作流程:版本控制、CLI 驱动和 API 驱动。
  3. 版本控制工作流程通过监控连接的版本控制系统(如 GitHub)中的代码仓库,当代码发生变化时,通过 Webhook 自动触发 Terraform 运行。
  4. 工作空间变量是特定于某个工作空间的变量,而变量集是可以应用于多个工作空间甚至整个项目的全局变量集合,常用于共享敏感信息或通用配置。
  5. 模块需要有标签是因为 Terraform Cloud 需要通过标签来识别模块的不同版本,以便用户可以选择和使用特定版本的模块。
  6. 建议由不同人员执行计划和应用阶段是为了实现职责分离(Segregation of Duties),增加一个审批环节,避免单一用户同时拥有计划和执行的权限,从而提高安全性。
  7. 输出在 Terraform Cloud 中用于显示 Terraform 运行完成后基础设施的一些重要信息或属性,方便用户或下游系统获取必要的数据。
  8. 状态文件记录了 Terraform 管理的基础设施的当前实际状态,包括资源的 ID、属性以及它们之间的依赖关系。
  9. GitOps 方法论与 Terraform Cloud 的版本控制工作流程高度契合,通过将基础设施配置存储在 Git 仓库中,并利用 Webhook 实现代码变化自动触发 Terraform 运行,从而实现基础设施的声明式管理。
  10. 在通过 Webhook 触发运行时,Terraform Cloud 会首先执行计划阶段。如果代码变化仅涉及格式化,计划阶段会发现没有基础设施资源需要创建、修改或销毁,因此不会进入应用阶段。

工作流

Terraform Cloud 工作空间支持三种主要工作流程:

  • 版本控制工作流程 (Version Control Workflow): 这是最常见的工作流程,它将工作空间与您的版本控制系统(如 GitHub、GitLab 等)连接起来。当您向关联的仓库推送更改时,Terraform Cloud 会自动触发运行(计划或应用)。这非常适合采用 GitOps 方法。
  • CLI 驱动工作流程 (CLI Driven Workflow): 这个工作流程允许您直接通过 Terraform CLI 命令与 Terraform Cloud 进行交互。您可以在本地编写和测试 Terraform 代码,然后使用 CLI 将其推送到 Terraform Cloud 执行。这提供了更大的灵活性,但也需要更多的手动操作。
  • API 驱动工作流程 (API Driven Workflow): 这个工作流程通过 Terraform Cloud API 进行交互。这通常用于自动化脚本或与其他系统集成,以编程方式触发和管理 Terraform 运行。

版本控制工作流程通常用于协作和自动化,而 CLI 和 API 工作流程则更适合特定的自动化需求或本地开发测试。

提高团队协作和安全性?

Terraform Cloud 通过以下方式提高团队协作和安全性:

  • 集中式状态管理: 所有团队成员共享同一个最新的状态文件,避免状态文件冲突和不一致。
  • 基于角色的访问控制 (RBAC): 您可以为不同的团队成员或角色分配不同的权限(例如,允许某些人计划,但只允许其他人应用),从而精细控制谁可以执行哪些操作。
  • 安全地管理敏感信息: 使用变量集和敏感变量功能,可以将敏感信息与配置代码分离,并进行加密存储,减少泄露风险。
  • 工作流程自动化: 版本控制工作流程和自动触发的运行可以标准化部署过程,减少人为错误。
  • 审计日志: Terraform Cloud 记录所有运行和操作,提供审计追踪,便于跟踪基础设施变化和故障排除。
  • 私有模块注册中心: 团队可以共享和重用经过审查和测试的内部模块,提高效率和一致性。

配置敏感信息

在 Terraform Cloud 中配置敏感信息,如 AWS 凭证,可以通过变量或变量集来完成。为了安全起见,建议使用变量集。变量集允许您创建一组可以在多个工作空间中重复使用的全局变量。在创建或编辑变量(无论是在工作空间级别还是变量集级别)时,您可以将其标记为“敏感”(Sensitive)。标记为敏感的变量其值将不会在 UI 中显示,并且会进行加密存储。

当使用变量集时,您在变量集中配置的敏感信息(如 AWS 访问密钥 ID 和 Secret 访问密钥)将自动应用于与该变量集关联的工作空间。这些信息在存储时是加密的,无法直接查看。