我正在尝试使用社区食谱nginx和fnichol的RVM在厨师的RVM上搭载Passenger。 一切都在Ubuntu上。
现在,我的问题是,如果我使用刀ec2引导机器,并尝试安装一切,它会失败。
大多数情况下,它运行良好,拿起RVM和Passenger很好,直到它意识到Passenger没有被编译的时候,试图用默认的ruby 1.9.1中的rake来做,并且失败。
如果我然后连接到机器并运行sudo chef-client
,那么所有东西都完美无瑕,并且我已经正确configuration了机器。 为什么不在第一次运行? 我在第一次运行时丢失了什么设置/path元素/环境variables?
我的配方非常简单:
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"
我的属性有点不那么如此:
# 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"]
有问题的部分:
*** 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)
导致上述的命令是:
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`
我发现了许多使用Passenger和RVMconfigurationNginx的指南,但都没有完成。 请帮忙
好吧,我要回答我自己的问题。
系统范围安装中的RVM会创建一个/etc/profile.d/rvm.sh
来设置PATH变量。 这个文件在第一次运行时没有加载,因此我的PATH变量不包含RVM文件夹。
我在配方中添加了以下内容:
ENV['PATH']="#{node['audioguide']['rvm_path']}:#{ENV['PATH']}"
并对属性文件:
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"
这样我的RVM路径即可使用。
顺便说一下,我将探讨使用ruby-build
来替代rvm
的可能性。 RVM是一个很好的工具,但应该保存在开发环境中,而不是生产服务器上。
编辑:我仍然有一些PATH问题,所以我后来用magic_shell_environment
取代ENV['PATH']
magic_shell_environment 'PATH' do value "#{node[cookbook_name]['rvm_path']}:#{ENV['PATH']}" end
整个食谱在这里