最近在搞 devops,记录一下对 Infrastructure as code 代码风格的一点感悟
直接从一个例子展开吧
假如需要将原来单账号下以下多网络分别创建到单独的账号下
为了网络创建复用自然需要使用 module 去按账号构建
(别想动态指定 provider,terraform 不支持!)
那问题是怎么将 vpc 的配置按账号分组传递给对应的 module
来看两种方案
方案一:动态分组
给每个 vpc 配置加 acct_key, 然后代码动态分组
聚合那里代码需要两段,主要是 terraform 的默认聚合,只会按 key 相同合并成 array,但我们其实是要把 array 的每个元素合并成一个 object, 方便后续按网络的 key 去索引资源创建的结果
(比如 module 输出了 vpc 资源的创建结果 vpcs,就可以用 module.acct_a_vpcs.vpcs.network1 拿到 network1 的结果)
聚合后结果如下:
这不是程序员最擅长的代码封装么,配置没怎么变,代码动态一聚合就完成了变更的需求,灵活吧。
等等,再来看一个方案
方案二:静态分组
就是配置按账号重新拆分
然后使用时按账号获取配置就是一目了然的事
整体看下来两种方案好像都差不多,但如果考虑代码的简洁与配置聚合的粒度的话,第二种就更胜一筹
毕竟对于 IaC 而言,一目了然的简洁比复杂的代码抽象更易于维护,基础设施的配置文件本来就不应该搞复杂。
哈哈, 代码封装也有碰壁的时候。
当然也有需要代码封装的时候,比如把多个账号的vpcs结果合并起来,便于其他资源跨账号按vpc key查询资源id,路由表id啥的