RVM Ruby安装在引导节点上打破Chef-Client

时间:2016-11-30 20:35:54

标签: ruby chef rvm rhel

我有一个红帽企业Linux服务器版本6.7节点,我已用CHEF引导。我在这个节点上成功执行了多个烹饪书/食谱。现在我需要设置此节点来运行Ruby On Rails应用程序。

我有一本食谱,食谱成功::

  1. 安装RVM
  2. 安装Ruby v2.2
  3. 问题

    在RVM安装Ruby之后,引导节点上的CHEF-Client不再有效。无论我尝试运行什么Cookbook / Recipe,我都得到以下输出::

    PS C:\Users\JW031544\workspace\CHEF\chef-repo> knife ssh dh2vrtooldev01 "chef-client -o recipe[MY_COOKBOOK::default]" --manual-list --ssh-user MY_USER --ssh-password "MY_PASS"
    
    dh2vrtooldev01 Ignoring executable-hooks-1.3.2 because its extensions are not built.  Try: gem pristine executable-hooks --version 1.3.2
    dh2vrtooldev01 Ignoring gem-wrappers-1.2.7 because its extensions are not built.  Try: gem pristine gem-wrappers --version 1.2.7
    dh2vrtooldev01 Ignoring nokogiri-1.6.8.1 because its extensions are not built.  Try: gem pristine nokogiri --version 1.6.8.1
    dh2vrtooldev01 /opt/chef/embedded/lib/ruby/site_ruby/2.3.0/rubygems/dependency.rb:308:in `to_specs': Could not find 'addressable' (= 2.4.0) among 45 total gem(s) (Gem::MissingSpecError)
    dh2vrtooldev01 Checked in 'GEM_PATH=/usr/local/rvm/gems/ruby-2.2.4:/usr/local/rvm/gems/ruby-2.2.4@global', execute `gem env` for more information
    dh2vrtooldev01  from /opt/chef/embedded/lib/ruby/site_ruby/2.3.0/rubygems/dependency.rb:320:in `to_spec'
    dh2vrtooldev01  from /opt/chef/embedded/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_gem.rb:65:in `gem'
    dh2vrtooldev01  from /usr/bin/chef-client:4:in `<main>'
    

    如果我进入节点并告诉RVM删除该版本的Ruby,那么CHEF-Client将再次开始工作。

    问题

    有没有人知道为什么一旦RVM安装了Ruby版本,CHEF-Client会突然忘记如何运行?

    源代码

    (default.rb)

    include_recipe 'abl_rails::rvm_install'
    include_recipe 'abl_rails::ruby_install'
    

    (rvm_install.rb)

    # Install RVM (if it doesn't already exist)
    execute 'install_rvm' do
      cwd '/root/'
      command 'curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -; curl -L get.rvm.io | bash -s stable'
      not_if {::File.exists?('/etc/profile.d/rvm.sh')}
    end
    

    (ruby_install.rb)

    # Install Ruby
    bash 'install_ruby' do
      cwd '/root/'
       code <<-EOH
        source /etc/profile.d/rvm.sh;
        rvm install #{node['ruby_version']};
      EOH
      not_if "source /etc/profile.d/rvm.sh; ruby --version | grep #{node['ruby_version']}", :cwd => '/root'
      notifies :run, "bash[set_default_rvm_ruby]", :immediately
    end
    
    # Set the default Ruby version in RVM
    bash "set_default_rvm_ruby" do
      cwd '/root'
      code <<-EOH
        source /etc/profile.d/rvm.sh;
        rvm use #{node['ruby_version']} --default;
      EOH
      action :run
    end
    

2 个答案:

答案 0 :(得分:2)

rvm使用自定义函数覆盖cd内部函数,这会导致错误。尝试删除rvm并使用其他ruby管理器,例如rbenv

查看此博客文章,了解rvmrbenv之间的其他差异:http://jonathan-jackson.net/rvm-and-rbenv

我会说实话,我之前遇到过同样的问题(但不是主厨),请多阅读一下rvm并确定它不适合我。我确信必须有一种让rvm很好玩的方法,但我认为这不值得努力。

答案 1 :(得分:0)

这可以在chef-client 12.17.x中修复,以便chef-client正确地脱离RVM环境:

相关厨师错误:

https://github.com/chef/appbundler/pull/24

https://github.com/chef/chef/issues/5589

如果在12.17.x之后(当/ opt / chef / bin / chef-client appbundler binstub中存在::Gem.clear_paths时)它仍然被破坏,则应该针对appbundler削减新问题。

(作为RVM用户,我不建议使用它来运行生产服务,但我发现在开发工作站的环境中使用它非常好 - 但是YMMV)。