Skip to main content

Accumulators

This is an advanced topic. You should have already written a Custom Resource and be familiar with:

Overview

An accumulator is a programming pattern that gathers multiple values together.

In the context of Custom Resources, the accumulator pattern collects a set of properties from Custom Resources, and then applies the collection to a resource.

The steps for setting up an accumulator pattern are:

  • Declare a resource
  • Edit the resource
  • Add both resources to the :root run_context
  • Delay the actions on the resources

Example Accumulator: Samba

Samba Linux tool systems for supporting sharing resources in a network with Windows systems. Samba uses a single file for configuration. To share more than one directory using this configuration file, you need to write multiple samba_share resources.

The accumulator pattern lets you split out each configuration section into its own resource.

samba_share 'first_share' do  comment 'exported share 1'  path '/srv/export'  guest_ok true  printable false  write_list ['test_user_1']  create_mask '0644'  directory_mask '0775'  options 'inherit permissions' => 'yes' end 
samba_share 'second_share' do  comment 'exported share 2'  path '/srv/export_2'  guest_ok false  printable false  write_list ['test_user_2']  create_mask '0644'  directory_mask '0775'  create_directory false end 

Example

The following example shows how to:

  • Setup the template resource
  • Set the action to :nothing
  • Set the delayed_action to :create.
  • Add the template resource to the root run context, which allows the samba_share resource to find it.
  • Use edit_resource to find the template
  • Use edit_resource to add new variables to the existing collection

Note: This uses the ||= Ruby method to add a new Hash if one doesn’t exist already.

# action for the samba_server custom resource action :create do  package 'samba'   # We need to force both the server template and the  # share templates into the root context to find each other  with_run_context :root do  template new_resource.config_file do  source 'smb.conf.erb'  owner 'root'  group 'root'  mode '0644'  cookbook 'samba'  variables(samba_options: new_resource.options)  action :nothing  delayed_action :create  end  end end   # action for the samba_share custom resource action :add do  with_run_context :root do  edit_resource(:template, new_resource.config_file) do |new_resource|  variables[:shares] ||= {}  variables[:shares][new_resource.share_name] ||= {}  variables[:shares][new_resource.share_name]['comment'] = new_resource.comment  variables[:shares][new_resource.share_name]['path'] = new_resource.path  end  end end 

Further Reading

Edit this page on GitHub

Thank you for your feedback!

×