RVM + Nginx + Passenger in Chef

匿名 (未验证) 提交于 2019-12-03 09:14:57

问题:

I'm trying to setup Nginx with Passenger on RVM in Chef using community cookbook for nginx and fnichol's for RVM. Everything on ubuntu.

Now, my problem is that if I bootstrap the machine using knife ec2 and try to install everything in one go, it fails.

For the most part it works well, picking up RVM and Passenger nicely, until the point when it realizes Passenger is not compiled, tries to do it using rake from default ruby 1.9.1 and fails.

If I then connect to the machine and run sudo chef-client, everything finishes beautifully and I have correctly configured machine. Why doesn't it work on the first run? What setting/path element/environment variable am I missing during the first run?

My recipe is very straightforward:

include_recipe "chef_gem" include_recipe "rvm::system" include_recipe "rvm::gem_package"  group "rvm" do   action :modify   members "ubuntu"   append true end  include_recipe "nginx::source" 

My attributes a little bit less so:

# rvm                                                                                                                                                                                                                                                                          normal['rvm']['rubies'] = ['2.1.0'] normal['rvm']['default_ruby'] = node['rvm']['rubies'].first normal['rvm']['user_default_ruby'] = node['rvm']['rubies'].first normal['rvm']['gems'][node['rvm']['default_ruby']] = [{name: "bundler"}, {name: "rake"}]  # nginx                                                                                                                                                                                                                                                                        normal['nginx']['version'] = '1.4.5' normal['nginx']['dir'] = '/etc/nginx' normal['nginx']['log_dir'] = '/var/log/nginx' normal['nginx']['binary'] = "/opt/nginx-#{node['nginx']['version']}/sbin" normal['nginx']['source']['sbin_path'] = "#{node['nginx']['binary']}/nginx" normal['nginx']['init_style'] = 'init' normal['nginx']['default_site_enabled'] = false normal['nginx']['source']['version'] = node['nginx']['version'] normal['nginx']['source']['modules'] = ["nginx::http_stub_status_module",                                         "nginx::http_ssl_module",                                         "nginx::http_gzip_static_module",                                         "nginx::passenger"] normal['nginx']['source']['prefix'] = "/opt/nginx-#{node['nginx']['source']['version']}" normal['nginx']['source']['default_configure_flags'] = ["--prefix=#{node['nginx']['source']['prefix']}",                                                         "--conf-path=#{node['nginx']['dir']}/nginx.conf",                                                         "--sbin-path=#{node['nginx']['source']['sbin_path']}"] normal['nginx']['source']['url'] = "http://nginx.org/download/nginx-#{node['nginx']['source']['version']}.tar.gz"  # passenger                                                                                                                                                                                                                                                                    normal['nginx']['passenger']['version'] = '4.0.37' normal['nginx']['passenger']['ruby'] = "#{node['rvm']['root_path']}/wrappers/ruby-#{node['rvm']['default_ruby']}/ruby" normal['nginx']['passenger']['gem_binary'] = "#{node['rvm']['root_path']}/wrappers/ruby-#{node['rvm']['default_ruby']}/gem" normal['nginx']['passenger']['root'] = "#{node['rvm']['root_path']}/gems/ruby-#{node['rvm']['default_ruby']}/gems/passenger-#{node['nginx']['passenger']['version']}" normal['nginx']['configure_flags'] = ["--add-module=#{node['rvm']['root_path']}/gems/ruby-#{node['rvm']['default_ruby']}/gems/passenger-#{node['nginx']['passenger']['version']}/ext/nginx"] 

Problematic part:

*** The Phusion Passenger support files are not yet compiled. Compiling them for you... *** *** Running 'rake nginx CACHING=false' in /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37/ext/nginx... *** STDERR: /usr/lib/ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find rake (>= 0) amongst [] (Gem::LoadError)     from /usr/lib/ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'     from /usr/lib/ruby/1.9.1/rubygems.rb:1231:in `gem'     from /opt/chef/embedded/bin/rake:22:in `<main>' ---- End output of "bash"  "/tmp/chef-script20140306-1255-1fqdatt" ---- Ran "bash"  "/tmp/chef-script20140306-1255-1fqdatt" returned 1 [2014-03-06T11:42:13+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) 

The command that leads to the above is:

cd nginx-1.4.5 && ./configure --prefix=/opt/nginx-1.4.5 --conf-path=/etc/nginx/nginx.conf --sbin-path=/opt/nginx-1.4.5/sbin/nginx --add-module=/usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37/ext/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module && make && make install` 

I've found many guides to configuring Nginx with Passenger and RVM, none of them complete. Please help

回答1:

Ok, so I'm going to answer my own question.

RVM in system-wide installation creates a file /etc/profile.d/rvm.sh that sets up (among others) PATH variable. This file is not loaded during the first run and as a result my PATH variable doesn't include RVM folders.

I added the following to the recipe:

ENV['PATH']="#{node['audioguide']['rvm_path']}:#{ENV['PATH']}" 

And to attributes file:

default['audioguide']['rvm_path'] = "#{node['rvm']['root_path']}/gems/ruby-#{node['rvm']['default_ruby']}/bin:#{node['rvm']['root_path']}/gems/ruby-#{node['rvm']['default_ruby']}@global/bin:#{node['rvm']['root_path']}/rubies/ruby-#{node['rvm']['default_ruby']}/bin" 

This way my RVM paths are available immediately for use.


Btw, I'm going to explore the possibility of using ruby-build in place of rvm for future deploys. RVM is a great tool but should probably be kept in development environments, not on production servers.


Edit: I still had some problems with PATH so I later replaced ENV['PATH'] with magic_shell_environment

magic_shell_environment 'PATH' do   value "#{node[cookbook_name]['rvm_path']}:#{ENV['PATH']}" end 

The whole recipe is here



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!