无法将 terraform Variables.tf 文件读入 may go 程序

Sup*_*erd 3 go terraform hcl

我正在尝试编写一个 go 程序,该程序读取地形variables.tf并填充结构以供以后操作。但是,我在尝试“解析”文件时遇到错误。我希望有人能告诉我我做错了什么:

代码:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"

    "github.com/hashicorp/hcl/v2"
    "github.com/hashicorp/hcl/v2/gohcl"
    "github.com/hashicorp/hcl/v2/hclsyntax"
)

type Config struct {
    Upstreams []*TfVariable `hcl:"variable,block"`
}

type TfVariable struct {
    Name string `hcl:",label"`
    // Default     string `hcl:"default,optional"`
    Type        string `hcl:"type"`
    Description string `hcl:"description,attr"`
    // validation block
    Sensitive bool `hcl:"sensitive,optional"`
}

func main() {
    readHCLFile("examples/string.tf")
}

// Exits program by sending error message to standard error and specified error code.
func abort(errorMessage string, exitcode int) {
    fmt.Fprintln(os.Stderr, errorMessage)
    os.Exit(exitcode)
}

func readHCLFile(filePath string) {
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("File contents: %s", content) // TODO: Remove me

    file, diags := hclsyntax.ParseConfig(content, filePath, hcl.Pos{Line: 1, Column: 1})
    if diags.HasErrors() {
        log.Fatal(fmt.Errorf("ParseConfig: %w", diags))
    }

    c := &Config{}
    diags = gohcl.DecodeBody(file.Body, nil, c)
    if diags.HasErrors() {
        log.Fatal(fmt.Errorf("DecodeBody: %w", diags))
    }

    fmt.Println(c) // TODO: Remove me
}
Run Code Online (Sandbox Code Playgroud)

错误

File contents: variable "image_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."
  sensitive   = false
}

variable "other_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."
  sensitive   = true
}
2021/03/13 19:55:49 DecodeBody: examples/string.tf:2,17-23: Variables not allowed; Variables may not be used here., and 3 other diagnostic(s)
exit status 1
Run Code Online (Sandbox Code Playgroud)

对于 hcl1 来说,堆栈驱动程序问题令人遗憾

我引用的博客文章。

m1k*_*ael 5

看起来这是库的一个错误/功能,因为一旦您更改string"string",例如,

variable "image_id" {
  type        = string
  ...
Run Code Online (Sandbox Code Playgroud)

variable "image_id" {
  type        = "string"
  ...
Run Code Online (Sandbox Code Playgroud)

gohcl.DecodeBody成功了。

- - 更新 - -

因此,他们确实在 Terraform 中使用这个包,但他们自定义解析配置,即他们不使用gohcl.DecodeBody. 他们还通过使用(与比较)来自定义处理 属性。正如您所假设的,他们确实使用 的自定义类型,但通过自定义解析,您不必这样做。typehcl.ExprAsKeyworddescriptiontype

下面是一个工作示例:

variable "image_id" {
  type        = string
  ...
Run Code Online (Sandbox Code Playgroud)

为了完整性添加example/string.tf

variable "image_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."
  sensitive   = false
}

variable "other_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."
  sensitive   = true
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ins 5

由于 Terraform 语言广泛使用需要使用低级 HCL API 进行自定义编程的各种 HCL 功能,因此 Terraform 团队维护了一个 Go 库terraform-config-inspect,它足以理解 Terraform 语言,可以提取有关顶级对象的静态元数据,包括变量。.tf它还涉及 Terraform 允许在任何文件中定义变量或与其他声明交错的事实.tf.json;把它们放进去variables.tf只是一个惯例。

例如:

mod, diags := tfconfig.LoadModule("examples")
if diags.HasErrors() {
    log.Fatalf(diags.Error())
}
for _, variable := range mod.Variables {
    fmt.Printf("%#v\n", variable)
}
Run Code Online (Sandbox Code Playgroud)

该库与TerraformRegistry用于生成有关模块输入变量的文档的代码相同,因此它支持 TerraformRegistry 所支持的所有 Terraform 语言版本(在撰写本文时,回到 Terraform v0.10 语言,因为这是第一个可以从注册表安装模块的版本)并支持 Terraform 语言的 HCL 本机语法和 JSON 表示形式。