我有一个 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