猿问

如何获取 terraform 提供程序中的资源名称

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


resource "example_server" "bob" {

  name = "server"

}

在 golang 代码中我想用作bobd.SetId() 的值


func resourceExsampleServerCreate(d *schema.ResourceData, meta interface{}) error {

  // do some stuff 

  d.SetId("bob")

}

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


RISEBY
浏览 80回答 1
1回答

慕斯709654

声明标头中给出的资源名称用于 Terraform 自己的跟踪,并且不可用于提供程序代码。造成这种情况的一个重要原因是,所讨论的名称本身没有用:它仅在完整资源实例地址的上下文中有用,在本例中是有用的,但在更实际的配置中可能会更复杂,example_server.bob例如example_server.bob[0],module.foo.example_server.bob, module.foo["bar"].example_server.bob[15], 等如果由 表示的远程对象类型需要远程系统中的example_server唯一名称,则建模的方法是为资源声明一个参数(通常称为,但您可以将其命名为对相关系统有意义的任何名称)并具有用户选择将其设置为:nameresource "example_server" "bob" {   name = "bob"}用户可能决定将这两个名称设置为与我上面显示的相同,但在实际配置中很少合适,因为通常name属于远程系统中比 Terraform 配置中的资源名称更广泛的命名空间,因此用户将希望将其设置为包含一些附加上下文的名称,以确保适当的唯一性,以避免单独配置和同一配置中单独模块之间的冲突。如果您想使用 name 参数值作为 id 那么您可以将其复制过来:  d.SetId(d.Get("name"))这是在不为每个对象分配代理键,而是使用对象的唯一名称作为唯一标识符的系统中表示对象的常见选择。Terraform 在每次应用后将您返回的数据与保存的状态快照中的完整资源地址相关联,因此作为提供程序开发人员,您根本不需要担心资源地址:Terraform 将为您提供上次返回的任何数据以便您可以用它来计划下一步的操作。
随时随地看视频慕课网APP

相关分类

Go
我要回答