Published: Mon 02 January 2012
By rilindo
In Blog .
tags: chef freebsd ruby
Finally changed chef-client with an updated recipe to support FreeBSD.
Under the chef-repo/chef-client directory, I added the following files:
./templates/freebsd/rc.d/chef-client.erb
./templates/freebsd/rc.conf.d/chef.erb
And updated:
The locations corresponds to the directory location under the default
#{conf} directory, (which is apparently /etc) The templates are .erb
files that corresponds to the configuration files on the server.
chef-client.erb:
[ rilindo @ chef chef - client ] $ cat ./ templates / freebsd / rc . d / chef - client . erb
#!/bin/sh
# PROVIDE: chef
# REQUIRE: LOGIN
# KEYWORD: nojail shutdown
. / etc / rc . subr
name = "chef"
rcvar = ` set_rcvar `
stop_cmd = "chef_stop"
command = "/usr/local/bin/${name}-client"
command_args = "-i -s -d -L /var/log/chef/client.log -c /etc/chef/client.rb -P /var/run/chef.pid"
load_rc_config $ name
export rc_pid
chef_stop ()
{
pidfile = "/var/run/chef.pid"
rc_pid = ` cat $ { pidfile } `
kill $ rc_pid
}
run_rc_command "$1"
chef.erb
[ rilindo@chef chef-client ] $ cat . / templates / freebsd / rc . conf . d / chef
chef_enable = "YES"
With ERB, I could have easily have placeholders in the code so that it
can be populated with
node-specific information automatically. I did not do that in this case,
though. That is for another time.
Finally, I updated the service code from:
when "bsd"
log "You specified service style 'bsd'. You will need to set up your rc.local file."
log "Hint: chef-client -i #{node["chef_client"]["client_interval"]} -s #{node["chef_client"]["client_splay"]}"
else
log "Could not determine service init style, manual intervention required to start up the chef-client service."
end
to
when "bsd"
case node['platform']
when "freebsd"
directory "/etc/rc.conf.d" do
owner "root"
group "wheel"
mode "0644"
action :create
end
template "/etc/rc.d/chef-client" do
source "#{dist_dir}/rc.d/chef-client.erb"
owner "root"
group "wheel"
mode 0755
end
template "/etc/rc.conf.d/chef" do
source "#{dist_dir}/rc.conf.d/chef.erb"
mode 0644
notifies :start, "service[chef-client]", :delayed
end
service "chef-client" do
action [:start]
end
else
log "You specified service style 'bsd'. You will need to set up your rc.local file."
log "Hint: chef-client -i #{node["chef_client"]["client_interval"]} -s #{node["chef_client"]["client_splay"]}"
end
else
log "Could not determine service init style, manual intervention required to start up the chef-client service."
end
I am not sure if this is quite “rubyish”, but it works.
At that point, I uploaded the cookbook:
knife cookbook upload chef - client
Added the recipe to the freebsd node:
knife node run_list add freebsddev.monzell.com "recipe[chef-client]"
And ran chef-client. Thechef-client program sees the receipe and install
the files to the appropriate locations:
freebsddev # /usr/local/bin/chef-client
[ Sun , 01 Jan 2012 23 : 48 : 28 - 0500 ] INFO : *** Chef 0.10 . 8 ***
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Run List is [ recipe [ chef - client ]]
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Run List expands to [ chef - client ]
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Starting Chef Run for freebsddev . monzell . com
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Running start handlers
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Start handlers complete .
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Loading cookbooks [ chef - client ]
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / default . rb in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / delete_validation . rb in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 34 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / service . rb in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / config . rb in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Storing updated cookbooks / chef - client / attributes / default . rb in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Storing updated cookbooks / chef - client / metadata . json in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Storing updated cookbooks / chef - client / README . md in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Storing updated cookbooks / chef - client / metadata . rb in the cache .
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing directory [ / var / run ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing directory [ / var / chef / cache ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing directory [ / var / chef / backup ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing directory [ / var / log / chef ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing directory [ / etc / rc . conf . d ] action create ( chef - client :: service line 203 )
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing template [ / etc / rc . d / chef - client ] action create ( chef - client :: service line 209 )
[ Sun , 01 Jan 2012 23 : 48 : 35 - 0500 ] INFO : Processing template [ / etc / rc . conf . d / chef ] action create ( chef - client :: service line 216 )
[ Sun , 01 Jan 2012 23 : 48 : 36 - 0500 ] INFO : Processing service [ chef - client ] action start ( chef - client :: service line 222 )
[ Sun , 01 Jan 2012 23 : 48 : 36 - 0500 ] INFO : Chef Run complete in 2.340431224 seconds
[ Sun , 01 Jan 2012 23 : 48 : 36 - 0500 ] INFO : Running report handlers
[ Sun , 01 Jan 2012 23 : 48 : 36 - 0500 ] INFO : Report handlers complete
I am mostly done now. I just need to start it up with:
/etc/rc.d/chef-client start
I should be able to start automatically. However, getting it to start up
automatically upon installation has so far just returns me with:
freebsddev # /usr/local/bin/chef-client
[ Sun , 01 Jan 2012 23 : 46 : 26 - 0500 ] INFO : *** Chef 0.10 . 8 ***
[ Sun , 01 Jan 2012 23 : 46 : 32 - 0500 ] INFO : Run List is [ recipe [ chef - client ]]
[ Sun , 01 Jan 2012 23 : 46 : 32 - 0500 ] INFO : Run List expands to [ chef - client ]
[ Sun , 01 Jan 2012 23 : 46 : 32 - 0500 ] INFO : Starting Chef Run for freebsddev . monzell . com
[ Sun , 01 Jan 2012 23 : 46 : 32 - 0500 ] INFO : Running start handlers
[ Sun , 01 Jan 2012 23 : 46 : 32 - 0500 ] INFO : Start handlers complete .
[ Sun , 01 Jan 2012 23 : 46 : 32 - 0500 ] INFO : Loading cookbooks [ chef - client ]
[ Sun , 01 Jan 2012 23 : 46 : 33 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / default . rb in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 33 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / delete_validation . rb in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 33 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / service . rb in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 33 - 0500 ] INFO : Storing updated cookbooks / chef - client / recipes / config . rb in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 33 - 0500 ] INFO : Storing updated cookbooks / chef - client / attributes / default . rb in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 34 - 0500 ] INFO : Storing updated cookbooks / chef - client / metadata . json in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 34 - 0500 ] INFO : Storing updated cookbooks / chef - client / README . md in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Storing updated cookbooks / chef - client / metadata . rb in the cache .
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing directory [ / var / run ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing directory [ / var / chef / cache ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing directory [ / var / chef / backup ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing directory [ / var / log / chef ] action create ( chef - client :: service line 42 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing directory [ / etc / rc . conf . d ] action create ( chef - client :: service line 203 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing template [ / etc / rc . d / chef - client ] action create ( chef - client :: service line 209 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing template [ / etc / rc . conf . d / chef ] action create ( chef - client :: service line 216 )
[ Sun , 01 Jan 2012 23 : 46 : 35 - 0500 ] INFO : Processing service [ chef - client ] action restart ( chef - client :: service line 222 )
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] ERROR : service [ chef - client ] ( chef - client :: service line 222 ) has had an error
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] ERROR : service [ chef - client ] ( / var / chef / cache / cookbooks / chef - client / recipes / service . rb : 222 : in ` from_file ') had an error:
service [ chef - client ] ( chef - client :: service line 222 ) had an error : Chef :: Exceptions :: Exec : / etc / rc . d / chef - client stop returned 1 , expected 0
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / mixin / command . rb : 127 : in ` handle_command_failures '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / mixin / command . rb : 74 : in ` run_command '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / provider / service / init . rb : 45 : in ` stop_service '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / provider / service / init . rb : 55 : in ` restart_service '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / provider / service . rb : 78 : in ` action_restart '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource . rb : 440 : in ` run_action '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / runner . rb : 45 : in ` run_action '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / runner . rb : 81 : in ` block ( 2 levels ) in converge '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / runner . rb : 81 : in ` each '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / runner . rb : 81 : in ` block in converge '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection . rb : 94 : in ` block in execute_each_resource '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection / stepable_iterator . rb : 116 : in ` call '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection / stepable_iterator . rb : 116 : in ` call_iterator_block '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection / stepable_iterator . rb : 85 : in ` step '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection / stepable_iterator . rb : 104 : in ` iterate '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection / stepable_iterator . rb : 55 : in ` each_with_index '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / resource_collection . rb : 92 : in ` execute_each_resource '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / runner . rb : 76 : in ` converge '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / client . rb : 312 : in ` converge '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / client . rb : 160 : in ` run '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / application / client . rb : 239 : in ` block in run_application '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / application / client . rb : 229 : in ` loop '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / application / client . rb : 229 : in ` run_application '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / lib / chef / application . rb : 67 : in ` run '
/ usr / local / lib / ruby / gems / 1.9 / gems / chef - 0.10 . 8 / bin / chef - client : 26 : in ` '
/ usr / local / bin / chef - client : 19 : in ` load '
/ usr / local / bin / chef - client : 19 : in ` '
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] ERROR : Running exception handlers
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] FATAL : Saving node information to / var / chef / cache / failed - run - data . json
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] ERROR : Exception handlers complete
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] FATAL : Stacktrace dumped to / var / chef / cache / chef - stacktrace . out
[ Sun , 01 Jan 2012 23 : 46 : 36 - 0500 ] FATAL : Chef :: Exceptions :: Exec : service [ chef - client ] ( chef - client :: service line 222 ) had an error : Chef :: Exceptions :: Exec : / etc / rc . d / chef - client stop returned 1 , expected 0
Essentially, it couldn’t find the PID file in the expected location,
which is no surprise, as I had been running chef-client manually without
any arguments. Hopefully I can figure out a fix for that soon.