Ansible - 当需要时动态提示保险库密码

6

背景

在我们公司中,我们有一个共享的仓库,包含了我们服务器的ansible脚本。我希望在不久的将来引入vault变量来处理服务密码。目前,我们在playbooks的开头使用加密的密码提示。这个解决方案非常繁琐(有些playbooks需要输入3次密码)。

需求

由于大部分ansible用户都不是专家,我希望他们能够顺利地运行playbooks。这意味着ansible-playbook命令应该简洁,并且不需要任何必填参数(例如不需要--ask-sudo-pass等)。同时,只有在需要的时候才会提示输入vault密码。

此外,我不想使用ansible密码文件,因为它难以共享,而且我不喜欢在所有ansible用户的计算机上都有一个明文密码文件的想法。

问题

对于每个相关的playbook都添加--ask-vault-pass选项并不可取。我们的ansible用户将无法理解为什么有时需要这个参数,有时不需要。相反,为每个playbook都要求vault密码是一种负担,因为我们有很多playbooks,每次都已经要求sudo密码。

我尝试使用prompts和各种选项来实现以下解决方案。但是似乎没有任何可行的方法。文档也没有说明如何做到这一点:

最佳解决方案(在我看来)

让我们看看这个main.yml文件:

- import_tasks: foo.yml
  tags: always

- import_tasks: bar.yml
  tags: bar

# Only this tasks uses a vault encrypted variable
- import_tasks: baz.yml
  tags: [baz, vault]

现在有一个名为`playbook.yml`的文件,导入了`main.yml`文件。
理想情况下,我希望发生以下情况:
示例1:
ansible-playbook -i prod playbook.yml

Vault password:

范例2:

ansible-playbook -i prod playbook.yml --tags baz

Vault password:

例子3:

ansible-playbook -i prod playbook.yml --tags foo

# it runs without asking for vault password, because no tasks needing vault
# password will be run

问题

如何配置ansible,使其仅在需要时(即每次遇到保险库加密变量时)才要求输入vault密码?这是否可能?如果不可能,鉴于我的情况,有哪些解决方法可行?

谢谢。

1个回答

5
我找到了一个解决方法。
思路是始终从 ansible 保险库文件中加载所有密码(包括 sudo),每个 playbook 只需要保险库密码即可。这意味着所有机器都应该有相同的部署用户密码。比以前更简单,因为只有一个主密码(保险库密码)来控制它们全部。
具体操作如下:
ansible.cfg 文件:
[privilege_escalation]
become_ask_pass = False
become = True

[defaults]
ask_vault_pass = True

vars/vault/env:

_vault:
  sudo: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        BLAHBLAHBLAH
  another_pass: !vault |
                $ANSIBLE_VAULT;1.1;AES256
                ANOTHERENCRYPTEDPASSWORD

对于每个playbook:

# Playbook stuff
# [...]

vars:
  ansible_become_pass: "{{ _vault.sudo }}"
vars_files:
  # env var is set dynamically in inventory file, so I can have different password per env.
  # If the file is not found, it loads an empty null file
  - [ "vars/vault/{{ env }}", "vars/null"]

# [...] Loading other var files

现在,只需要简单执行ansible-playbook -i env/prod myPlayBook.yml命令即可,它只会要求输入vault密码,而不需要sudo或其他任何提示。这样做既一致性强,又易于共享(只需共享加密的密码文件和vault密码即可)。


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