Search code examples
chef-infrachef-recipe

Chef data bag creation from a recipe


How to create a data bag from a recipe and avoid the exception when that data bag already exists?

The documentation shows that creating a data bag is done like this:

new_databag = Chef::DataBag.new
new_databag.name('unique_name')
new_databag.save

This works when the databag does not exist yet, but how to make it work if the databag already exists so it will not break the chef run?


Solution

  • Try using the list method of Chef::DataBag and check whether your databag's name is present:

    require 'chef/data_bag'
    
    unless Chef::DataBag.list.key?('unique_name')
      new_databag = Chef::DataBag.new
      new_databag.name('unique_name')
      new_databag.save
    end
    

    I use this to make my recipes more robust, or throw a more friendly error if an expected databag cannot be found on a Chef server.