Vagrant 调用的 Ansible 不提示输入 vault 密码

Ansible called by Vagrant does not prompt for vault password

总结

我有一个 Vagrantfile 配置了一个带有 Ansible 的 Virtualbox 虚拟机。 Ansible 剧本包含一个 Ansible Vault 加密变量。我的问题是 Vagrant 配置不提示输入密码,尽管我通过了这样做的选项。

最小的完整示例

流浪文件:

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 upvagrant 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 时尝试了几个选项,但都没有帮助。

当使用 Vagrant 调用时,如何让 Ansible 提示输入密码?

版本

更新

这是 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,它以某种方式抑制了提示。

在 Ansible 2.4.0.0 中,当不存在 tty 时跳过 Vault 密码提示(即 --ask-vault-pass)(没有执行 getpass.getpass 函数)。

通过 Ansible 2.4.0.0 提示实现,Vagrant provisioner 集成不会收到交互式提示。

请注意 --ask-pass--ask-become-pass 实现没有改变(即没有跳过 getpass 函数的机制)并且仍然可以与 Vagrant 一起正常工作。

我计划将问题报告给 Ansible 项目的上游,但目前您可以通过降级到 Ansible 2.3(或使用 vault_password_file provisioner 选项来解决这个问题)。

参考文献: