我正在使用status = tainted的定义的自定义提供程序内部做一些令人讨厌的事情
我知道我可以使用TF CLI污染/取消污染资源。 我也知道,terraform仅会在失败的创建调用中留下污点。
我也想污染更新。
我想知道是否可以通过编程方式从提供程序内部设置污点状态,但是terraform API有点限制性。
有人知道吗?
答案 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
更改。