2012-03-26 121 views
0

我有一個rails web應用程序,允許用戶使用多個服務器運行自動化任務。我連接了一個rake任務,每5分鐘運行一次(每當gem時)並檢查需要執行的作業,並使用適當的選項啓動服務器。從Rake運行廚師刀

我的麻煩是在實際運行廚師刀的命令。我目前是這樣做的:

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,所以似乎在gem需求中混淆了。

從bash的命令運行沒有問題......它只是在刀部分

任何想法未能抽傭?


編輯:使用mpapis建議 我使用的RVM寶石,一切都在IRB的偉大工程。我做了以下

RVM.use! 'system' 
env = RVM.current 
env.shell_wrapper.run_command("cd /my/path/to/opscode/FTW && knife rackspace server list") 

但是,當在rails控制檯或從耙子運行相同的代碼我有問題。 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  

回答

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  
1

您的問題是,你開始通過「上海」命令的bash shell將繼承SH行爲和RVM將無法正確來源。

SH從未被RVM支持,但我們必須與啓動X服務器出現問題後明確禁用它在Fedora 16

+0

然後我該用什麼?我嘗試使用%x {},系統和''來執行命令。系統給出了相同的錯誤,而''和%x {}是等價的,並給出: .rvm/gems/ruby​​-1.9.2-p290 @ global/gems/bundler-1.0.21/lib/bundler/spec_set.rb: 88:在'materialize'中:在任何源代碼中找不到multi_json-1.1.0(Bundler :: GemNotFound) – 2012-03-27 03:22:42

+0

是不是可以通過rake執行rvm?這將是相當不幸的 – 2012-03-27 20:37:21

+0

有rvm-ruby integration => https://github.com/wayneeseguin/rvm-gem的gem,如果它缺少一些功能主義者 - 你可以分叉並添加它 - 或者打開問題以便其他人可以看看它後來 – mpapis 2012-03-27 23:26:16

0

的multi_json寶石實際上是由霧,不是廚師必需的。刀架空間插件取決於霧氣,這會引入multi_json寶石。

霧(1.3.0)的當前版本取決於multi_json〜> 1.0,所以它將無法使用1.1.0激活gem。

如果你使用Rake做這件事,我建議你使用gemset作爲刀架空間的寶石。

+0

它似乎不是沒有正確的依賴關係的問題。我已經擁有了所有正確的寶石,刀子很棒。這似乎是一個混合的依賴關係是正確的問題。由於mpapis指出rvm從不支持sh來解釋這個問題,所以我很想去考慮它的一個rvm問題 – 2012-03-27 20:20:22