我研究并观看了一些关于管理多种环境的最佳方法的视频,但我仍然对如何以更好的方式管理它感到困惑。
假设我有一个具有以下结构的存储库:
main.tf
variables.tf
backend.tf
dev/
variables.tfvar
backend.dev.hcl
prod/
variables.tfvar
backend.production.hcl然后,在我的存储库中,我有两个分支(dev和main)。将生产变量值提交到我的dev分支有意义吗?遵循任何处理此场景的最佳实践的最佳方法是什么?
我的最后一个问题是,一旦向dev分支提交了任何更改,那么将更改合并到prod分支而不丢失任何dev/prod terraform配置的最佳方法是什么?
提前谢谢你!
发布于 2021-06-22 00:05:14
这个问题的答案通常取决于您讨论的是Terraform配置本身的多个部署阶段,还是在Terraform管理的基础设施上运行的任何应用程序/服务的多个部署阶段。
考虑这一区别的一种方法是考虑您将使用多个阶段来实现什么。如果您的目标是在生产中尝试运行terraform apply,那么您将讨论Terraform配置的多个部署阶段。如果您的目标是创建一个长期的准备环境,以便将您的应用程序/服务部署到其中,那么通常从部署管道的角度来看,暂存环境也是“生产”环境,因此通常应该这样处理。
要在将Terraform配置应用到“真正的基础设施”之前测试它们,可以使用Terraform CLI工作区创建与配置相关的临时附加状态,因此可以尝试应用更改而不影响“默认”工作区中表示的主要基础设施:
terraform workspace new temp-test创建临时工作区。default工作区中应用的提交。这通常在版本控制存储库的主分支上,但取决于您如何使用VCS,您可能需要选择更早的提交,以排除尚未应用于实际系统的任何更改。terraform apply创建与默认工作区等效的基础设施,作为测试的基础。terraform apply再次计划和应用新配置所表示的更改。terraform destroy破坏temp-test基础设施terraform workspace selectterraform workspace delete temp-test为此,您需要小心,在远程系统需要唯一名称的情况下,避免与现有的生产对象发生冲突。对于具有独立名称空间的帐户概念的系统,常见的选择是为测试使用不同的帐户和完全独立的凭据,这意味着您可以使用远程系统的访问控制,以避免意外中断“真正的”基础设施。
为了在自己的部署管道中为测试一些更高级别的组件创建一个长期的暂存或开发环境,需要一种不同的策略:在这种情况下,支持暂存环境的基础设施对于应用程序的部署过程来说是“生产”的一部分,因此通常应该这样建模。
为了实现这一点,同时确保除了有意的差异之外,这两个基础结构堆栈仍然是等价的,请将公共基础结构代码分解到一个或多个模块中,然后为生产基础结构调用这些模块一次,然后为其他环境的基础结构调用一次。
根据系统的预期故障域,您可以选择在一个配置中同时表示生产和暂存基础设施,其中包含对同一个模块的两个调用:
module "network-production" {
source = "../modules/network"
cidr_block = "10.1.0.0/16"
# etc...
}
module "network-production" {
source = "../modules/network"
cidr_block = "10.2.0.0/16"
# etc...
}或者,为了确保它们都是独立的可维护性,您可以编写两个单独的配置,它们都调用到同一个模块中,并分别对它们进行terraform apply。
在这两种情况下,这里的想法都是使用公共模块的输入变量来表示不同环境之间不可避免的差异,但在这两种情况下都保持声明的资源相同,但从应用程序管道的角度将它们作为“生产基础结构”来处理,方法是将它们都保存在一个名为default的名称空间中,无论是在一个配置中还是跨多个名称空间中,并同时使用版本控件中相同的主分支来表示这两个模块的“最新版本”。
如果您希望测试对您的配置的更改,这些更改一起表示应用程序管道所依赖的所有环境,则可以通过创建表示整个堆栈或特定环境的临时工作区,并在将分支合并到主分支并将其应用到默认工作区之前,将配置从分支应用到该堆栈中。
这个答案是对Terraform文档何时使用多个工作区中的指导的阐述。
不过,最终,在这种情况下,您有几种不同的选择,可以进行不同的权衡,我鼓励您在文档中查看此建议和其他相关上下文,并自行决定哪些建议最适合您的需要。Terraform是一个通用工具,用于解决各种不同的问题,最终只有您可以将特定的需求集映射到Terraform的特性上。
https://stackoverflow.com/questions/68069733
复制相似问题