解决方案

解决方案

我正在努力设置 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-environmentor-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:

相关内容