I started using sprinkle with the passenger-stack recently. So far, it has been easy to get started with and fairly intuitive. I chose it rather than puppet or some of the other declarative server configuration DSL because it doesn’t need to install anything extra on the server to work.
This is great for the kinds of things I have been working on, because they are fairly small, and don’t need many servers.
I think if I were managing more things, I might choose puppet, because the overhead would be justified.
One of the things I like about sprinkle, is the DSL is pretty straight forward, eg the package definition for passenger looks like this:
package :passenger, :provides => :appserver do
description 'Phusion Passenger (mod_rails)'
version '2.1.3'
gem 'passenger' do
post :install, 'echo -en "\n\n\n\n" | sudo passenger-install-apache2-module'
# Create the passenger conf file
post :install, 'mkdir -p /etc/apache2/extras'
post :install, 'touch /etc/apache2/extras/passenger.conf'
post :install, 'echo "Include /etc/apache2/extras/passenger.conf"|sudo tee -a /etc/apache2/apache2.conf'
[%Q(LoadModule passenger_module /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-#{version}/ext/apache2/mod_passenger.so),
%Q(PassengerRoot /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-#{version}),
%q(PassengerRuby /usr/local/bin/ruby),
%q(RailsEnv production)].each do |line|
post :install, "echo '#{line}' |sudo tee -a /etc/apache2/extras/passenger.conf"
end
# Restart apache to note changes
post :install, '/etc/init.d/apache2 restart'
end
I had some problems, like the version of passenger in the passenger-stack master branch on github is a point release behind the phusion’s, which is annoying because when passenger updates itself to 2.2.0, the configs are not updated and apache tells you it can’t find the mod_passenger.so
file.
Also, it puts the passenger config in a slightly unusual place(/etc/apache/extras), for an apache module, as well as appending stuff to /etc/apache2/apache2.conf. This prevents it from idempotency, because if you run it twice, it will add additional lines to the config files. So, in the vein of scratching my own itch and what have you–you know, that open source thing–I rewrote it.
package :passenger, :provides => :appserver do
description 'Phusion Passenger (mod_rails)'
version '2.2.0'
gem 'passenger' do
post :install, 'echo -en "\n\n\n\n" | sudo passenger-install-apache2-module'
# Create the passenger conf file
loading = %Q(LoadModule passenger_module /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-#{version}/ext/apache2/mod_passenger.so)
conf = %Q(PassengerRoot /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-#{version}
PassengerRuby /usr/local/bin/ruby
RailsEnv production)
post :install, "echo '#{conf}' >> /etc/apache2/mods-available/passenger.conf"
post :install, "echo '#{loading}' >> /etc/apache2/mods-available/passenger.load"
post :install, 'a2enmod passenger'
# Restart apache to note changes
post :install, '/etc/init.d/apache2 restart'
end
verify do
has_file "/etc/apache2/mods-enabled/passenger.load"
has_file "/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-#{version}/ext/apache2/mod_passenger.so"
has_directory "/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/passenger-#{version}"
end
requires :apache, :apache2_prefork_dev, :ruby_enterprise
end
Now, it takes advantage of the debian convention of keeping module loading and configuration files go in /etc/apache2/mods-available
that are symlinked into /etc/apache2/mods-enabled
by the a2enmod
utility. This is immediately obviously awesome to anyone who has contemplated the horror of trying to parse the apache main config to see if the stuff they want to add is already there and needs updating.
I also added some verifiers so that it won’t rerun if there were no errors. Pretty cool, no?