【问题标题】:Run Chef's Knife from Rake从 Rake 运行厨师刀
【发布时间】:2012-04-10 08:32:32
【问题描述】:

我有一个允许用户使用多台服务器运行自动化任务的 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 运行没问题...它只是在刀部分的 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!并且 rake 炸毁了...这与捆绑程序的干扰有关吗?

解决方案: 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    

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 那我应该用什么?我尝试使用 %x{}、system 和 `` 来执行命令。系统给出了相同的错误,而 `` 和 %x{} 是等效的并给出:.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/spec_set.rb:88 :in `materialize': 在任何源中都找不到 multi_json-1.1.0 (Bundler::GemNotFound)
    • 不能通过rake执行rvm吗?那将是相当不幸的
    • 有用于 rvm-ruby 集成的 gem => github.com/wayneeseguin/rvm-gem 如果它缺少一些功能主义者 - 你可以分叉并添加它 - 或者打开问题以便其他人稍后可以查看它跨度>
    • 感谢 mpapis,这正是我所需要的。它让我的生活轻松多了。我在 IRB 中使用它并且一切正常,但是在 rails c 或 rake 中使用它时我遇到了问题。我将在那里更新问题的详细信息
    【解决方案2】:

    multi_json gem 实际上是fog 所需要的,而不是Chef。 knife-rackspace 插件依赖fog,它引入了multi_json gem。

    fog的当前版本(1.3.0)依赖multi_json ~> 1.0,所以无法使用1.1.0激活gem。

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

    【讨论】:

    • 这似乎不是没有正确依赖关系的问题。我已经有一把刀,可以很好地搭配所有合适的宝石。这似乎是一个混合了哪些依赖项是正确的问题。我很想认为这是一个 rvm 问题,因为 mpapis 指出 rvm 从不支持 sh 这可能解释了这个问题
    【解决方案3】:

    解决方案: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    
    

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多