【问题标题】:This field cannot be set - Terraform custom provider无法设置此字段 - Terraform 自定义提供程序
【发布时间】:2022-01-16 22:35:46
【问题描述】:

我是为 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
}

我无法找到确切的错误。日志也不会在终端中打印。谁能帮忙解决这个问题?

提前致谢

【问题讨论】:

  • 这可能是一个红鲱鱼。 sensitive_map 未在您的架构中定义。尝试从配置中删除您的 sensitive_map 参数,看看是否可以解决错误。如果是这样,我可以写一个答案。

标签: terraform


【解决方案1】:

用于定义属性或嵌套块的schema.Schema 对象必须始终至少设置Required: trueOptional: trueComputed: true 之一。

RequiredOptional 都表示参数是可以在配置中设置的参数。由于您没有为tags 设置它们,因此SDK 拒绝在配置中设置tags

Computed 表示提供者本身将决定价值。这可以单独使用,也可以与Optional 结合使用。如果您同时设置了Optional Computed,则这意味着当(且仅当)用户在配置中未设置时,提供程序将提供自己的值。

由于您的意图似乎是让用户在配置中设置tags,我认为这里的答案是将其标记为Optional

            "tags": {
                Type: schema.TypeMap,
                Elem: &schema.Schema{
                    Type: schema.TypeString,
                },
                Optional: true,
            },

上面的意思是可以在配置中设置,但用户不需要设置。如果用户没有设置它,那么您的提供程序代码会将其视为地图的内置默认占位符值,这是一个空地图。

【讨论】:

  • 感谢您的回复。它按预期工作
猜你喜欢
  • 2021-03-14
  • 2020-07-08
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多