2012-03-26 122 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