2017-08-04 170 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