无法设置此字段 - Terraform 自定义提供程序
This field cannot be set - Terraform custom provider
我是为 terraform 创建自定义提供程序的新手。我正在尝试从 tf 文件中获取一些值。但是我遇到了一些错误。
Error: "tags": this field cannot be set
这是我的示例代码
main.tf
# This is required for Terraform 0.13+
terraform {
required_providers {
example = {
version = "~> 1.0.0"
source = "example.com/sd/example"
}
}
}
resource "example_server" "my-server" {
address = "1.2.3.4"
sensitive_map {
key = "foo"
value = "dddd"
}
tags = {
env = "development"
name = "example tag"
}
}
这是我的资源提供程序文件。
func resourceServer() *schema.Resource {
return &schema.Resource{
Create: resourceServerCreate,
Read: resourceServerRead,
Update: resourceServerUpdate,
Delete: resourceServerDelete,
Schema: map[string]*schema.Schema{
"address": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"tags": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
}
}
func resourceServerCreate(d *schema.ResourceData, m interface{}) error {
logs.Info("Creating word")
address := d.Get("address").(string)
// tags := d.Get("tags").(interface{})
// keyval := tags.(map[string]interface{})
d.SetId(address)
log.Printf("[WARN] No Server found: %s", d.Id())
f, err := os.OpenFile("/home/sdfd/Desktop/123.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
panic(err)
}
defer f.Close()
tmps := d.Get("tags").(map[string]interface{})
address += tmps["env"].(string)
address += tmps["name"].(string)
if _, err = f.WriteString(address); err != nil {
panic(err)
}
return nil
}
我找不到确切的错误。日志也不在终端中打印。谁能帮忙解决这个问题?
提前致谢
用于定义属性或嵌套块的 schema.Schema
对象必须 始终 至少具有 Required: true
、Optional: true
或Computed: true
设置。
Required
和Optional
都表示该参数是可以在配置中设置的参数。由于您没有为 tags
设置它们,SDK 拒绝在配置中设置 tags
的尝试。
Computed
表示提供者本身将决定该值。这可以单独使用,也可以与 Optional
结合使用。如果同时设置 Optional
和 Computed
那么这意味着当(且仅当)用户在配置中未设置它时,提供者将提供自己的值.
因为你的意图似乎是 tags
由用户在配置中设置,我认为这里的答案是将其标记为 Optional
:
"tags": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Optional: true,
},
上面的意思是可以在配置中设置,但用户不需要设置。如果用户未设置它,那么您的提供商代码会将其视为地图的内置默认占位符值,这是一个空地图。
我是为 terraform 创建自定义提供程序的新手。我正在尝试从 tf 文件中获取一些值。但是我遇到了一些错误。
Error: "tags": this field cannot be set
这是我的示例代码
main.tf
# This is required for Terraform 0.13+
terraform {
required_providers {
example = {
version = "~> 1.0.0"
source = "example.com/sd/example"
}
}
}
resource "example_server" "my-server" {
address = "1.2.3.4"
sensitive_map {
key = "foo"
value = "dddd"
}
tags = {
env = "development"
name = "example tag"
}
}
这是我的资源提供程序文件。
func resourceServer() *schema.Resource {
return &schema.Resource{
Create: resourceServerCreate,
Read: resourceServerRead,
Update: resourceServerUpdate,
Delete: resourceServerDelete,
Schema: map[string]*schema.Schema{
"address": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"tags": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
}
}
func resourceServerCreate(d *schema.ResourceData, m interface{}) error {
logs.Info("Creating word")
address := d.Get("address").(string)
// tags := d.Get("tags").(interface{})
// keyval := tags.(map[string]interface{})
d.SetId(address)
log.Printf("[WARN] No Server found: %s", d.Id())
f, err := os.OpenFile("/home/sdfd/Desktop/123.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
panic(err)
}
defer f.Close()
tmps := d.Get("tags").(map[string]interface{})
address += tmps["env"].(string)
address += tmps["name"].(string)
if _, err = f.WriteString(address); err != nil {
panic(err)
}
return nil
}
我找不到确切的错误。日志也不在终端中打印。谁能帮忙解决这个问题?
提前致谢
用于定义属性或嵌套块的 schema.Schema
对象必须 始终 至少具有 Required: true
、Optional: true
或Computed: true
设置。
Required
和Optional
都表示该参数是可以在配置中设置的参数。由于您没有为 tags
设置它们,SDK 拒绝在配置中设置 tags
的尝试。
Computed
表示提供者本身将决定该值。这可以单独使用,也可以与 Optional
结合使用。如果同时设置 Optional
和 Computed
那么这意味着当(且仅当)用户在配置中未设置它时,提供者将提供自己的值.
因为你的意图似乎是 tags
由用户在配置中设置,我认为这里的答案是将其标记为 Optional
:
"tags": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Optional: true,
},
上面的意思是可以在配置中设置,但用户不需要设置。如果用户未设置它,那么您的提供商代码会将其视为地图的内置默认占位符值,这是一个空地图。