0

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

我的麻烦在于实际运行厨师的刀命令。我目前这样做:

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 中安装捆绑程序......所以我很困惑。我的 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!并且耙子爆炸了...这与捆绑器干扰有关吗?

解决方案:mpapis 构建了一个惊人的 gem https://github.com/mpapis/rvm-with,它允许您在特定的 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    
4

3 回答 3

1

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

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

于 2012-03-26T21:32:01.167 回答
1

解决方案:mpapis 构建了一个惊人的 gem https://github.com/mpapis/rvm-with,它允许您在特定的 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    
于 2012-05-01T00:12:17.850 回答
0

雾实际上需要 multi_json gem,而不是 Chef。刀架空间插件依赖于雾,它带来了 multi_json gem。

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

如果您打算为此使用 Rake,我建议您使用 gemset 作为刀架空间宝石。

于 2012-03-27T06:46:28.623 回答