Синтаксический анализатор из terraform в json и наоборот

#parsing #terraform #hcl

Вопрос:

У нас есть требование редактировать .tf файлы и предоставлять их обратно пользователю в одном из наших приложений. Язык нашего приложения-PHP, но мы можем использовать интерфейс командной строки для анализа файлов.

Подход, который мы применяем для выполнения этого требования, описан ниже:

Бери.файлы tf в качестве входных данных Анализируйте файлы .tf в формате JSON, чтобы приложение могло легко читать и редактировать JSON. Проанализируйте этот JSON обратно в файлы .tf и предоставьте его пользователю Теперь мы можем анализировать файлы .tf в JSON, используя эту замечательную библиотеку: https://github.com/alecthomas/hcl Но не удалось найти решение, которое может анализировать файлы JSON в .tf.

Мы попытались использовать приведенные ниже методы, но не достигли удовлетворения.

hclparse.NewParser().ParseJSONFile Этот метод возвращает hcl.File. Теперь мы не уверены, является ли hcl.Файл может быть преобразован в .tf эквивалентный код?

JsonParser.Разбор (JsonParser: github.com/hashicorp/hcl/json/parser) Мы получили эту ссылку от https://github.com/kvz/json2hcl. Да, мы знаем, что это работает только с HCL1, но попробовать не так уж плохо. Этот метод возвращает файл ast. Теперь мы не уверены, можно ли преобразовать файл ast в эквивалентный код .tf?

Для начальной разработки мы стараемся использовать самые простые outputs.tf файл, но наша цель состоит в том, чтобы редактировать гораздо более сложные и полноценные файлы terraform.

outputs.tf:

 output "virtual_machine_id" {
  value = azurerm_linux_virtual_machine.main.id
}

output "private_ip_address" {
  value = azurerm_network_interface.main.private_ip_address
}
 

выходы.json (из alecthomas/hcl с небольшими изменениями, удалено ${} из выражения):

 {
    "output": {
        "private_ip_address": [
            {
                "value": "azurerm_network_interface.main.private_ip_address"
            }
        ],
        "virtual_machine_id": [
            {
                "value": "azurerm_linux_virtual_machine.main.id"
            }
        ]
    }
}
 

Нам нужна помощь для достижения этой цели, поскольку мы новички в Голанге и не можем найти удовлетворительного решения.