Terraform Provider:在更新时从提供商内部设置污染状态

时间:2019-09-06 16:13:50

标签: terraform

我正在使用status = tainted的定义的自定义提供程序内部做一些令人讨厌的事情

我知道我可以使用TF CLI污染/取消污染资源。 我也知道,terraform仅会在失败的创建调用中留下污点。

我也想污染更新。

我想知道是否可以通过编程方式从提供程序内部设置污点状态,但是terraform API有点限制性。

有人知道吗?

1 个答案:

答案 0 :(得分:2)

创建资源后,无法控制其污染状态。 Terraform仅在内部使用此跟踪来知道创建失败,因此需要在后续运行中清理可能损坏的对象。

但是,污染只是可能需要替换而不是在计划中更新对象的原因之一。在提供程序代码中,您可以控制特定属性(在SDK中称为ForceNew)上的“需要新资源”标志。

标记“需要新资源”的最常见方法是在给定属性上静态设置ForceNew,如果SDK检测到值已更改,则让SDK自动为您设置标志。但是,如果您对资源类型实现CustomizeDiff,则可以使用所需的任何逻辑来做出决定,并最终调用ForceNew on the ResourceDiff object

通常我们会用它来表示用户 所做的更改需要替换,但这不是必须的。您还可以在此处传递Computed属性的名称,只要实际计划更改其值,Terraform都会使用它。

如果没有自然存在的属性可以自然地表示需要替换的任何条件,则可以添加一个新属性,该属性仅表示 表示对象的“健康”状态,可能称为status,然后如果您在Read期间检测到它处于不良状态,则可以致电d.Set("status", "error")。然后,在CustomizeDiff中,您可以检查status是否为"error",如果是,请依次调用d.Set("status", "ok")d.ForceNew("status")来表示从错误状态到OK状态的转换(如果需要)对象替换。

然后应在计划中显示该属性,就像“需要替换”的任何其他属性一样:

    ~ status = "error" => "ok" # requires replacement

...,并且Terraform将根据用户是否设置-/+将其显示为+/-create_before_destroy更改。