使用 go 解析简单的 terraform 文件

parse simple terraform file using go

我现在尝试了一切,但无法让这个简单的东西起作用。

我得到以下 test_file.hcl:

variable "value" {
  test = "ok"
}

我想用下面的代码解析它:

package hcl

import (
    "github.com/hashicorp/hcl/v2/hclsimple"
)

type Config struct {
    Variable string `hcl:"test"`
}


func HclToStruct(path string) (*Config, error) {
    var config Config

    return &config, hclsimple.DecodeFile(path, nil, &config)
 

但我收到:

test_file.hcl:1,1-1: Missing required argument; The argument "test" is required, but no definition was found., and 1 other diagnostic(s)

我检查了使用相同库的其他项目,但我找不到我的错误..我只是不知道了。有人可以指导我正确的方向吗?

您在此处编写的 Go 结构类型与您要解析的文件的形状不对应。请注意,输入文件有一个 variable 块,里面有一个 test 参数,但是你写的 Go 类型只有 test 参数。出于这个原因,HCL 解析器期望在顶层找到一个只有 test 参数的文件,如下所示:

test = "ok"

要使用 hclsimple 解析这种类似 Terraform 的结构,您需要编写两种结构类型:一种表示包含 variable 块的顶级主体,另一种表示每个块的内容块。例如:

type Config struct {
  Variables []*Variable `hcl:"variable,block"`
}

type Variable struct {
  Test *string `hcl:"test"`
}

话虽如此,我会注意到 Terraform 语言使用了一些 hclsimple 不支持的 HCL 功能,或者至少不支持像这样的直接解码。例如,variable 块中的 type 参数是一种特殊的表达式,称为 类型约束 hclsimple 不直接支持它,并且所以解析它需要使用较低级别的 HCL API。 (这就是 Terraform 内部正在做的事情。)

感谢@Martin Atkins,我现在可以使用以下代码:

type Config struct {
    Variable []Variable `hcl:"variable,block"`
}

type Variable struct {
    Value string `hcl:"name,label"`
    Test string  `hcl:"test"`
}

有了它我可以解析一个 variables.tf 像:

variable "projectname" {
  default = "cicd-template"
}

variable "ansibleuser" {
  default = "centos"
}