![解决方案](https://linux22.com/image/49542/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.png)
我正在努力设置 Vagrant / Puppet 安装,以便新开发人员可以为我们的 Rails 项目提供一个干净的开发环境。
基本的 Vagrant 配置命令是:
config.vm.box = 'precise32'
config.vm.box_url = 'http://files.vagrantup.com/precise32.box'
总体而言,安装似乎进展顺利。我已经安装并运行了 RVM、Postgres 和 Ruby。
但是,每当我尝试使用以下命令安装“Heroku Toolbelt”时:
su -l vagrant -c 'wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh'
我遇到这个问题:
... Lots of Hits and downloads...
The following extra packages will be installed:
foreman heroku libruby1.9.1 ruby1.9.1
Suggested packages:
ruby1.9.1-examples ri1.9.1 graphviz ruby1.9.1-dev
The following NEW packages will be installed:
foreman heroku heroku-toolbelt libruby1.9.1 ruby1.9.1
0 upgraded, 5 newly installed, 0 to remove and 132 not upgraded.
Need to get 0 B/4,997 kB of archives.
After this operation, 13.1 MB of additional disk space will be used.
dpkg: warning: 'ldconfig' not found in PATH or not executable.
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable.
dpkg: error: 2 expected programs not found in PATH or not executable.
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
E: Sub-process /usr/bin/dpkg returned an error code (2)
(笔记)如果我在 vagrant ssh 之后手动运行命令,就会发生这种情况。此外,实际的 shell 配置在最初运行时会出现错误。
由于这是一个流浪盒子,很容易“流浪破坏”,然后重试,但我始终遇到同样的问题。
奇怪的是,我的 PATH 确实包含这些文件夹:
echo $PATH
/home/vagrant/.rvm/gems/ruby-1.9.3-p194/bin:/home/vagrant/.rvm/gems/ruby-1.9.3-p194@global/bin:/home/vagrant/.rvm/rubies/ruby-1.9.3-p194/bin:/home/vagrant/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/vagrant_ruby/bin
文件“ldconfig”位于 /sbin 中并且是可执行文件:
cd /sbin
ls -l l*
-rwxr-xr-x 1 root root 465 Apr 20 2012 ldconfig
与启动-停止-守护进程相同:
-rwxr-xr-x 1 root root 26752 Apr 12 2012 start-stop-daemon
所以,不确定它真正在抱怨什么......有什么建议吗? Vagrant 的一些权限问题?
答案1
因为您将 wget 通过管道传输到新的 shell,所以环境不会被保留。
为了证明这一点,请在你的 vagrant box 中尝试以下操作
root@lucid32:~# export PATH=$PATH:/foo
root@lucid32:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/vagrant_ruby/bin:/foo
现在以不同的用户身份运行相同的命令
root@lucid32:~# su -l vagrant -c 'echo $PATH'
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/opt/vagrant_ruby/bin
比较这两个命令的输出,您将看到子 shell 上没有保留环境。 (/foo 消失了)
要使环境持久化,请使用--preserve-environment
or-p
或-m
。所有 3 个都是等效的。
root@lucid32:~# export PATH=$PATH:/foo
root@lucid32:~# su --preserve-environment -l vagrant -c 'echo $PATH'
-su: /root/.bash_profile: Permission denied
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/vagrant_ruby/bin:/foo:/opt/vagrant_ruby/bin
不用担心权限被拒绝的错误,这是预期的
解决方案
解决方案1。
使用-p
,-m
或--preserve-environment
su --preserve-environment -l vagrant -c 'wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh'
在 lucid32 vagrant box (10.04) 上测试
解决方案2。
如果您的 puppet 清单在 heroku 脚本之前运行,只需通过 puppet 将 /sbin 添加到 vagrant 用户的路径中
使用以下命令测试 lucid32
root@lucid32:~# su --preserve-environment -l vagrant -c 'wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh'
-su: /root/.bash_profile: Permission denied
This script requires superuser access to install apt packages.
You will be prompted for your password by sudo.
--2013-08-20 07:40:13-- https://toolbelt.heroku.com/apt/release.key
....
root@lucid32:~# su vagrant -
vagrant@lucid32:/root$ heroku login
Enter your Heroku credentials.
Email: