RVM + Nginx + Passenger in Chef

2019-06-08 05:33发布

问题:

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