如何在Python脚本中查看/解密Ansible保险库凭证文件?

slm*_*slm 8 python encryption ansible ansible-vault

我正在试图弄清楚如何为Python脚本提供以下功能,以便它可以:

  1. 导入Ansible Python模块
  2. 打开我定义ansible.cfg和读取的vault_password_file变量
  3. 读取vault_password_file并临时存储在Python变量中
  4. 解密引用的Ansible存储文件

通过谷歌找到了这个代码,但是当我尝试它时似乎没有用:

import ansible.utils

bar = dict()

bar = ansible.utils._load_vars_from_path("secrets.yml", results=bar, vault_password="password")

print bar
Run Code Online (Sandbox Code Playgroud)

抛出此错误:

$ python ansible-vault-ex.py
Traceback (most recent call last):
  File "ansible-vault-ex.py", line 5, in <module>
    bar = ansible.utils._load_vars_from_path("credentials.vault", results=bar, vault_password="password")
AttributeError: 'module' object has no attribute '_load_vars_from_path'
Run Code Online (Sandbox Code Playgroud)

当我调查这个时,我在任何Ansible相关文件中都没有看到这个函数的迹象,这让我相信这个方法不再适用于Ansible的一些新版本.

底线是我想从Python脚本导入Ansible库/模块的一些方法,以便我可以ansible-vault从Python 以编程方式与托管文件进行交互.

Kub*_*uba 8

考虑使用ansible-vault包

安装方式:

$ pip install ansible-vault
Run Code Online (Sandbox Code Playgroud)

然后就像这样简单:

from ansible_vault import Vault

vault = Vault('password')
print vault.load(open('/path/to/your/vault.yml').read())
Run Code Online (Sandbox Code Playgroud)

要直接使用ansible代码,请查看该包的来源.最简单的是:

Ansible <= 2.3

from ansible.parsing.vault import VaultLib

vault = VaultLib('password')
print vault.decrypt(open('/path/to/vault.yml').read())
Run Code Online (Sandbox Code Playgroud)

Ansible > = 2.4

from ansible.constants import DEFAULT_VAULT_ID_MATCH
from ansible.parsing.vault import VaultLib
from ansible.parsing.vault import VaultSecret

vault = VaultLib([(DEFAULT_VAULT_ID_MATCH, VaultSecret('password'))])
print vault.decrypt(open('/path/to/vault.yml').read())
Run Code Online (Sandbox Code Playgroud)

源代码的数量是相等的,但是包提供了两个Ansible版本的自动yaml解析+处理.


Chu*_*uck 3

扩展 Kuba 的答案,ansible-vault 是 VaultLib 的包装器。它可以很好地处理 Vaultlib Ansible 2.4 之前的版本以及 2.4 之后的版本。

ansible-vault load() 方法不仅会解密文件,还会解析文件并将内容作为字典返回。如果您想要不解析的内容,最简单的方法可能是使用以下内容扩展 ansible-vault:

from ansible_vault import Vault

class MyVault(Vault):
    def load_raw(self, stream):
        return self.vault.decrypt(stream)

    def dump_raw(self, text, stream=None):
        encrypted = self.vault.encrypt(text)
        if stream:
            stream.write(encrypted)
        else:
            return encrypted
Run Code Online (Sandbox Code Playgroud)