如何在hclwrite中用go-cty获取变量类型并生成Terraform变量文件
如何用hclwrite和go-cty生成带类型关键字的Terraform变量文件
你遇到的问题核心是:要输出的bool/string/number是Terraform的类型字面量(属于HCL标识符),而非cty库代表的实际值。之前用cty.SetValEmpty这类方法生成的是对应类型的空集合(比如空布尔数组),自然会得到不符合预期的结果。
解决方案
直接通过hclwrite构造类型关键字的标识符节点,而非依赖cty的值方法。如果需要结合cty类型动态映射,可以建立cty类型到Terraform类型关键字的映射表,再生成对应的标识符。
完整示例代码
package main import ( "os" "github.com/hashicorp/hcl/v2/hclwrite" "github.com/zclconf/go-cty/cty" ) func main() { // 初始化HCL文件 hclFile := hclwrite.NewFile() rootBody := hclFile.Body() // 创建variable块 varBlock := rootBody.AppendNewBlock("variable", []string{"test_var"}) varBody := varBlock.Body() // 建立cty类型与Terraform类型关键字的映射 typeMappings := map[cty.Type]string{ cty.Bool: "bool", cty.String: "string", cty.Number: "number", } // 为变量块添加属性,值为对应的类型关键字 varBody.SetAttributeRaw("val1", hclwrite.NewIdentToken(typeMappings[cty.Bool])) varBody.SetAttributeRaw("val2", hclwrite.NewIdentToken(typeMappings[cty.String])) varBody.SetAttributeRaw("val3", hclwrite.NewIdentToken(typeMappings[cty.Number])) // 输出生成的HCL内容 os.Stdout.Write(hclFile.Bytes()) }
代码说明
SetAttributeRaw:跳过cty值的自动转换,直接写入原始HCL节点,确保输出的是类型关键字而非值。hclwrite.NewIdentToken:生成HCL标识符节点,对应Terraform的类型关键字(如bool)。- 类型映射表:方便根据cty类型动态生成对应的Terraform类型关键字,后续可扩展支持复杂类型(如
list(bool)、map(string))。
运行这段代码后,会生成你预期的变量文件内容:
variable "test_var" { val1 = bool val2 = string val3 = number }
内容的提问来源于stack exchange,提问作者Mohammed Saaduddin Ansari
相关产品推荐
相关产品推荐

