如何在 Ansible Tower 中使用现有的 Vault 文件?

如何在 Ansible Tower 中使用现有的 Vault 文件?

我想将之前在 Ansible(独立)中使用的现有库存(包括 group_vars 和 vault 文件)导入 Ansible Tower(3.2.0)。

但是,一旦 Vault 文件开始发挥作用,它似乎就不起作用了。一旦我设置了 Vault 密码文件凭证并使用源类型“源自项目”创建清单 - 我无法在“源详细信息”下选择 Vault 凭证。

凭证对话框截图

当我手动放入并保存源时 - 同步失败并出现以下错误:

 1.735 INFO     Updating inventory 10: TEST
    1.753 DEBUG    Using system install of ansible-inventory CLI: /usr/bin/ansible-inventory
    1.753 INFO     Reading Ansible inventory source: /var/lib/awx/projects/_6__ansible_master/inventories/test/hosts
    1.754 DEBUG    Using private credential data in '/tmp/awx_123_LXUj9p'.
    1.755 DEBUG    Using fresh temporary directory '/tmp/awx_proot_ZURWmR' for isolation.
    1.755 DEBUG    Running from `/var/lib/awx/projects/_6__ansible_master/inventories/test` working directory.
Traceback (most recent call last):
  File "/usr/bin/awx-manage", line 9, in <module>
    load_entry_point('awx==3.2.0', 'console_scripts', 'awx-manage')()
  File "/lib/python2.7/site-packages/awx/__init__.py", line 107, in manage
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 661, in handle
    return self.handle_noargs(**options)
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 1000, in handle_noargs
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 243, in load_inventory_source
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 179, in load
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 163, in command_to_json
RuntimeError: ansible-inventory failed (rc=4) with stdout:

stderr:
ERROR! Attempting to decrypt but no vault secrets found

我也尝试创建一个 ansible_vault 文件并将变量“vault_password_file”指向它 - 但这也不起作用(抱怨它找不到保险库密码文件)。

有人遇到过这种情况吗?

答案1

所以这看起来更像是一个实施问题。根据 RedHat 的说法,不建议将保险库文件与库存放在一起 - 因为这意味着每次运行库存同步时都会解密文件。

我现在解决这个问题的方法是在剧本中使用“vars_files”。它看起来像这样:

  # Secrets
  vars_files:
    - '../../secrets/{{ tower_env }}/vault.yml'

在 Tower 中,我传入 tower_env 变量,例如“dev”或“qa”,然后在剧本运行时解密相应的保险库文件 - 而不是在同步库存时。

答案2

您尝试做的两件事(至少目前)不受支持:

  • 在库存导入时解密您的机密
  • 用于ansible-vault加密整个文件,而不是变量

这里的术语有点差,但请参阅这些文档中的“单一加密变量”部分,我有时将这些称为内联变量。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html

Ansible 现在支持移动这些内联变量通过库存解析过程。这种格式同样不安全,底层是相同的算法。姓名加密变量将会暴露给有权访问你的源代码控制的人员(这可能是合理的),但你的值将被加密。

现在,使用该语法将值存储在或文件夹.yml下的变量文件中。您应该发现 Tower 内部的库存同步成功(无需使用任何保险库凭证),并且当您导航到组或主机时,您会看到变量的加密形式。group_vars/host_vars/

当您运行剧本(Tower 中的作业模板)时,请同时附加保险库凭证。这会将加密延迟到实际需要的运行时上下文。

库存文件结构示例:

https://github.com/AlanCoding/Ansible-inventory-file-examples/tree/master/vault/single_var_file

此外,正如另一条评论指出的那样,您可以将整个文件加密或内联加密变量放在剧本所在的源代码控制中的文件夹结构中,然后由 Ansible 获取并通过您附加到作业模板的保险库凭据解密。

答案3

好的 - 经过调查,我可以承认目前在 2.6.5 版本中没有办法做到这一点,原因如下:

  • 完全可以在 host_vars 或 group_vars 中的任意位置加密变量
  • 保险库密码仅通过以下方式获取:

-vault-password-file范围

——ask-vault-pass已被取代--vault-id=@prompt

按照代码所述从第 220 行开始

我们需要的是另一种提供保险库密码的可能性,例如通过组变量,但目前这是不可能的。

这意味着错误报告Github 上的问题尚未解决或被其他问题取代。恕我直言,所有其他线程都未能发现该问题。我将继续讨论这个 github 错误线程。

相关内容