【问题标题】:How to tell a Terraform provider what a new value should be when PlanResourceChange is called如何在调用 PlanResourceChange 时告诉 Terraform 提供者应该是什么新值
【发布时间】:2021-06-14 06:17:51
【问题描述】:

我正在阅读有关 Terraform 中的 underpinnings of providers 的信息。在我的例子中,我有两个属性作为改变服务器电源状态的资源的一部分。他们是desired_power_action,另一个是power_statedesired_power_action 可能类似于 FORCE_OFF。完成此操作后,我希望 power_stateoff

desired_power_action 是必填字段,power_state 是计算字段。据我了解,在计划阶段,它会将desired_power_action 投影为用户选择的任何内容。事实上,在我的提供者中,我只是将其设置为用户说他们想要的任何内容,因为这只是他们想要设置的内容。但是对于power_state,我不确定如何在我的提供程序代码中告诉 Terraform,如果用户将desired_power_action 设置为FORCE_OFF,那么power_state 的预计值就是off

我知道如何在申请时设置该值,但我如何在计划时告诉 Terraform power_state应该在申请后为 XXXXXX?

还是我误会了,这不是我需要做的事情?

【问题讨论】:

  • 如果您可以链接到资源文档,这可能会有所帮助。
  • 你不应该在这里做任何事情,而是应该在计划中说它是计算出来的,并在终端的计划输出中显示(known after apply)。您在这里看到其他问题吗?
  • 您是使用the official SDK 编写提供程序,还是直接针对有线协议进行编程?答案会因具体情况而大不相同,因为 SDK 在有线协议之上添加了一些额外的抽象。
  • @MartinAtkins 官方 SDK

标签: terraform terraform0.12+


【解决方案1】:

您在此处链接到的“资源实例更改生命周期”文档是从 Terraform Core 开发人员的角度编写的,因为它的文档主要针对为 Terraform Core 做出贡献的人,而不是提供程序开发人员。

Terraform SDK 团队还参考了此文档,以了解 SDK 应保证哪些不变量,但 SDK 随后会在较低级别的模型之上添加自己的抽象,以便更方便地开发 Terraform 提供程序适合常用的模式。

在您的情况下,我想您已经注意到原始协议要求 PlanResourceChange 为资源类型上的每个“计算”属性提供一个值,它可以使用“未知值”占位符(在 Terraform 的 UI 中转换为 (known after apply))或者(如果提供者知道足以预测最终值)它可以返回一个具体值,该值必须与 ApplyResourceChange 最终返回的值相匹配。

默认情况下,SDK 将通过将所有计算属性设置为“未知”来响应PlanResourceChange,因此实际上大多数资源类型不包含任何特殊逻辑。但是,在像您这样可以预测的情况下,您可以选择通过填充 schema.ResourceCustomizeDiff 字段来自定义默认行为。

CustomizeDiff 回调接收 schema.ResourceDiff 对象,它类似于 schema.ResourceData,但包含一些额外的方法来处理差异包括每个参数/属性的旧值和新值这一事实。

在您的情况下,您可以编写一些逻辑来在您知道具体新值的情况下有条件地调用SetNew。然后,SDK 将在其 PlanResourceChange 响应中返回它,而不是返回未知值的默认行为。

【讨论】:

  • 我知道我们不应该在 cmets 中感谢您的笔记,但我不知道该放在哪里。感谢您的回复 - 这为我填补了很多空白,并且在我了解所有这些如何组合在一起时非常有帮助。
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多