Infrastructure-as-Code / Technology · 2021年1月29日

Terraform如何部署多个环境?

Terraform作为一个很好的DevOps工具,目前被越来越多人来使用。对于一个小项目或者个人的项目来说,通常只需要关注一个环境,Terraform的基本操作(plan、apply、destroy……)就可以胜任。 我们假设你POC了一个小项目,用Terraform部署了环境,然后你去给领导或者别的组做了演示,大家都说好。然后,大家纷纷想用上你这个项目,或者怂恿你把你的项目(或称为工具)集成到Jenkins里供所有人使用。 OK,现在你开始想些事情:
  1. 如何保证每个人都有自己环境的configuration?
  2. 如何保证大家同时apply?
  3. 如何保证每个人在destroy时,能不影响别人的环境?
有两种方法。

多目录

多目录其实很好理解,就是每个人或者每个项目独自有一个目录。 比如同时有一个开发环境一个生产环境,那么多目录的结构大约是这样的:
这样做的好处是每个目录“物理隔离”,它们都有自己的tfstate文件,即使是在同时运行的时候也不会干扰到对方。 缺点是同样的代码会“拷贝”多份。恩……这个其实也不能称为缺点了,因为在这个例子中,可能Dev和Production的代码就要求不一样。Blue-Green嘛。 第二种,是Terraform比较推荐的方法,用Workspace。 使用Workspace后,就跟建了个Branch一样。切换到不同的Workspace后运行后,一个新的目录terraform.tfstate.d会自动生成,不同Workspace生成的tfstate文件将会分别存在这个目录下的子目录,来用于区分。 切换到不通Workspace后,你可以通过-var-file参数传入不同的Variables,来部署不同的环境。 这样做的好处是一份代码,而且Workspace之间切换非常方便。 我发现的一个缺点是在同时运行的时候,还是会出现Provider竞争的情况,应该有方法解决,比如把冲突的部分也写成参数,然后传入。
我个人还是比较喜欢多目录的方法,简单清晰,并且不容易出错。但是在开发过程中,可能会遇到在一个目录下修正了的代码忘记同步到另一个目录下的情况。不过我都是写脚本部署,一切交给自动化。 还一个小技巧是在多目录下,公用的文件用Link代替硬拷贝。 就这些,希望我回答了这个问题,不足之处请指正。 参考文章:《Separate Development and Production Environments