- From: Sean Escriva <
>
- To:
- Subject: [chef] Re: CHEF-154 and upcoming change to runit cookbook
- Date: Tue, 22 Jan 2013 23:14:12 -0800
Excellent news! Nice work to everyone involved.
On Tue, Jan 22, 2013 at 9:41 PM, Joshua Timberman
<
>
wrote:
>
Ohai Chefs,
>
>
TL;DR: runit_service as a definition will be replaced with runit_service
>
as a Chef resource/provider, under ticket CHEF-154. See, "Help with
>
Testing" below.
>
>
* http://tickets.opscode.com/browse/CHEF-154
>
>
I want to let everyone know about some important changes in Opscode's
>
runit cookbook. They will be backwards-incompatible with the current
>
version, and may require changes to cookbooks/recipes that currently use
>
the "runit_service" definition, and the pattern that it follows. Currently
>
this is all in a separate branch (CHEF-154), but once the README is
>
updated, will be merged into master and released, probably as a version
>
"1.0" of the cookbook.
>
>
# Red Hat Support
>
>
Before I talk about the runit_service resource, I want to give Paul
>
Graydon (Twirrim) a shout out for adding support for Red Hat platforms.
>
The default recipe will now use Ian Meyer's RPM spec for runit to build a
>
package and install it.
>
>
This is all tested under the test-kitchen support on CentOS 5.8 and 6.3
>
that is also added to the cookbook.
>
>
# Resource/Provider
>
>
The main change is that the definition is refactored into a regular Chef
>
resource/provider. As a result, the way runit_service works is going to be
>
slightly different, and you may need to change recipes to account for that.
>
>
In the current release of the cookbook, runit_service is a definition.
>
This means that during a Chef run, the definition is replaced by the
>
resources it contains. By default, this in a recipe:
>
>
runit_service "example-service"
>
>
Results in these resources in Chef's resource collection:
>
>
"execute[start-runsvdir]"
>
"execute[runit-hup-init]"
>
"package[runit]"
>
"directory[/etc/sv/example-service]"
>
"directory[/etc/sv/example-service/log]"
>
"directory[/etc/sv/example-service/log/main]"
>
"template[/etc/sv/example-service/log/run]"
>
"template[/etc/sv/example-service/run]"
>
"link[/etc/init.d/example-service]"
>
"link[/etc/service/example-service]"
>
"ruby_block[supervise_example-service_sleep]"
>
"service[example-service]"
>
>
>
Note that the first three (two executes and one package) are from
>
include_recipe "runit" that is in the definition. This is the first thing
>
to note, the "runit" recipe must be included before the runit_service
>
resource can be used.
>
>
With "runit_service" available as a resource, none of these resources will
>
be created. Only a single resource is created, the runit_service itself.
>
So this in a recipe:
>
>
runit_service "example-service"
>
>
Results in this resource in Chef's resource collection:
>
>
"runit_service[example-service]"
>
>
The effect of this is that resources notifying a service to restart/reload
>
must specify a runit_service. For example:
>
>
template "/etc/example/service.conf" do
>
notifies :restart, "runit_service[example-service]"
>
end
>
>
One of the benefits of runit now having a first class resource is for
>
notification purposes. Runit itself supports a wide variety of commands
>
that can be sent using the "sv" program, and the resource implements all
>
of them:
>
>
[:start, :stop, :enable, :disable, :restart,
>
:reload, :status, :once, :hup, :cont, :term,
>
:kill, :up, :down, :usr1, :usr2]
>
>
These will all be documented for the next release. They do pretty much
>
what you'd expect. The :enable action handles the things that the
>
runit_service definition did, and is the default action. For more
>
information see the `sv(8)` man page.
>
>
Next thing to note is that the resource will block on the enable action
>
until the named pipe supervise/ok exists in the service directory for the
>
service. Previously, we only waited up to 10 seconds, which lead to race
>
conditions that were hard to debug.
>
>
In the past, attempts to create services that could be controlled by
>
non-privileged users were made. These didn't always work correctly, and
>
none of them implemented non-privileged services according to the runit
>
documentation. The documentation says to create a runsvdir service for
>
that user, pointing to the desired service directory (in the run script).
>
>
% cat /etc/service/runsvdir-floyd
>
#!/bin/sh
>
exec 2>&1
>
exec chpst -ufloyd runsvdir /home/floyd/service
>
>
Presuming a user named floyd is created, this allows the user to create
>
any services they desire, and manage them. A full example of this can be
>
found in the runit_test cookbook that comes with the runit cookbook's
>
repository:
>
>
https://github.com/opscode-cookbooks/runit/blob/CHEF-154/test/kitchen/cookb
>
ooks/runit_test/recipes/service.rb
>
>
>
This will be documented for the cookbook release.
>
>
In the interest of clarity of their purpose, some parameters used in the
>
definition have new names in the resource. These aren't commonly specified
>
in our own cookbooks, but we don't know what users are doing out there, so
>
please be aware.
>
>
* directory -> sv_dir
>
* active_directory -> service_dir
>
* template_name -> use service_name (name attribute)
>
* nolog -> set "log" to false
>
* start_command -> unused (was previously in the "service" resource)
>
* stop_command -> unused (was previously in the "service" resource)
>
* restart_command -> unused (was previously in the "service" resource)
>
>
>
## Changes of Note
>
>
1. The "runit" recipe must be included before the runit_service resource
>
can be used.
>
2. runit_service definition created a "service" resource. This is now a
>
"runit_service" resource, for the purposes of notifications.
>
3. enable action blocks waiting for supervise/ok after the service symlink
>
is created.
>
4. Create user-controlled services per the runit documentation.
>
5. Some parameters in the definition have changed names in the resource.
>
>
# Spec Tests
>
>
This cookbook now includes "spec" tests, in the repository's
>
`test/spec/runit_service_spec.rb`. To run the tests on your system:
>
>
git clone git://github.com/opscode-cookbooks/runit.git
>
bundle install
>
bundle exec rake spec
>
>
# Test Kitchen
>
>
The cookbook is setup for Chef convergence, and post convergence
>
minitest-handler tests.
>
>
git clone git://github.com/opscode-cookbooks/runit.git
>
bundle install
>
bundle exec kitchen test
>
>
The "service" configuration will set up a number of runit_service
>
resources to:
>
>
>
1. Test various use cases.
>
2. Serve as examples that you can use.
>
>
# Help With Testing
>
>
We could use help testing the runit_service resource. If you're using
>
runit_service (the definition) in your own cookbooks and have a test
>
environment, please take the CHEF-154 branch for a spin. If you're using
>
Librarian, add to your Cheffile:
>
>
cookbook 'runit',
>
:git => 'git://github.com/opscode-cookbooks/runit',
>
:ref => "CHEF-154"
>
>
>
If you're using Berkshelf, add to your Berksfile:
>
>
cookbook "runit",
>
:github => "opscode-cookbooks/runit",
>
:branch => "CHEF-154"
>
>
>
If you're using a Chef Server, and use environments, set a constraint on
>
the runit cookbook, for example:
>
>
cookbook "runit", "<= 0.16.2"
>
>
Version 0.16.2 is the currently released version.
>
>
# Next Steps
>
>
I'm working to update the README to reflect the changes discussed here.
>
Once it is updated, a 1.0 version will be released.
>
>
Before that happens, the various Opscode cookbooks that use runit will
>
have their metadata updated so they don't get the new version until
>
they've been updated as required for the changes listed above. I've opened
>
COOK-2253 for tracking this.
>
>
Thanks!
>
>
--
>
Opscode, Inc
>
Joshua Timberman, Technical Community Manager
>
IRC, Skype, Twitter, Github: jtimberman
>
>
Archive powered by MHonArc 2.6.16.