【问题标题】:Can terraform providers generate implicit output variables?terraform 提供程序可以生成隐式输出变量吗?
【发布时间】:2020-05-13 02:20:42
【问题描述】:

自定义 terraform 提供程序是否可以隐式生成输出变量,即无需 terraform 用户在其 .tf 文件中定义输出变量?

更多上下文——我们有一个系统调用用户的 terraform 脚本,并希望检测资源的存在。是否可以在无需解析用户的 terraform 的情况下确定是否使用了资源?想法是与此资源相关联的提供者可以通过某种方式通过输出变量发布其存在,或产生一些外部副作用。

【问题讨论】:

  • 你能通过terraform state showterraform.io/docs/commands/state/show.html查询指定资源的状态文件吗?
  • 需要考虑一下。根据我的阅读,状态的地址包括资源名称,而不是仅通过资源类型查找资源状态的工具。 ...也许是 terraform 状态列表,并进行前缀搜索。

标签: terraform


【解决方案1】:

这个问题的答案在一定程度上取决于您所说的“现有”资源是什么意思。根据您对模块输出的引用,我认为您可能打算将资源的一个或多个实例记录在 Terraform 状态中。如果是这样,您可以执行terraform show -json 来获取a JSON representation of what's currently recorded in the state

在该 JSON 输出中,您可以遍历模块中的 resources 数组以查看其中的所有资源实例。每个都有一个address 属性,以通常的 Terraform 语法给出资源实例地址,例如aws_instance.example[0]


如果您的意思是配置中是否存在某些东西,无论它是否已经被创建并记录在状态中,目前没有任何内置方法可以在不解析的情况下获得该答案Terraform 配置本身。

HashiCorp 有一个帮助程序库terraform-config-inspect,它与一个可以生成检查结果的 JSON 表示的小工具相关联;使用它至少可以避免您必须重新实现 HCL 解码,但随着 Terraform 语言未来的发展,您可能需要继续升级到该库的更新版本。

例如,the Terraform Registry 使用该库来提取有关模块的元数据。与 Terraform 本身所做的解析/解码相比,它的一个关键优势是它尝试支持自 Terraform 0.10 以来的所有版本的 Terraform 语言,以便注册表可以提取模块的元数据,而不管它们编写的是哪个版本的 Terraform为了。但是,它只能帮助向后兼容性,因为该库无法预测以后可能会向该语言添加哪些新功能。

【讨论】:

  • 感谢分享这些链接。就本 Q 而言,前一种解释适用,并且遍历状态以查找资源 + 匹配前缀应该有效。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 2021-03-26
  • 2021-05-03
  • 2019-05-19
  • 2018-12-15
  • 2019-12-22
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多