我们已经广泛地使用 Terraform 来创建和管理云基础设施。根据我们的经验,在建立较大规模的基础设施时,代码往往会被拆分为若干个模块,并通过不同的方式被引入到基础设施的创建中,但是这种做法缺乏灵活性,进而会导致无法避免的代码重复,并最终会使团队停滞不前。我们通过使用 Terragrunt 来解决这个问题, 它是基于 Terraform 的一个很薄的包装层,它实现了 Yevgeniy Brikman 的 Terraform: Up and Running 倡导的实践。我们发现 Terragrunt 非常有用,它鼓励多环境的版本化模块和可复用性。生命周期钩子作为另一个非常有用的特性提供了更多的灵活性。在打包方面,Terragrunt 与 Terraform 具有相同的局限性:即没有一个合适的方式来定义包以及包与包之间的依赖关系。但是我们可以使用模块并指定一个与 Git 标签相关联的版本号来解决这个问题。
We widely use Terraform as code to configure a cloud infrastructure. Terragrunt is a thin wrapper for Terraform that implements the practices advocated by the Terraform: Up and Running book. We've found Terragrunt helpful as it encourages versioned modules and reusability for different environments with some handy features, including recursive code execution in subdirectories. We'd like to see the tool evolve to support CD practices natively, where all code can be packaged, versioned and reused across different environments on CD pipelines. Our team achieves this today with workarounds.