IaC: 简洁 Or 灵活?

2024-08-27 19:14:03 浏览数 (1)

最近在搞 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啥的

0 人点赞