我正在尝试编写一个 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 来说,堆栈驱动程序问题令人遗憾
我引用的博客文章。
看起来这是库的一个错误/功能,因为一旦您更改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)
由于 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 表示形式。
| 归档时间: |
|
| 查看次数: |
4118 次 |
| 最近记录: |