1

This is tricky as I'm using about 500 things, but I have a Vagrant box which is set up to handle what equates to 10 nodes (different servers). It's one box which locally does everything, then I split it up to different servers in production and staging.

Currently I cannot get graylog2 to use rbenv via the Chef setup. I have rbenv installed, I have bundle install running using the rbenv shims and the gems are all installed. But, the actual running application is erroring like this:

Passenger error about bundler

The chef recipe looks like this:

# Install required APT packages
package "build-essential"
package "postfix"

include_recipe "rbenv::default"
include_recipe "rbenv::ruby_build"

use_ruby_version = "1.9.3-p327"
rbenv_ruby use_ruby_version

# Install gem dependencies
%w{ bundler rake }.each do |g|
  rbenv_gem "#{g}" do
    ruby_version "#{use_ruby_version}"
  end
end

# Create the release directory
directory "#{node.graylog2.basedir}/rel" do
  mode 0755
  recursive true
end

# Download the desired version of Graylog2 web interface from GitHub
remote_file "download_web_interface" do
  path "#{node.graylog2.basedir}/rel/graylog2-web-interface-#{node.graylog2.web_interface.version}.tar.gz"
  source "https://github.com/downloads/Graylog2/graylog2-web-interface/graylog2-web-interface-#{node.graylog2.web_interface.version}.tar.gz"
  action :create_if_missing
end

# Unpack the desired version of Graylog2 web interface
execute "tar zxf graylog2-web-interface-#{node.graylog2.web_interface.version}.tar.gz" do
  cwd "#{node.graylog2.basedir}/rel"
  creates "#{node.graylog2.basedir}/rel/graylog2-web-interface-#{node.graylog2.web_interface.version}/build_date"
  action :nothing
  subscribes :run, resources(:remote_file => "download_web_interface"), :immediately
end

# Link to the desired Graylog2 web interface version
link "#{node.graylog2.basedir}/web" do
  to "#{node.graylog2.basedir}/rel/graylog2-web-interface-#{node.graylog2.web_interface.version}"
end

# Perform bundle install on the newly-installed Graylog2 web interface version
bash "bundle install" do
  cwd "#{node.graylog2.basedir}/web"
  code "rbenv local #{use_ruby_version} && source /etc/profile.d/rbenv.sh && bundle install"
  subscribes :run, resources(:link => "#{node.graylog2.basedir}/web"), :immediately
end

# Create mongoid.yml
template "#{node.graylog2.basedir}/web/config/mongoid.yml" do
  mode 0644
end

# Create general.yml
template "#{node.graylog2.basedir}/web/config/general.yml" do
  owner "nobody"
  group "nogroup"
  mode 0644
end

# Chown the Graylog2 directory to nobody/nogroup to allow web servers to serve it
execute "sudo chown -R nobody:nogroup graylog2-web-interface-#{node.graylog2.web_interface.version}" do
  cwd "#{node.graylog2.basedir}/rel"
  not_if do
    File.stat("#{node.graylog2.basedir}/rel/graylog2-web-interface-#{node.graylog2.web_interface.version}").uid == 65534
  end
  action :nothing
  subscribes :run, resources(:bash => "bundle install"), :immediately
end

# Stream message rake tasks
cron "Graylog2 send stream alarms" do
  minute node[:graylog2][:stream_alarms_cron_minute]
  action node[:graylog2][:send_stream_alarms] ? :create : :delete
  command "cd #{node[:graylog2][:basedir]}/web && RAILS_ENV=production bundle exec rake streamalarms:send"
end

cron "Graylog2 send stream subscriptions" do
  minute node[:graylog2][:stream_subscriptions_cron_minute]
  action node[:graylog2][:send_stream_subscriptions] ? :create : :delete
  command "cd #{node[:graylog2][:basedir]}/web && RAILS_ENV=production bundle exec rake subscriptions:send"
end

This is mostly the same as the original with the difference that it uses rbenv local in the bash "bundle install" chef resource.

So... if it's intalled, and running... how the heck do I make Rails know about said gems when it runs? Is that even the problem in the screenshot? What is happening and how do I fix it?

stormdrain
  • 7,915
  • 4
  • 37
  • 76
Phil Sturgeon
  • 30,637
  • 12
  • 78
  • 117

2 Answers2

2

It's likely that the way you're starting Graylog2 doesn't properly invoke rbenv first. The easiest way to do that, as per the rbenv wiki page, is to bundle install with binstubs. So I'd change your bundle install line to look more like:

bundle install --deployment --binstubs

You didn't include the command you use to start your server. (Are you using Apache? Unicorn?) If Unicorn or Thin or some other server you can easily start on demand, your problems are nearly solved. Simply start the app through the rbenv wrapper and it should execute with the proper rbenv:

/path/to/my/current/bin/unicorn

Veraticus
  • 15,944
  • 3
  • 41
  • 45
  • Thanks for the reply! This is done using Apache and Passenger, I don't actually have any idea how this is starting up but I'll investigate. When I do `$ which bundle` in `/var/graylog2/web` I get `/opt/rbenv/shims/bundle` so I figure the binstubs is not required? Or is it? I'm very green with rbenv. – Phil Sturgeon Jun 13 '13 at 15:12
0

I added the following:

LoadModule passenger_module /opt/rbenv/versions/<%= node[:graylog2][:ruby_version] %>/lib/ruby/gems/1.9.1/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
PassengerRoot /opt/rbenv/versions/<%= node[:graylog2][:ruby_version] %>/lib/ruby/gems/1.9.1/gems/passenger-4.0.5
PassengerDefaultRuby /opt/rbenv/versions/<%= node[:graylog2][:ruby_version] %>/bin/ruby

I'm sending in a pull request to the graylog2 cookbook which will take care of all of this soon, and hopefully it gets accepted.

Phil Sturgeon
  • 30,637
  • 12
  • 78
  • 117