在 Vagrant 盒子上安装后,在 PATH 中找不到 Ansible

kai*_*ser 0 apt vagrant ansible

问题

为了测试,我设置了一个非常简单的Vagrant文件。这只是为了测试如何使用Ansible。可悲的是,我被困在第 2 步,期间出现以下错误vagrant up --provision(我可以重复reload):

'ansible-playbook'在 PATH 变量中找不到 Vagrant 尝试运行的可执行文件。这是一个错误。请验证此软件已安装并在路径上。


到目前为止的调试工作

由于Ubuntu 14 “Trusty” 64bit box 没有安装Ansible,我添加了一个快速的 shell 脚本,在实际的Ansible playbook之前作为配置器运行。这是Vagrantfile

Vagrant.require_version ">= 1.7.0"

Vagrant.configure("2") do |config|

    config.vm.box = "ubuntu/trusty64"

    config.ssh.insert_key = false

    # Synced folders
    config.vm.synced_folder "./public", "/var/www",
        disabled: false

    # Install Ansible
    config.vm.provision :shell,
        path: "provisioners/shell/install-ansible.sh"

    # Run Ansible Playbooks
    config.vm.provision "ansible" do |ansible|
        ansible.verbose = "vvv"
        ansible.playbook = "provisioners/ansible/playbook.yml"
    end
end
Run Code Online (Sandbox Code Playgroud)

bash 脚本install-ansible.sh就像这样简单:

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get -y update
sudo apt-get install ansible
Run Code Online (Sandbox Code Playgroud)

为了确认ansible-playbookansible已安装,我vagrant ssh进入框并调用which ansible-playbookand which ansible。两者都可用:

$ which ansible
# /usr/bin/ansible
Run Code Online (Sandbox Code Playgroud)

看着dpkg -L ansible,我发现很多东西要在/etc/usr/bin。也python --version给了我Python 2.7.6,而需要的最低版本为2.4。

echo $PATH提供了以下默认的输出:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Run Code Online (Sandbox Code Playgroud)

我可以确认,用户是正确的:whoami导致vagrant错误之前执行的最后一个命令是:

PYTHONUNBUFFERED=1 
ANSIBLE_HOST_KEY_CHECKING=false 
ANSIBLE_FORCE_COLOR=true 
ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' 
ansible-playbook 
    --user=vagrant 
    --connection=ssh 
    --timeout=30 
    --limit='default' 
    --inventory-file=/Users/*****/projects/*****/.vagrant/provisioners/ansible/inventory 
        -vvv 
        provisioners/ansible/playbook.yml
Run Code Online (Sandbox Code Playgroud)

我在这里没有想法。

Hen*_*gel 6

我想你在这里有一个误解。无需在 Vagrant 盒子内安装 Ansible。Ansible 是无代理的。Ansible 使用 SSH(或其他协议)连接到其他主机。所以不需要在主机内部有 Ansible 可执行文件。

你只需要在运行 vagrant 的主机上安装 Ansible。

如果您想在 Vagrant 框内运行 Ansible(恕我直言,不是 Vagrant 和 Ansible 应该一起工作的方式),您还需要更改vm.provisionVagrant 文件的步骤。正如vm.provision "ansible"在您运行的主机上寻找 Ansible 可执行文件一样,vagrant您应该更改vm.provision "shell"并将ansible-playbook命令放入 shell 脚本中,该脚本应该在 Vagrant 框上查找 Ansible 可执行文件。