如何构建Terraform存储库以在模块之间共享数据

时间:2020-04-05 15:56:13

标签: terraform

我有一个git存储库来控制我的基础架构部署。我有一个本地OpenStack实例,并且同时使用Azure和AWS。最近,我开始添加大量数据,并且我想重构一下git存储库,在层次结构中添加模块。我意识到我想拥有很多共享数据,以避免重复。我将举一些我可以在各种VM上使用的东西的例子:

  • 图片(Ubuntu 18.04,Debian Buster等)
  • 香料(vCPU,RAM等的大小不同)
  • 我使用浮动IP地址的子网池(不同的公共IP地址池)
  • 安全组(具有通往Internet,本地互连等的不同开放端口)
  • 网络(我在其中划分VM的内部网络)

我想拥有这种层次结构:

/
├── local
│   ├── main.tf
│   ├── flavors
│   │   └── main.tf
│   ├── security-rules
│   │   ├── main.tf
│   │   └── sec-rule1
│   │       └── main.tf
│   └── vms
│   │   ├── main.tf
│   │   └── vm1
│   │       └── main.tf
|   ├── etc.
|   ...
├── aws
|   ...
├── azure
|   ...
└── main.tf

当我开始使用它时,我意识到我无法轻松地在不同模块之间共享数据。例如,当我想创建一个新的虚拟机时,我想引用(按名称或ID)其他模块的风格,安全组等。我知道我可以使用Input VariablesOutput Values和/或Dependency Inversion,但是我最终会遇到麻烦的设置,很多棘手的结构只能共享一个简单的字符串。

出于各种原因,我想避免像现在这样使用硬编码的字符串(例如,带有图像ID或安全组):

  • 有必要先创建一些资源,然后将其应用到Terraform中。
  • 仅在对Terraform进行更改时(而不是在计划期间)发生任何名称或ID错误。因此,无法在计划期间进行验证,并且将错误的提交应用于 存储库。

是否存在使用对其他模块中ID或名称的引用来构建git存储库的良好做法?

免责声明:我已经在官方文档中阅读了这句话:

但是,在大多数情况下,我们强烈建议保持模块树平坦,只有一个子级模块...

-> https://www.terraform.io/docs/modules/composition.html

但是遵循这个规则,我将以成千上万行的文件结尾...?

0 个答案:

没有答案