如何将 terraform 文件(main.tf)拆分为多个文件(无模块)?

Posted

技术标签:

【中文标题】如何将 terraform 文件(main.tf)拆分为多个文件(无模块)?【英文标题】:How to split a terraform file (main.tf) in several files (No Modules)? 【发布时间】:2020-01-19 22:36:44 【问题描述】:

我有一个通过 Terraform 部署的 GCP 基础架构:存储桶、服务帐户、计算引擎、VPC、云 SQL、BigTable、BigQuery、Composer 等。

Terraform v0.11.10 提供者“谷歌”(2.15.0)

最近客户要求我将我们仅有的一个 terraform 文件(例如 main.tf)拆分为多个文件。例如:一个文件用于存储桶,另一个用于服务帐户,另一个用于数据库服务等。

我在 GCP 存储桶中只有一个 terraform 状态文件。

我怎样才能以最小的影响做到这一点?那么 terraform 状态呢? (是否还会有多个状态文件?或者是只保留一个 TF 文件的想法,即使我们将代码拆分出来?)

注意:这与 Terraform 模块无关,只是将单个 terraform 文件 (.tf) 分成多个文件 (.tf)

提前致谢!

【问题讨论】:

【参考方案1】:

您可以按照https://marcelzehner.ch/2018/05/22/terraform-using-multiple-files-for-configurations-and-variables 进行尝试。我相信它在您的场景中会很有用。

【讨论】:

链接可能失效;可以参考它们,但不应依赖它们来形成答案。请在此处添加答案。 meta.stackexchange.com/questions/8231/…【参考方案2】:

我只想澄清 trallnag 的查询,并在 Martin 的回答基础上补充一点,我认为您不能在这些单独的文件中使用相同的属性。刚才我遇到了以下错误。

Multiple Files of main.tf and error was thrown for the required providers attribute within the terraform block in two different files (main.tf & dockermain.tf)

【讨论】:

请对您的回答进行详细的解释,以便下一个用户更好地理解您的回答。此外,请提供链接内容的基本介绍,以防将来停止工作。【参考方案3】:

即使您的项目中没有包含任何模块。 Terraform 始终在单个根模块的上下文中运行。 .tf 文件位于 root 模块下。

基于 Terraform 文档:

Terraform 评估模块中的所有配置文件,有效地将整个模块视为一个文档。将各个块分成不同的文件纯粹是为了方便读者和维护者,对模块的行为没有影响。

https://www.terraform.io/docs/language/files/index.html#directories-and-modules

【讨论】:

【参考方案4】:

Terraform 不会对您使用的文件名和拥有的文件数量赋予任何特殊含义。相反,Terraform 会读取所有 .tf 文件并一起考虑它们的内容。

因此,您可以随意将 main.tf 文件中的块移动到同一目录中的任意多个单独的 .tf 文件中,只要您在当你做这些块的内容。

(Override Files 有一个特殊情况,这使得上述内容不完全正确。只要您避免将任何文件命名为override.tf 或使用_override.tf 后缀,该特殊情况将不适用,但我'我只是为了完整性而提到它。)

【讨论】:

但是资源名称呢?我可以在多个文件中使用相同的组合。 file1.tf 资源“类型”“这个” file2.tf 资源“类型”“这个”【参考方案5】:

命令terraform apply 可以应用于文件或目录according with the documentation。因此,将所有文件放在一个目录中并应用它们。

tfstate 文件与部署相关。你将只有一个。

关于最低影响...很难说。一切都取决于您的变量和资源依赖项。如果您必须搜索多个文件以了解资源的创建方式或变量设置的位置,那么多个文件并不是一个好主意......但是,这是您的客户要求,并且为了可读性而做起来要简单得多。

【讨论】:

以上是关于如何将 terraform 文件(main.tf)拆分为多个文件(无模块)?的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 中的相对路径

Terraform - 无法将字符串变量传递给子模块

Terraform 管理阿里云 VPC

将 Terraform 变量中的数字传递给 Ansible Playbook

使用 terraform 创建多个 GCP 存储桶

地形中的for循环