捆绑由厨师安装的capistrano

时间:2013-11-27 13:48:24

标签: capistrano bundler provisioning rbenv

我正在使用厨师配置一个流浪盒,然后使用capistrano部署我的应用程序。

我的主厨装配件如下:

include_recipe "rbenv"

include_recipe "rbenv::ruby_build"

rbenv_ruby node[:rbenv][:ruby] do 
  global true
end

rbenv_gem "bundler" do
  ruby_version node[:rbenv][:ruby]
end

使用Riot rbenv cookbook

当我尝试使用带有capistrano的bundle时,我发现已执行的捆绑包是预装在包装盒上的捆绑包,而不是由厨师安装的捆绑包。

问题在于:

$ which bundle
/opt/rbenv/shims/bundle
$ sudo which bundle
/usr/bin/bundle
$ sudo su -
root# which bundle
/opt/rbenv/shims/bundle

基本上看起来Capistrano使用第二种形式运行命令,如果它使用/usr/bin/bundle

我试过跑:

$ sudo bundle
/usr/lib/ruby/vendor_ruby/bundler/rubygems_ext.rb:8:in `require': no such file to load -- rubygems (LoadError)
    from /usr/lib/ruby/vendor_ruby/bundler/rubygems_ext.rb:8
    from /usr/lib/ruby/vendor_ruby/bundler.rb:11:in `require'
    from /usr/lib/ruby/vendor_ruby/bundler.rb:11
    from /usr/bin/bundle:4:in `require'
    from /usr/bin/bundle:4

我获得了与Capistrano相同的异常。

如果我手动卸载bundler,那么这就是我获得的内容:

$ bundle
Bundler::GemfileNotFound
$ sudo bundle
sudo: bundle: command not found
$ sudo su - 
root# bundle
Bundler::GemfileNotFound

更新

我认为整个ruby版本不适用于sudoers:

$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
$ sudo ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
更麻烦的是。

你能帮帮我吗?

感谢。

2 个答案:

答案 0 :(得分:3)

问题不在于rbenv - 托管的Ruby不适用于sudoers。问题是默认使用系统Ruby,除非被其他东西覆盖 - 通常是.bashrc/etc/profile.d/*等。

由于capistrano不提供任何这些文件,因此它使用系统Ruby。

您应该通过添加以下内容告诉cap在系统之前使用rbenv bin路径:

set :default_environment, {
  'PATH' => "/opt/rbenv/shims:/opt/rbenv/bin:$PATH"
}

到您的deploy.rb文件。

更新

在Capistrano v3中,:default_environment已重命名为:default_env

答案 1 :(得分:0)

显然可以使用default_env调整,但不是首选方法。

as:

set :default_environment, {
    'PATH' => "/opt/rbenv/shims:/opt/rbenv/bin:$PATH"
}

不是由capistrano维护,甚至可能是危险的。

首选方法是查看要运行的程序以找到解决此问题的方法。

特别是我的问题:RVM需要在shell启动时初始化,任何RVM安装工具都会包含你的.bashrc,并在文件末尾调用正确的init脚本。同样在.bashrc的开头,有一个命令在非交互式shell上调用时退出脚本。

意外地,Capistrano在非交互式shell上运行脚本,因此当它调用RVM命令时,它们不会在非交互式shell中初始化。

我的解决方案是编辑chef中的.bashrc文件,以便在退出之前调用RVM init脚本。