例如,我对基础架构进行了增量更改,例如[A] -> [B] -> [C]
,其中[A]
可以分别为一个名为i
的服务器,[B]
可以分别为名为{{{ 1}}和j
分别可以是名为[C]
的第三个服务器。总共应该有3台服务器。每个州都可以描述为k
,其中[A] = x, x + [B] = y, y + [C] = z
是中间的州。
我的问题是
x, y, z
并获取[B]
- 州或我们应该关注从最后一个模块x
到中间[C]
所需的链?答案 0 :(得分:2)
此时Terraform仅考虑两个状态 [1] :“当前状态”(前一个Terraform的运行结果以及平均时间内的任何“漂移”)和“期望” state“(在配置中描述)。 Terraform的任务是确定这两种状态之间的差异,并确定将资源从当前状态转移到所需状态所需的API动作。
这意味着任何多步骤转换都不能仅在Terraform中进行编排。在您的示例中,要添加服务器j
,您可以将其单独添加到Terraform配置中,并运行Terraform来创建该服务器。然后,您可以将服务器k
添加到配置中,然后再次运行Terraform。要自动执行此操作,外部进程需要生成这些渐进式配置更改。
另一种方法 - 虽然不建议日常使用,因为它可能会导致协作环境中的混淆,而其他人无法轻易看到这种状态是如何到达的 - 是使用-target
参数指定一个或多个要操作的特定资源。原则上,这允许将两个服务器j
和k
添加到配置中,然后使用-target
仅使用代表j
的资源。
Terraform中没有正式的回滚支持。 Terraform仅将此视为另一个“向前滚动”的状态转变。例如,如果在创建服务器k
之后,您希望恢复为状态[A]
,则可以删除服务器k
的配置(通过在版本控制中恢复)并再次应用。 Terraform没有意识到这是一个“回滚”的事实,但它可以看到配置不再包含服务器k
因此知道它需要被销毁达到理想状态。
您的一个问题是“影响以前的模块”。通常,如果未对配置中的资源进行任何更改(配置已更改,或资源本身在Terraform的权限范围之外更改),则Terraform不应尝试更新它。如果是这样,那将被视为一个错误。但是,对于较大的系统,将基础架构拆分为多个顶级Terraform配置(每个配置都单独应用)可能很有用。如果正在使用远程后端(建议用于协作环境),则the terraform_remote_state
data source可用于从另一个配置中访问一个配置的输出值,从而允许创建Terraform配置的树或DAG。这增加了复杂性,因此应该仔细权衡,但具有通过完全考虑不相关的资源来减少特定变化的“爆炸半径”的优点。
[1] 我在这里使用“状态”是一般意义上你使用它,这与Terraform的“状态”的物理概念不同,这是一个包含资源记录的数据文件在最后一次运行中存在。