Ruby on rails 运行Chef';把刀从耙子上取下来

Ruby on rails 运行Chef';把刀从耙子上取下来,ruby-on-rails,rake,rvm,bundler,chef-infra,Ruby On Rails,Rake,Rvm,Bundler,Chef Infra,我有一个rails web应用程序,允许用户使用多台服务器运行自动化任务。我连接了一个rake任务,每5分钟运行一次(无论何时),检查需要执行的作业,并使用适当的选项启动服务器 我的问题是在实际运行厨师刀命令。我目前: sh %{bash -c -l 'cd ~/opscode/FTW && source ~/.rvm/scripts/rvm && rvm use system && knife rackspace server list'} do

我有一个rails web应用程序,允许用户使用多台服务器运行自动化任务。我连接了一个rake任务,每5分钟运行一次(无论何时),检查需要执行的作业,并使用适当的选项启动服务器

我的问题是在实际运行厨师刀命令。我目前:

sh %{bash -c -l 'cd ~/opscode/FTW && source ~/.rvm/scripts/rvm && rvm use system && knife rackspace server list'} do |ok, res|
  if ! ok
    puts "meh? (status = #{res.exitstatus})"
    puts res 
  end 
end
这让我走到了一半。它切换到适当的gemset(系统),没有任何问题,但在执行刀时,我得到以下信息:

Could not find multi_json-1.1.0 in any of the sources
Run `bundle install` to install missing gems.
我没有在系统gems中安装bundler。。。所以我很困惑。我的web应用程序需要multi-json-1.1.0。我安装的chef似乎需要multi_json 1.0.3,因此gem需求中似乎存在混淆

命令从bash运行没有问题。。。它只在刀片部分的耙上失效

有什么想法吗


编辑: 使用mpapis建议,我使用了RVM gem,在IRB中一切都很好。我做以下几点

RVM.use! 'system'
env = RVM.current
env.shell_wrapper.run_command("cd /my/path/to/opscode/FTW && knife rackspace server list")
然而,当在rails控制台或rake中运行相同的代码时,我遇到了问题。Rails控制台基本上忽略了我的RVM.use!rake爆炸了。。。这与捆绑机干扰有关吗

解决方案: mpapis构建了一个非凡的gem,允许您在特定的ruby版本中执行代码

RVM.with '1.8.7' do |r| 
  puts r.execute "unset RUBYOPT"
  puts r.execute "cd /home/hunter/opscode/FTW && knife rackspace server list"
  #puts r.execute "ruby --version"
end    
RVM.with '1.8.7' do |r| 
  puts r.execute "unset RUBYOPT"
  puts r.execute "cd /home/hunter/opscode/FTW && knife rackspace server list"
  #puts r.execute "ruby --version"
end    

您的问题是,您通过“sh”命令启动shell,bash将继承sh行为,并且rvm将无法正确来源


RVM从未支持sh,但在Fedora 16上启动X服务器出现问题后,我们不得不显式禁用它。

多json gem实际上是fog而不是Chef所需要的。刀架空间插件依赖于fog,它引入了multi_json gem

当前版本的fog(1.3.0)依赖于multi_json~>1.0,因此无法使用1.1.0激活gem


如果你打算用Rake来做这件事,我建议用gemset来做刀架空间的gems

解决方案:mpapis构建了一个非凡的gem,允许您在特定的ruby版本中执行代码

RVM.with '1.8.7' do |r| 
  puts r.execute "unset RUBYOPT"
  puts r.execute "cd /home/hunter/opscode/FTW && knife rackspace server list"
  #puts r.execute "ruby --version"
end    
RVM.with '1.8.7' do |r| 
  puts r.execute "unset RUBYOPT"
  puts r.execute "cd /home/hunter/opscode/FTW && knife rackspace server list"
  #puts r.execute "ruby --version"
end    

那我应该用什么?我尝试使用%x{}、system和``来执行该命令。当``和%x{}等价并给出:.rvm/gems/ruby-1.9.2时,系统给出了相同的错误-p290@global/gems/bundler-1.0.21/lib/bundler/spec_set.rb:88:“物化”:在任何源(bundler::GemNotFound)中都找不到多个json-1.1.0。是否无法通过rake执行rvm?这将是相当不幸的有宝石rvm ruby集成=>如果它缺少一些功能-你可以叉和添加它-或开放的问题,让其他人可以看看它以后感谢mpapis,这正是我需要的。这让我的生活轻松多了。我在IRB中使用了它,一切都很好,但在rails c或rake中使用它时,我遇到了问题。我将用细节更新这个问题,它似乎不是没有正确的依赖关系的问题。我已经有了一把可以很好地处理所有宝石的刀。这似乎是一个混淆了哪些依赖项是正确的问题。我倾向于认为这是一个rvm问题,因为mpapis指出rvm从未支持sh,这可能解释了这个问题