无法使用Python正确将Ansible vault转储为yaml

3

我有一个Python字典,其中包含Ansible保险库作为值。我似乎无法正确地将其转储到具有正确格式的yaml输出中。我正在使用ansible-vault软件包生成加密数据,如下所示:

from ansible_vault import Vault
import yaml

vault = Vault('secretpassword')
data = "secretvalue"

为了加密数据,我按照以下步骤进行:

password = (vault.dump(data))

生成正确的Ansible保险库

$ANSIBLE_VAULT;1.1;AES256
36323830636261313833333932326661613063663361656362626432303232636463643030396366
3132623365633138613862333034626261336638613233650a653765386332666537613231626537
37666461653439616564343133656263613134643235363539396435616461626338393338616365
3339383030373532310a366662386665326132373535393930663737383136363735646361383066
65623033343262643138633839666237643735366465373932316233373339643835

为了在保险库中使用它,我将以下内容追加到它:
password = "!vault |\n" + (vault.dump(data))

这样我就能够在host_var中使用它。然后我将它与一些其他值添加到字典中,最终我会通过yaml转储。

hostvar_dict = {
    "a": "1",
    "secret_item": password,
    "b": "2"
}

一切看起来都很好,直到我尝试将上述字典输出为yaml格式时出现了问题。

print(yaml.dump(hostvar_dict))

输出以下内容:

a: '1'
b: '2'
secret_item: '!vault |

  $ANSIBLE_VAULT;1.1;AES256

  36353763313938663936303630306161393433633765353936656139363937373365376563623937

  3762633462623434393036316264646535316233346166660a396634386439656437343162613365

  34613661366163643333393163333335343632356330343939396133333665336566623037306432

  3539366466353030310a313936376361366366316338636161303564346633373237363463373966

  39353731323564393365633465303663373932613631353364626437633561643134

  '

我查看了yaml.dump添加多余换行符的多行字符串中的答案,但是这些答案并没有给出正确的输出。我想要得到的是:

a: "1"
b: "2"
secret_item: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  36353763313938663936303630306161393433633765353936656139363937373365376563623937
  3762633462623434393036316264646535316233346166660a396634386439656437343162613365
  34613661366163643333393163333335343632356330343939396133333665336566623037306432
  3539366466353030310a313936376361366366316338636161303564346633373237363463373966
  39353731323564393365633465303663373932613631353364626437633561643134

我尝试使用yaml.dump的选项包括:default_style="|"default_flow_style=False

有没有办法以我想要的方式在yaml文件中正确转储ansible-vault值?

1个回答

5
您期望输出的YAML文档中的!vault是一个标签。标签以感叹号开头,如果您将以感叹号开头的字符串转储到YAML中,则需要将该字符串引用起来。
类似地,管道符(|)表示您想要一个字面风格的标量,并且在字符串中包含它,将无法实现这一点。
我不知道您是否可以使用PyYAML来完成此操作,但是使用ruamel.yaml,您可以执行以下操作:
import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()

secret = ruamel.yaml.comments.TaggedScalar("""\
$ANSIBLE_VAULT;1.1;AES256
36353763313938663936303630306161393433633765353936656139363937373365376563623937
3762633462623434393036316264646535316233346166660a396634386439656437343162613365
34613661366163643333393163333335343632356330343939396133333665336566623037306432
3539366466353030310a313936376361366366316338636161303564346633373237363463373966
39353731323564393365633465303663373932613631353364626437633561643134
""", style='|', tag='!vault')

data = dict(a=1, b=2, secret_item=secret)
yaml.dump(data, sys.stdout)

这将会给予:

a: 1
b: 2
secret_item: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  36353763313938663936303630306161393433633765353936656139363937373365376563623937
  3762633462623434393036316264646535316233346166660a396634386439656437343162613365
  34613661366163643333393163333335343632356330343939396133333665336566623037306432
  3539366466353030310a313936376361366366316338636161303564346633373237363463373966
  39353731323564393365633465303663373932613631353364626437633561643134

如前所述,如果可能的话,请尝试往返您期望的输出。一旦明确ruamel.yaml可以保留布局,请分析加载的数据。在这种情况下,您将看到键secret_item的值将是TaggedScalar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接