如何用Python将Ansible Vault正确转储为指定格式的YAML?
解决Ansible Vault值转储YAML格式异常问题
问题根源在于你把!vault |和加密内容拼接成了普通字符串,PyYAML会将整个内容视为纯文本,因此自动添加引号并转义换行,而非识别为YAML自定义标签+块格式的标量值。
以下是两种可行的解决方案:
方案一:使用PyYAML自定义类型与代表器
通过创建自定义字符串类型,让PyYAML为其单独生成带!vault标签的块格式输出:
from ansible_vault import Vault import yaml # 定义自定义类型标记Vault加密内容 class VaultString(str): pass # 注册代表器,指定标签和块样式 def represent_vault_string(dumper, data): return dumper.represent_scalar('!vault', data, style='|') yaml.add_representer(VaultString, represent_vault_string) # 生成加密数据 vault = Vault('secretpassword') data = "secretvalue" encrypted_data = vault.dump(data) # 构造字典时使用自定义类型 hostvar_dict = { "a": "1", "secret_item": VaultString(encrypted_data), "b": "2" } # 转储YAML,确保块格式 print(yaml.dump(hostvar_dict, default_flow_style=False, allow_unicode=True))
方案二:使用ruamel.yaml(推荐,更简洁)
ruamel.yaml对YAML 1.2支持更完善,能更方便地处理标签和保留块格式:
首先安装依赖:
pip install ruamel.yaml
编写代码:
from ansible_vault import Vault from ruamel.yaml import YAML from ruamel.yaml.scalarstring import PreservedScalarString import sys yaml = YAML() yaml.default_flow_style = False # 生成加密数据 vault = Vault('secretpassword') data = "secretvalue" encrypted_data = vault.dump(data) # 将加密数据转为保留换行的标量,并添加!vault标签 preserved_data = PreservedScalarString(encrypted_data) preserved_data.yaml_set_tag('!vault') # 构造字典 hostvar_dict = { "a": "1", "secret_item": preserved_data, "b": "2" } # 输出YAML yaml.dump(hostvar_dict, sys.stdout)
两种方案都能输出你期望的格式:
a: '1' b: '2' secret_item: !vault | $ANSIBLE_VAULT;1.1;AES256 36353763313938663936303630306161393433633765353936656139363937373365376563623937 3762633462623434393036316264646535316233346166660a396634386439656437343162613365 34613661366163643333393163333335343632356330343939396133333665336566623037306432 3539366466353030310a313936376361366366316338636161303564346633373237363463373966 39353731323564393365633465303663373932613631353364626437633561643134
内容的提问来源于stack exchange,提问作者Erik Venema
相关产品推荐
相关产品推荐

