You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14