2017-08-04 166 views
1

为了更好地理解terraform,我希望能够将HCL转换为等效的JSON。我得到了HCL解析器(https://github.com/hashicorp/hcl)来构建和运行测试,但我没有看到任何命令采取HCL文件并输出JSON。如何将HashiCorp配置语言转换为JSON?

有一个HCL的python实现,它包含一个将HCL转换为JSON的实用程序,但它有一些相当奇怪的/意外的行为,我想确认该行为来自HCL语言,并且不是特定的到python实现。例如

> cat foo.tf 
service { 
    key = "aaa" 
} 

service { 
    key = 0x10 
    foo = "bar" 
} 

> hcltool foo.tf 
{ 
    "service": [ 
     { 
      "foo": "bar", 
      "key": "aaa" 
     }, 
     { 
      "key": 16 
     } 
    ] 
} 
+0

你确定你的tf是正确的吗?我对hcl的语言规范不够熟悉,但我熟悉的aws提供程序在''like'类型“标识符”之前使用了两个单词{',例如'variable“ami”{' – RaGe

+0

我只是从HCL解组到Go结构,然后编组到Go结构到JSON。 –

+0

HCL没有定义规范,并且没有从HCL到JSON的直接转换。更复杂的是,Terraform要求HCL的AST结构表示不同的类型,所以有一些嵌套的结构根本无法用JSON来描述。由于这些含糊不清,没有一种工具可以将任意HCL转换为有效的JSON。见https://github.com/hashicorp/terraform/issues/9354。 – JimB

回答

1

有一个开源项目,你可以使用帮助,但是terraform hcl不是标准的,因为他们设计。这里解释一下:

https://github.com/kvz/json2hcl/issues/4#issuecomment-275513256

可悲的是,这种行为是由Hasicorp官方HCL库造成由于HCL格式歧义。因此,我们无法改善这种状况。我们在过去类似的讨论,如果你可能需要阅读更多关于这个话题,为什么这可能不会在将来被改变:

,你可以安装该工具相关回购:

https://github.com/kvz/json2hcl

下面是一个例子夹具/ infra.tf.json被转换为HCL:

$ json2hcl <fixtures/infra.tf.json> fixtures/infra.tf 

作为奖励,会话中的其他方式也经由所述-reverse FLA支持g:

$ json2hcl -reverse < fixtures/infra.tf 
+0

问题是将HCL转换为JSON,而不是JSON转换为HCL。 –

+2

如果你仔细阅读,我的答案已经提到,json2hcl提供了2路转换。 – BMW