我正在尝试使用 Python 编辑 Terraform 配置文件。我正在使用 python hcl2 库解析 Terraform 文件(.tf),该库返回 python 字典。我想添加新的键/值对或更改字典中的某些值。直接写入文件并不是一个好的做法,因为返回的 python 字典不是 Hashicorp 配置语言格式。还可以有多个链接在一起的配置文件,例如变量.tf 等。我应该实现自己的序列化器,将 python 字典转换为 terraform 配置文件,还是有更简单的方法来实现?
python-hcl2
库实现了HCL语法的解析器,但它没有序列化器,并且它的API被设计为删除所有HCL细节并仅保留基本的Python数据结构,所以它看起来并不像保留足够的信息来彻底修改输入,而不会丢失注释、属性排序等细节。
在我撰写本文时,唯一明确支持就地更新现有配置文件的 HCL 实现是 Go 包
hclwrite
。它允许调用者加载任意 HCL 源,彻底修改其中的部分内容,然后重新序列化更新后的版本,仅对输入中未更改的部分进行少量空白规范化。
原则上,如果您不关心保留未更改的输入,则可以将
hclwrite
移植到 Python,或者从 python-hcl2
返回之类的字典实现序列化器,但这两个似乎都是一个重要的项目。
如果您决定这样做,需要仔细注意的一个部分是将字符串序列化为 HCL 语法,因为所需的转义与任何其他语言并不完全相同。您可能希望参考 escapeQuotedStringLit
中的
hclwrite
函数来查看要处理的所有情况,以便您可以在 Python 中实现兼容的逻辑。
Terraform支持json。因此,一旦您使用 python-hcl2 库导入了 hcl2 文件,您就可以在内部修改数据结构,然后使用 json.dump()
将其转储到具有
.tf.json
扩展名的文件中。我刚刚运行这个脚本,将我的
main.tf
从 GCS 后端更改为本地后端。
import hcl2
import json
with open('main.tf', 'r') as file:
dict = hcl2.load(file)
dict['terraform'][0]['backend'][0]= {
'local' : { 'path' : 'default.tfstate' }
}
with open('main.tf.json', 'w') as file:
json.dump(dict, file, indent=4)
运行后,删除main.tf
文件。