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

2024-05-18 23:33:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图找出如何为Python脚本提供以下功能,以便它能够:

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

我找到了this code via google但当我尝试时它似乎不起作用:

import ansible.utils

bar = dict()

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

print bar

引发此错误:

$ 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'

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

总之,我想要一些从Python脚本导入Ansible库/模块的方法,这样我就可以通过Python编程与ansible-vault托管文件交互。


Tags: 模块文件pathfrom脚本barloadutils
3条回答

如果已在ansibe.cfg中配置了一个保险库密码文件,则可以按以下步骤将密码传递给保险库库库

导入:

from ansible import constants as C
from ansible.parsing.vault import VaultLib
from ansible.cli import CLI
from ansible.parsing.dataloader import DataLoader

然后,你可以打电话给:

loader = DataLoader()
vault_secret = CLI.setup_vault_secrets(
    loader=loader,
    vault_ids=C.DEFAULT_VAULT_IDENTITY_LIST
)
vault = VaultLib(vault_secret)
vault.decrypt(open('/path/to/vault.yml').read())

扩展Kuba的答案,ansible vault是VaultLib的包装器。它很好地处理了Vaultlib的pre-Ansible 2.4版本和post2.4版本。

ansible vault load()方法不仅可以解密文件,还可以对其进行解析,并将内容作为dict返回。如果您希望不进行解析就获得内容,则可能最简单的方法是使用以下内容扩展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

考虑使用ansible-vault package

安装方法:

$ pip install ansible-vault

然后就简单到:

from ansible_vault import Vault

vault = Vault('password')
print vault.load(open('/path/to/your/vault.yml').read())

要使用ansible代码,请直接查看该包的source。最简单的方法是:

Ansible<;=2.3

from ansible.parsing.vault import VaultLib

vault = VaultLib('password')
print vault.decrypt(open('/path/to/vault.yml').read())

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())

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

相关问题 更多 >

    热门问题