[chef] Re: Resource groups


Chronological Thread 
  • From: Maxim Kulkin < >
  • To:
  • Subject: [chef] Re: Resource groups
  • Date: Tue, 8 Nov 2011 11:45:57 +0400

Yes, I'm also aware of ability to pass data through node attributes, but this 
approach seems too heavy weight to me. I was experimenting with it and here 
is another solution that I've found:

  service 'myservice' do
    action :nothing
  end

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

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

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

  service 'myservice' do
    action :restart
    only_if {
      resources(:template => ['/path/to/service/config1', 
'/path/to/service/config2']).any?(&:updated?)
    }
  end

Alternatively, you can collect resources into an array during their creation:

  myservice_configs = []
  myservice_configs << template('/path/to/service/config1') do
    ...
  end
  myservice_configs << template('/path/to/service/config2') do
    ...
  end

  service 'myservice' do
    action :restart
    only_if { myservice_configs.any?(&:updated?) }
  end

And here is my solution with resource groups that I've mentioned earlier. You 
can put it into some cookbook's "libraries/resource_group.rb" file:

  https://gist.github.com/1347238

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

> 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.

§