Running chef-client as a service

Greetings,

I’ve bootstrapped chef clients through vpn as I planned earlier. Now
what is the best way to run chef-client automatically? I’ve read, chef
uses runit for managing services, but ubuntu-9.10 I’m testing on is
based on Upstart. Is there really a point in replacing upstart in favor
of runit?

What can be advised in my situation?

Best wishes,
Dmitry

Ohai!
The bootstrap recipe uses the node[:chef][:init_style] attribute to
determine which init system to use:

http://github.com/opscode/cookbooks/blob/master/chef/recipes/bootstrap_client.rb#L31-63

It looks like upstart isn't supported yet, so I'd recommend creating
your own post-bootstrap recipe to configure chef to run via upstart.

HTH,
Dan DeLeo

On Mon, May 31, 2010 at 4:31 AM, Dmitry V'yal akamaus@gmail.com wrote:

Greetings,

I've bootstrapped chef clients through vpn as I planned earlier. Now what is
the best way to run chef-client automatically? I've read, chef uses runit
for managing services, but ubuntu-9.10 I'm testing on is based on Upstart.
Is there really a point in replacing upstart in favor of runit?

What can be advised in my situation?

Best wishes,
Dmitry

Here is what I do for my debian package installs, one problem I have not fixed is it does not reload chef upstart when the values change ... new to upstart and a restart does not pickup the new vars so I have to figure it out later. Since I dont change it much I have not really cared.

Joshua

joshua-millers-macbook-pro:~ jmiller$ cat site-cookbooks/chef/recipes/client-deb.rb
case node[:platform]
when "ubuntu"
if node[:platform_version].to_f >= 9.10

template "/etc/init.d/chef-client" do
  source "chef-client-upstartjob.erb"
  owner "root"
  group "root"
  mode 0774
  backup 0
 not_if do File.symlink?("/etc/init.d/chef-server") end
end

service "chef-client" do
   provider Chef::Provider::Service::Upstart
   supports :restart => true, :reload => true
end


template "/etc/init/chef-client.conf" do
  source "upstart-chef-client.conf.erb"
  owner "root"
  group "root"
  mode 0644
  backup 0
  notifies :start, resources(:service => "chef-client")
  not_if do File.symlink?("/etc/init.d/chef-server") end
end

end

end

joshua-millers-macbook-pro:~ jmiller$ cat site-cookbooks/chef/templates/default/upstart-chef-client.conf.erb
start on runlevel [2345]

script
exec /usr/bin/env chef-client -c /etc/chef/client.rb -i <%= @node[:chef][:client_interval] %> -s <%= @node[:chef][:client_splay] %>
end script

Restart the process if it dies with a signal

or exit code not given by the 'normal exit' stanza.

respawn

Give up if restart occurs 10 times in 90 seconds.

respawn limit 10 90
joshua-millers-macbook-pro:~ jmiller$

Then I just jacked the upstart stuff init script:

joshua-millers-macbook-pro:~ jmiller$ cat site-cookbooks/chef/templates/default/chef-client-upstartjob.erb
#!/bin/sh -e

upstart-job

Symlink target for initscripts that have been converted to Upstart.

set -e

INITSCRIPT="$(basename "$0")"
JOB="${INITSCRIPT%.sh}"

if [ "$JOB" = "upstart-job" ]; then
if [ -z "$1" ]; then
echo "Usage: upstart-job JOB COMMAND" 1>&2
exit 1
fi

JOB="$1"
INITSCRIPT="$1"
shift

else
if [ -z "$1" ]; then
echo "Usage: $0 COMMAND" 1>&2
exit 1
fi
fi

COMMAND="$1"
shift

if [ -z "$DPKG_MAINTSCRIPT_PACKAGE" ]; then
ECHO=echo
else
ECHO=:
fi

$ECHO "Rather than invoking init scripts through /etc/init.d, use the service(8)"
$ECHO "utility, e.g. service $INITSCRIPT $COMMAND"

case $COMMAND in
status)
$ECHO
$ECHO "Since the script you are attempting to invoke has been converted to an"
$ECHO "Upstart job, you may also use the $COMMAND(8) utility, e.g. $COMMAND $JOB"
$COMMAND "$JOB"
;;
start|stop|restart)
$ECHO
$ECHO "Since the script you are attempting to invoke has been converted to an"
$ECHO "Upstart job, you may also use the $COMMAND(8) utility, e.g. $COMMAND $JOB"
PID=$(status "$JOB" 2>/dev/null | awk '/[0-9]$/ { print $NF }')
if [ -z "$PID" ] && [ "$COMMAND" = "stop" ]; then
exit 0
elif [ -n "$PID" ] && [ "$COMMAND" = "start" ]; then
exit 0
elif [ -z "$PID" ] && [ "$COMMAND" = "restart" ]; then
start "$JOB"
exit 0
fi
$COMMAND "$JOB"
;;
reload|force-reload)
$ECHO
$ECHO "Since the script you are attempting to invoke has been converted to an"
$ECHO "Upstart job, you may also use the $COMMAND(8) utility, e.g. $COMMAND $JOB"
reload "$JOB"
;;
*)
$ECHO
$ECHO "The script you are attempting to invoke has been converted to an Upstart" 1>&2
$ECHO "job, but $COMMAND is not supported for Upstart jobs." 1>&2
exit 1
esac
joshua-millers-macbook-pro:~ jmiller

On May 31, 2010, at 9:04 AM, Daniel DeLeo wrote:

Ohai!
The bootstrap recipe uses the node[:chef][:init_style] attribute to
determine which init system to use:

http://github.com/opscode/cookbooks/blob/master/chef/recipes/bootstrap_client.rb#L31-63

It looks like upstart isn't supported yet, so I'd recommend creating
your own post-bootstrap recipe to configure chef to run via upstart.

HTH,
Dan DeLeo

On Mon, May 31, 2010 at 4:31 AM, Dmitry V'yal akamaus@gmail.com wrote:

Greetings,

I've bootstrapped chef clients through vpn as I planned earlier. Now what is
the best way to run chef-client automatically? I've read, chef uses runit
for managing services, but ubuntu-9.10 I'm testing on is based on Upstart.
Is there really a point in replacing upstart in favor of runit?

What can be advised in my situation?

Best wishes,
Dmitry

On 05/31/2010 08:57 PM, Joshua Miller wrote:

Here is what I do for my debian package installs, one problem I have not fixed is it does not reload chef upstart when the values change ... new to upstart and a restart does not pickup the new vars so I have to figure it out later. Since I dont change it much I have not really cared.

thanks for sharing. I adopted your recipe, but turned the service into
the task run by cron. RAM is precious resource on VPS.
I couldn't find a proper way to calculate times for cron, though. Also I
think /etc/init.d/chef-client is not really necessary.

This what is have for now:

$ cat chef/recipes/client-deb.rb
case node[:platform]
when "ubuntu"
if node[:platform_version].to_f >= 9.10
service "chef-client" do
provider Chef::Provider::Service::Upstart
supports :restart => true, :reload => true
end

 template "/etc/init/chef-client.conf" do
   source "upstart-chef-client.conf.erb"
   owner "root"
   group "root"
   mode 0644
   backup 0
   notifies :start, resources(:service => "chef-client")
   not_if do File.symlink?("/etc/init.d/chef-server") end
 end

 cron "chef-client" do
   minute ((0..59).to_a.delete_if {|x| x % 

(@node[:chef][:client_interval].to_i / 60) != 0 }.join ",")
command "service chef-client start"
end
end
end

% cat chef/templates/default/upstart-chef-client.conf.erb
start on runlevel [2345]

task

script
exec /usr/bin/env chef-client -c /etc/chef/client.rb -s <%=
@node[:chef][:client_splay] %>
end script

Fwiw, I planned to investigate supporting upstart as an "init_style"
in the bootstrap recipe. The next version of Chef and accompanying
chef::bootstrap_* recipes will support init scripts that are pulled
from the installed gem.

On Jun 1, 2010, at 6:43 AM, Dmitry V'yal akamaus@gmail.com wrote:

On 05/31/2010 08:57 PM, Joshua Miller wrote:

Here is what I do for my debian package installs, one problem I
have not fixed is it does not reload chef upstart when the values
change ... new to upstart and a restart does not pickup the new
vars so I have to figure it out later. Since I dont change it much
I have not really cared.

thanks for sharing. I adopted your recipe, but turned the service
into the task run by cron. RAM is precious resource on VPS.
I couldn't find a proper way to calculate times for cron, though.
Also I think /etc/init.d/chef-client is not really necessary.

This what is have for now:

$ cat chef/recipes/client-deb.rb
case node[:platform]
when "ubuntu"
if node[:platform_version].to_f >= 9.10
service "chef-client" do
provider Chef::Provider::Service::Upstart
supports :restart => true, :reload => true
end

template "/etc/init/chef-client.conf" do
source "upstart-chef-client.conf.erb"
owner "root"
group "root"
mode 0644
backup 0
notifies :start, resources(:service => "chef-client")
not_if do File.symlink?("/etc/init.d/chef-server") end
end

cron "chef-client" do
minute ((0..59).to_a.delete_if {|x| x % (@node[:chef]
[:client_interval].to_i / 60) != 0 }.join ",")
command "service chef-client start"
end
end
end

% cat chef/templates/default/upstart-chef-client.conf.erb
start on runlevel [2345]

task

script
exec /usr/bin/env chef-client -c /etc/chef/client.rb -s <%=
@node[:chef][:client_splay] %>
end script

/etc/init.d/chef-client is there for any admin who is new to upstart, the simple script avoid them needing to know. In my office if something MUST be changed ASP and I can not be reached I just tell them stop chef drop me a email and we will fix it once I get back. Its just a matter of covering the incase I am out of touch.

On Jun 1, 2010, at 4:04 PM, Joshua Timberman wrote:

Fwiw, I planned to investigate supporting upstart as an "init_style" in the bootstrap recipe. The next version of Chef and accompanying chef::bootstrap_* recipes will support init scripts that are pulled from the installed gem.

On Jun 1, 2010, at 6:43 AM, Dmitry V'yal akamaus@gmail.com wrote:

On 05/31/2010 08:57 PM, Joshua Miller wrote:

Here is what I do for my debian package installs, one problem I have not fixed is it does not reload chef upstart when the values change ... new to upstart and a restart does not pickup the new vars so I have to figure it out later. Since I dont change it much I have not really cared.

thanks for sharing. I adopted your recipe, but turned the service into the task run by cron. RAM is precious resource on VPS.
I couldn't find a proper way to calculate times for cron, though. Also I think /etc/init.d/chef-client is not really necessary.

This what is have for now:

$ cat chef/recipes/client-deb.rb
case node[:platform]
when "ubuntu"
if node[:platform_version].to_f >= 9.10
service "chef-client" do
provider Chef::Provider::Service::Upstart
supports :restart => true, :reload => true
end

template "/etc/init/chef-client.conf" do
source "upstart-chef-client.conf.erb"
owner "root"
group "root"
mode 0644
backup 0
notifies :start, resources(:service => "chef-client")
not_if do File.symlink?("/etc/init.d/chef-server") end
end

cron "chef-client" do
minute ((0..59).to_a.delete_if {|x| x % (@node[:chef][:client_interval].to_i / 60) != 0 }.join ",")
command "service chef-client start"
end
end
end

% cat chef/templates/default/upstart-chef-client.conf.erb
start on runlevel [2345]

task

script
exec /usr/bin/env chef-client -c /etc/chef/client.rb -s <%= @node[:chef][:client_splay] %>
end script