Module Terraform-单资源模块总是坏的吗?

Module Terraform-单资源模块总是坏的吗?,module,terraform,dry,Module,Terraform,Dry,我决定学习更多关于Terraform的知识,看看是否可以使用Terraform复制我在控制台中手动执行的操作。我设置了两个虚拟机,一个是可公开访问的,另一个不是,必须通过第一个虚拟机访问。除了防火墙规则外,这两个虚拟机几乎完全相同 为了保持干燥,我想我应该创建一个模块,这样我就不必重复两个VM的所有选项,只需指定差异。由于我不确定如何创建模块,我查看了文档,发现如下内容: 何时编写模块 [……] 我们不建议编写仅仅是围绕单个其他资源类型的薄型包装的模块。如果您很难找到与模块中的主资源类型不同的模

我决定学习更多关于Terraform的知识,看看是否可以使用Terraform复制我在控制台中手动执行的操作。我设置了两个虚拟机,一个是可公开访问的,另一个不是,必须通过第一个虚拟机访问。除了防火墙规则外,这两个虚拟机几乎完全相同

为了保持干燥,我想我应该创建一个模块,这样我就不必重复两个VM的所有选项,只需指定差异。由于我不确定如何创建模块,我查看了文档,发现如下内容:

何时编写模块 [……]

我们不建议编写仅仅是围绕单个其他资源类型的薄型包装的模块。如果您很难找到与模块中的主资源类型不同的模块名称,这可能表明您的模块没有创建任何新的抽象,因此模块增加了不必要的复杂性。只需直接在调用模块中使用资源类型即可

资料来源:

对我来说,发布一个仅仅是单个资源的包装器的模块可能没有那么有用,但对于配置中的内部使用,它似乎是一个使配置干燥的有用工具。如果所有虚拟机的10个参数中有9个是相同的,为什么不创建一个模块来隐藏主配置中的9个常用参数,而不重复它们


由于我对Terraform还不熟悉,我只想确保我没有教自己坏习惯。

我认为干燥/标准化是使用薄包装的一个非常有效的理由。或者,您可以在链的更上层的共享代码中定义公共参数。我能看到两者的好处和坏处,我很好奇是否有人能说,在地形方面,两者中的任何一个通常都更糟糕;还有其他设计实践可用于实现干燥。在您描述的特定情况下,模块可能是朝着错误方向迈出的一步,因为它会混淆您的配置,并创建大量的配置供深入研究。在您的案例中,您可能应该使用可变的防火墙规则遍历单个资源,因为这更接近于最佳实践。@MattSchuchard这正是我提出此问题的原因。因为我对Terraform还不熟悉,我不知道我有什么选择。我为每个人读了
,看起来这是一个不错的选择。尽管如此,即使在官方的
for_each
示例中,他们也在使用一个模块来包装资源“aws_instance”,可能是为了使配置干燥。也许结论应该是没有既定的最佳实践,这取决于你的最佳判断?我认为干燥/标准化是使用薄包装的一个非常有效的理由。或者,您可以在链的更上层的共享代码中定义公共参数。我能看到两者的好处和坏处,我很好奇是否有人能说,在地形方面,两者中的任何一个通常都更糟糕;还有其他设计实践可用于实现干燥。在您描述的特定情况下,模块可能是朝着错误方向迈出的一步,因为它会混淆您的配置,并创建大量的配置供深入研究。在您的案例中,您可能应该使用可变的防火墙规则遍历单个资源,因为这更接近于最佳实践。@MattSchuchard这正是我提出此问题的原因。因为我对Terraform还不熟悉,我不知道我有什么选择。我为每个人读了
,看起来这是一个不错的选择。尽管如此,即使在官方的
for_each
示例中,他们也在使用一个模块来包装资源“aws_instance”,可能是为了使配置干燥。也许结论应该是没有既定的最佳实践,这取决于你的最佳判断?