使用 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"
}
我现在尝试了一切,但无法让这个简单的东西起作用。
我得到以下 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"
}