[chef] Re: Re: Re: Resource groups


Chronological Thread 
  • From: Dmitry Zamaruev < >
  • To: < >
  • Subject: [chef] Re: Re: Re: Resource groups
  • Date: Mon, 07 Nov 2011 20:29:17 +0200

I use following workaround:

ruby_block "service_changed" do
  block
    node["service_changed"] = true
    node.save
  end
end

ruby_block "service_restarted" do
  block
    node.delete("service_changed")
    node.save
  end
end

template "1" do
  notifies :create, "ruby_block[service_changed]", :immediately
end

template "2" do
  notifies :create, "ruby_block[service_changed]", :immediately
end

service "my_service" do
  action :restart
  only_if { node.attribute?("service_changed") }
  notifies :create, "ruby_block[service_restarted]"
end

As soon as control got to last service entry - it is restarted only if templates changed.
If there would be native approach in Chef - it would be very nice.

On Mon, 7 Nov 2011 22:18:30 +0400, Maxim Kulkin wrote:
As I said, other resources use that service, so it needs to be
configured immediately. If I make notifications delayed, the restart
will be after other recipes get executed and thus resources in those
other recipes won't be able to communicate with that service because
of it's misconfiguration.
Say, it's a web service and configuration files determine port and
credentials to communicate with that service. If those values will
change, but the service is not restarted, other recipes won't be able
to access it.

On Nov 7, 2011, at 22:01, Dmitry Zamaruev wrote:

Why not get rid of immediate suffix ?
In that case all :restart attempts will be grouped and service will be restarted only once. But not immediate, some where near to the end of recipe.

On Mon, 7 Nov 2011 21:58:11 +0400, Maxim Kulkin wrote:
Hi everybody,

I'm pretty new to Chef and would like assistance for the following problem.
I have a service and several configuration files for it. My other
recipes communicate with that service, so it should be configured and
ready to use before running them. I have following structure:

 service 'myservice' do
   action :nothing
 end

 template '/path/to/service/config1' do
   ...
notifies :restart, resources(:service => 'myservice'), :immediate
 end

 template '/path/to/service/config2' do
   ...
   notifies :restart, resource(:service => 'myservice'), :immediate
 end

 service 'myservice' do
   action [:start, :enable]
 end

So, I want that if any of two configs change, the service is
restarted not later than the second "service" resource. But in
configuration that shown above, if both configs change, the service
will be restarted two times.

How would you solve this "the Chef-way" ?

After reading through Chef sources I've developed following solution.
I have a special resource -- "resource_group":

 service 'myservice' do
   action :nothing
 end

 resource_group 'myservice_configs' do
   template '/path/to/service/config1' do
     ...
   end

   template '/path/to/service/config2' do
     ...
   end

   notifies :restart, resource(:service => 'myservice'), :immediate
 end

 service 'myservice' do
   action [:start, :enable]
 end

So, when it is defined, it records all resources (through
"method_missing" magic) that are created inside of it. The
resource_group resource itself is created after resources in it
(that's how Chef works). One resource_group's action triggers, it
checks embedded resources' #updated? method and if any resource was
updated, it set's it's own #updated_by_last_action to true (thus
triggering notifications).
What do you think about this solution? Maybe it could make it into Chef core?

Thanks,
Max





Archive powered by MHonArc 2.6.16.

§