问题
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
来源:https://stackoverflow.com/questions/22231281/rvm-nginx-passenger-in-chef