如何在Terraform提供程序中获取资源名称

时间:2019-11-22 11:30:55

标签: go terraform

我尝试获取HCL中配置的资源名称,但需要在我的自定义提供程序的go代码中使用该值。

resource "example_server" "bob" {
  name = "server"
}

在golang代码中,我想使用bob作为d.SetId()的值

func resourceExsampleServerCreate(d *schema.ResourceData, meta interface{}) error {
  // do some stuff 
  d.SetId("bob")
}

计划是将bob的硬编码值替换为变量;)

1 个答案:

答案 0 :(得分:0)

声明标头中提供的资源名称用于Terraform自己的跟踪,提供程序代码不可用。

这样做的一个重要原因是所讨论的名称本身并没有用:它仅在完整的资源实例地址(在这种情况下为example_server.bob)的上下文中才有用。配置可能更复杂,例如example_server.bob[0]module.foo.example_server.bobmodule.foo["bar"].example_server.bob[15]等。

如果用example_server表示的远程对象类型在远程​​系统中需要唯一的名称​​ ,则建模的方法是为资源声明一个参数(通常称为{{ 1}},但您可以将其命名为对所讨论的系统有意义的任何名称),并让用户选择将其设置为以下内容:

name

用户可能会决定将两个名称设置为与我上面显示的相同,但是在实际配置中,这几乎是不合适的,因为resource "example_server" "bob" { name = "bob" } 通常比远程系统中的资源名称属于更广泛的名称空间。 Terraform配置,因此用户希望将其设置为包含一些其他上下文的名称,以确保适当的唯一性,以避免不同配置与同一配置中不同模块之间发生冲突。

如果您想使用name参数值作为id,则可以将其复制过来:

name

这是在不为每个对象分配代理键,而是使用对象的唯一名称作为唯一标识符的系统中表示对象的常见选择。

Terraform在每次应用后将返回的数据与保存的状态快照中的完整资源地址相关联,因此,作为提供者开发人员,您完全不必担心资源地址:Terraform将为您提供返回的任何数据从上一个操作开始,以便您可以使用它来计划下一个操作。