如何组织Terraform增量变更?

时间:2017-06-29 07:17:57

标签: terraform

你可以帮助我理解

吗?

例如,我对基础架构进行了增量更改,例如[A] -> [B] -> [C],其中[A]可以分别为一个名为i的服务器,[B]可以分别为名为{{{ 1}}和j分别可以是名为[C]的第三个服务器。总共应该有3台服务器。每个州都可以描述为k,其中[A] = x, x + [B] = y, y + [C] = z是中间的州。

我的问题是

  • 如何在不影响以前模块的情况下为Terraform中的多个模块组织增量基础架构更改?
  • 是否可以回滚链中间的变化,例如。 x, y, z并获取[B] - 州或我们应该关注从最后一个模块x到中间[C]所需的链?

1 个答案:

答案 0 :(得分:2)

此时Terraform仅考虑两个状态 [1] :“当前状态”(前一个Terraform的运行结果以及平均时间内的任何“漂移”)和“期望” state“(在配置中描述)。 Terraform的任务是确定这两种状态之间的差异,并确定将资源从当前状态转移到所需状态所需的API动作。

这意味着任何多步骤转换都不能仅在Terraform中进行编排。在您的示例中,要添加服务器j,您可以将其单独添加到Terraform配置中,并运行Terraform来创建该服务器。然后,您可以将服务器k添加到配置中,然后再次运行Terraform。要自动执行此操作,外部进程需要生成这些渐进式配置更改。

另一种方法 - 虽然不建议日常使用,因为它可能会导致协作环境中的混淆,而其他人无法轻易看到这种状态是如何到达的 - 是使用-target参数指定一个或多个要操作的特定资源。原则上,这允许将两个服务器jk添加到配置中,然后使用-target仅使用代表j的资源。

Terraform中没有正式的回滚支持。 Terraform仅将此视为另一个“向前滚动”的状态转变。例如,如果在创建服务器k之后,您希望恢复为状态[A],则可以删除服务器k的配置(通过在版本控制中恢复)并再次应用。 Terraform没有意识到这是一个“回滚”的事实,但它可以看到配置不再包含服务器k因此知道它需要被销毁达到理想状态。

您的一个问题是“影响以前的模块”。通常,如果未对配置中的资源进行任何更改(配置已更改,或资源本身在Terraform的权限范围之外更改),则Terraform不应尝试更新它。如果是这样,那将被视为一个错误。但是,对于较大的系统,将基础架构拆分为多个顶级Terraform配置(每个配置都单独应用)可能很有用。如果正在使用远程后端(建议用于协作环境),则the terraform_remote_state data source可用于从另一个配置中访问一个配置的输出值,从而允许创建Terraform配置的树或DAG。这增加了复杂性,因此应该仔细权衡,但具有通过完全考虑不相关的资源来减少特定变化的“爆炸半径”的优点。

[1] 我在这里使用“状态”是一般意义上你使用它,这与Terraform的“状态”的物理概念不同,这是一个包含资源记录的数据文件在最后一次运行中存在。