跳过至主要内容

创建模块

模块 是一个容器,用于存储一起使用的多个资源。你可以使用模块来创建轻量级抽象,以便你可以根据其架构来描述你的基础架构,而不是直接根据物理对象来描述。

当你运行 tofu plantofu apply 时,工作目录中的 .tf 和/或 .tofu 文件一起形成了 模块。该模块可以 调用其他模块,并通过将一个模块的输出值传递给另一个模块的输入值来将它们连接在一起。

要了解如何使用 模块,请参阅 模块配置部分。本节介绍如何创建 可重用模块,其他配置可以使用 module 块来包含这些模块。

模块结构

可重用模块是使用我们在根模块中使用的所有相同 配置语言 概念定义的。最常见的模块使用

  • 输入变量 来接受来自调用模块的值。
  • 输出值 来将结果返回给调用模块,调用模块可以接着使用这些结果来填充其他地方的参数。
  • 资源 来定义模块将管理的一个或多个基础架构对象。

要定义模块,请为它创建一个新目录,并将一个或多个 .tf 文件放入其中,就像你对根模块所做的那样。OpenTofu 可以从本地相对路径或远程存储库加载模块;如果一个模块将被许多配置重复使用,你可能希望将其放在自己的版本控制存储库中。

模块也可以使用 module 块调用其他模块,但我们建议保持模块树相对扁平,并使用 模块组合 作为深层嵌套模块树的替代方案,因为这使得单个模块更容易以不同的组合重复使用。

何时编写模块

原则上,任何资源和构造的组合都可以分解为模块,但过度使用模块会导致你的整体 OpenTofu 配置更难理解和维护,因此我们建议适度。

一个好的模块应该通过描述你的架构中的一个新概念来提高抽象级别,该概念是由提供者提供的资源类型构建的。

例如,aws_instanceaws_elb 都是属于 AWS 提供者的资源类型。你可以使用模块来表示更高级别的概念“HashiCorp Consul 在 AWS 中运行的集群”,该概念恰好由这些资源和其他 AWS 提供者资源构建而成。

我们建议编写仅围绕单个其他资源类型进行薄包装的模块。如果你难以找到一个模块名称,而该名称不是与其中主要资源类型相同的名称,这可能表明你的模块没有创建任何新的抽象,因此该模块增加了不必要的复杂性。在这种情况下,请直接在调用模块中使用该资源类型。

重构模块资源

你可以包含 重构块 来记录资源名称和模块结构是如何从之前的模块版本中更改的。OpenTofu 在规划过程中使用这些信息,将现有的对象重新解释为它们是在相应的新的地址创建的,从而消除了单独的工作流步骤来替换或迁移现有的对象。