【发布时间】:2019-10-09 10:04:50
【问题描述】:
我有以下多机 Vagrant 设置:
Vagrant.configure(2) do |config|
config.vm.define "xfcevm" do |xfcevm|
xfcevm.vm.box = "generic/ubuntu1904"
xfcevm.vm.hostname = "xfcevm"
config.vm.provider "virtualbox" do |vb|
vb.name = "ubuntu-xfce"
end
end
config.vm.define "kdevm" do |kdevm|
kdevm.vm.box = "generic/arch"
kdevm.vm.hostname = "kdevm"
config.vm.provider "virtualbox" do |vb|
vb.name = "arch-kde"
end
end
## only Arch doesn't ship with Python installed
config.vm.provision "shell", inline: "which python || sudo pacman --noconfirm -S python"
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.memory = "2048"
vb.cpus = 1
vb.customize ["modifyvm", :id, "--vram", "32"]
end
config.vm.provision "ansible" do |ansible|
ansible.verbose = "v"
ansible.compatibility_mode = "2.0"
ansible.playbook = "setup.yml"
ansible.inventory_path = "hosts"
end
end
由于 Arch vagrant box 不包含 Python,所以我创建了一个内联 shell 提供命令,该命令应该测试 Python 的存在(which python),如果评估结果为 false,那么 pacman 安装Python 应该紧随其后。对于回显输出,不应评估第二部分,在终端中运行命令就是这种情况。
但是无论 Python 是否存在,shell 配置器都会评估 || 之后的部分。对于 Ubuntu,它会引发一个明显的错误:pacman 未安装:
$ vagrant up --provision
Bringing machine 'xfcevm' up with 'virtualbox' provider...
Bringing machine 'kdevm' up with 'virtualbox' provider...
==> xfcevm: Checking if box 'generic/ubuntu1904' version '1.9.34' is up to date...
==> xfcevm: Running provisioner: shell...
xfcevm: Running: inline script
xfcevm: sudo
xfcevm: :
xfcevm: pacman: command not found
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.
用一个简单的 if 语句代替 || 也是如此:
config.vm.provision "shell", inline: "if [ ! `which python` ]; then sudo pacman --noconfirm -S python; fi"
【问题讨论】:
-
我无法重现您的问题。此外,我在您的输出中没有看到
which为您的工具找到的路径。所以我强烈怀疑,根据您连接的用户,which没有找到您的 python 安装,导致您的第二个命令运行。 -
我已经弄清楚并提供了答案。等待您的时间!
标签: python ruby ansible vagrant virtualbox