被 Vagrant 调用的 Ansible 不提示输入保险库密码

6

摘要

我有一个使用Vagrantfile进行Virtualbox虚拟机和Ansible部署的过程。Ansible playbook包含了一个加密变量,使用了Ansible Vault。我的问题是,尽管我传递了相应的选项,但Vagrant部署并没有提示输入密码。

最小完整示例

Vagrantfile:

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox" do |vb|
        # Build a master VM for this box and clone it for individual VMs
        vb.linked_clone = true
    end
    config.vm.box = "bento/ubuntu-16.04"
    config.vm.hostname = "test-vm"

    config.vm.provision :ansible do |ansible|
        ansible.verbose = true
        ansible.playbook = "playbook.yml"
        ansible.ask_vault_pass = true
#       ansible.raw_arguments = --ask-vault-pass
#       ansible.raw_arguments = ["--vault-id", "@prompt"]
#       ansible.raw_arguments = ["--vault-id", "dev@prompt"]
    end
end

playbook.yml:

---
- name: Test
  hosts: all
  vars:
    foo: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          65306264626234353434613262613835353463346435343735396138336362643535656233393466
          6331393337353837653239616331373463313665396431390a313338333735346237363435323066
          66323435333331616639366536376639626636373038663233623861653363326431353764623665
          3663636162366437650a383435666537626564393866643461393739393434346439346530336364
          3639

  tasks:
    - name: print foo's value
      debug:
        msg: "foo -> {{ foo }}"

Ansible Vault的密码是abc

当我第一次执行Vagrantfile或后来执行vagrant provision时,没有看到输入密码的提示。相反,任务print foo's value会打印出(红色)消息:

fatal: [default]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}

我也尝试了在Vagrantfile中注释掉的替代方案,以使Ansible提示输入密码。 我可以在Vagrant打印的ansible-playbook调用中看到所有这些选项。

此外,我尝试了使用ansible-vault encrypt_string加密foo时的几个选项,但也没有帮助。

我该怎么做才能让Ansible在被Vagrant调用时提示输入密码?

版本

  • kubuntu 16.04
  • Vagrant 1.8.1和Vagrant 2.0.0
  • Ansible 2.4.0.0

更新

这是由Vagrant打印的Ansible调用:

PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --ask-vault-pass --limit="default" --inventory-file=/opt/vagrantVM/.vagrant/provisioners/ansible/inventory -v playbook.yml

如果我直接执行这个命令而不使用Vagrant,密码提示会按预期工作!因此必须是Vagrant,在某种程度上抑制了提示。

你能否将Vagrant升级到2.x版本,因为它对我来说运行良好。 - Arbab Nazar
@ArbabNazar 感谢您的建议。我已经升级到Vagrant 2.0.0,但它并没有改变行为。 - bjhend
1个回答

7
在 Ansible 2.4.0.0 中,当没有 tty 存在时(即没有执行 getpass.getpass 函数),会跳过 Vault 密码提示(即 --ask-vault-pass)。
使用 Ansible 2.4.0.0 提供的提示实现时,Vagrant provisioner 集成不会收到交互式提示。
请注意,--ask-pass 和 --ask-become-pass 实现没有改变(即没有跳过 getpass 函数的机制),并且与 Vagrant 仍然正常工作。
我计划向 Ansible 项目报告此问题,但目前您可以通过降级到 Ansible 2.3(或使用 vault_password_file provisioner 选项)来解决该问题。
参考文献:

1
感谢您的见解并澄清这不是我的错。对我来说,降级至少是一个可行的解决方法。然而,我希望这个问题能在最新的Ansible中得到解决,因为在开放实验室环境中我无法充分保护vault_password_file选项。 - bjhend

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