从Rake运行Chef's Knife

时间:2012-03-26 20:00:16

标签: ruby-on-rails rake rvm bundler chef

我有一个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
这让我半途而废。它切换到适当的宝石集(系统)没有任何麻烦,但在执行刀我得到以下:

Could not find multi_json-1.1.0 in any of the sources
Run `bundle install` to install missing gems.

我没有在系统宝石中安装捆绑器......所以我很困惑。我的Web应用程序需要multi-json-1.1.0。我的厨师安装似乎需要multi_json 1.0.3所以宝石需求似乎有所混淆。

命令从bash运行没问题......它只能在刀具部分的rake中失败

有什么想法吗?


编辑: 使用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构建了一个非凡的宝石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    

3 个答案:

答案 0 :(得分:1)

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

RVM从不支持

,但在Fedora 16上启动X服务器出现问题后我们必须明确禁用它。

答案 1 :(得分:1)

解决方案:mpapis构建了一个惊人的宝石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    

答案 2 :(得分:0)

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

当前版本的雾(1.3.0)取决于multi_json~> 1.0,所以它无法使用1.1.0激活宝石。

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