使用 Python 以编程方式编辑 Terraform 配置文件

问题描述 投票:0回答:3

我正在尝试使用 Python 编辑 Terraform 配置文件。我正在使用 python hcl2 库解析 Terraform 文件(.tf),该库返回 python 字典。我想添加新的键/值对或更改字典中的某些值。直接写入文件并不是一个好的做法,因为返回的 python 字典不是 Hashicorp 配置语言格式。还可以有多个链接在一起的配置文件,例如变量.tf 等。我应该实现自己的序列化器,将 python 字典转换为 terraform 配置文件,还是有更简单的方法来实现?

python terraform hcl
3个回答
8
投票

python-hcl2
库实现了HCL语法的解析器,但它没有序列化器,并且它的API被设计为删除所有HCL细节并仅保留基本的Python数据结构,所以它看起来并不像保留足够的信息来彻底修改输入,而不会丢失注释、属性排序等细节。

在我撰写本文时,唯一明确支持就地更新现有配置文件的 HCL 实现是 Go 包

hclwrite
。它允许调用者加载任意 HCL 源,彻底修改其中的部分内容,然后重新序列化更新后的版本,仅对输入中未更改的部分进行少量空白规范化。

原则上,如果您不关心保留未更改的输入,则可以将

hclwrite
移植到 Python,或者从
python-hcl2
返回之类的字典实现序列化器,但这两个似乎都是一个重要的项目。

如果您决定这样做,需要仔细注意的一个部分是将字符串序列化为 HCL 语法,因为所需的转义与任何其他语言并不完全相同。您可能希望参考 escapeQuotedStringLit

 中的 
hclwrite 函数
 来查看要处理的所有情况,以便您可以在 Python 中实现兼容的逻辑。


3
投票
正如@mark-b提到的,

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

文件。


0
投票
我制作了一个简单的 python 包,用于从 python 字典写入 tfvars 字符串。

https://github.com/hohoonsong/pytfvars

© www.soinside.com 2019 - 2024. All rights reserved.