【问题标题】:Using terraform modules with in modules在模块中使用 terraform 模块
【发布时间】:2021-06-26 09:49:39
【问题描述】:
我们正在为我们的组织中的 Azure 云创建各种 terraform 模块。我对使用这些模块有一个基本的疑问。
假设我们创建了一个用于创建资源组的模块。当我们为存储容器编写模块时,最好使用存储模块本身内部的资源组模块,还是让用户 terraform 脚本处理它指定多个模块资源。例如,
module resourcegroup {
…
}
module storage {
}
谢谢,
猎犬
【问题讨论】:
标签:
terraform
terraform-provider-azure
【解决方案1】:
您在这里考虑的是设计权衡,而不是具有通用答案的问题。话虽如此,Terraform 文档部分Module Composition 建议您尽可能只使用一层模块嵌套,然后让根模块将一个模块的输出连接到另一个模块的输入。
您可能决定违背该建议并创建多层嵌套的一种情况是,当您想要编写一个模块时,该模块有意限制或提高其他人编写的另一个模块的抽象级别。在Terraform Registry 上共享的模块通常非常通用,以便服务于各种不同的用例,但这些模块也可能封装了相关系统的一些设计最佳实践,因此您可以选择封装一个或多个这些通用模块在更具体的模块中更直接地满足您的用例,并希望反过来使您的“包装模块”更易于使用。
但是,请务必牢记,尽管 Terraform 模块在某种意义上可以封装复杂性,但在 Terraform 的情况下,它们并不能真正隐藏我们对库的期望方式那样的复杂性在通用语言中,因为 root 模块的维护者最终负责了解应用计划的全部后果,这包括审查所有提议的更改,甚至是嵌套在嵌套模块中的资源。