Ansible - 在需要时动态提示保管库密码

时间:2017-12-04 15:13:18

标签: ansible ansible-2.x

上下文

在我的公司,我们有一个共享存储库,其中包含我们服务器的ansible脚本。我想在不久的将来介绍保险库变量来处理服务密码。目前,我们在剧本开头使用加密密码提示。这个解决方案很烦人(它要求在一些剧本上提供3个密码)。

需要

由于我们的大多数安全用户都不是专家,我希望他们能够顺利地运行剧本。这意味着ansible-playbook命令应该很短并且没有任何强制参数(例如,没有--ask-sudo-pass和诸如此类的东西)。这也意味着我更喜欢仅在需要时才在剧本开头提示库密码。 此外,我不想使用ansible密码文件,因为它不容易共享,我不喜欢在我们所有的ansible用户计算机上都有一个明文密码文件。

问题

为每个相关的剧本添加--ask-vault-pass不是一种选择。我们的ansible用户不会理解为什么有时需要这个参数,为什么有时候不需要。相反,要求每个剧本的金库密码是一种负担,因为我们每次都会有很多剧本和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仅在需要时请求保管库密码(意思是:每次遇到保险库加密变量时)?它甚至可能吗?如果没有,根据我的情况,哪种解决办法是可行的?

感谢。

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。

我们的想法是始终从ansible vault文件中加载所有密码(包括sudo),只需要每个playbook的Vault密码。这意味着所有计算机都应具有相同的部署用户密码。这比以前更简单,因为只有一个主密码(保管库密码)来控制它们。

这就是它的完成方式:

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 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只会询问保管库密码,没有提示sudo或其他任何内容。它一致且易于共享(只有加密的密码文件和库密码必须共享)。