[chef] Re: Can you specify which data bag items a recipe should use at runtime?


Chronological Thread 
  • From: AJ Christensen < >
  • To:
  • Subject: [chef] Re: Can you specify which data bag items a recipe should use at runtime?
  • Date: Thu, 26 Jan 2012 08:51:08 +1300

One might consider a cookbook attribute containing a list of
applications to deploy to a given node, such as:

mycookbook/attributes/default.rb:

default.mycookbook.deployment_targets = [ "default" ]

environments/staging.rb

default.mycookbook.deployment_targets = [ "acme" ]

... So on,

Then, in your recipe, either construct a search (not going to do this
off the top of my head) or #each through data-bags:


node.mycookbook.deployment_targets.each do |deployment_target|
search(:apps, "id:#{deployment_target}) do |app|
 web_app(app['id']) do

...

node.mycookbook.deployment_targets.each do |deployment_target|
  app = data_bag_item "apps", deployment_target
  web_app(app['id') do

...

Cheers,

AJ
On 26 January 2012 08:38, Brad Montgomery 
< >
 wrote:
> Hi,
>
> I'm new with chef, and I apologize if this is an overly simplistic
> question, but I can't seem to find the best way to approach this
> problem.
>
> I've got several clients (e.g. Acme, and Big Inc) for whom I've build
> web apps, and I'd like to use Chef to deploy these. I'm using Hosted
> Chef, and I've described each app in a data bag, but I'm not sure of
> the best route to configure a single client's app on a single node.
>
> Here's some background:
>
> Each client's app is described in a data bag item:
> - data_bags
> -- apps
> --- acme.json
> --- big_inc.json
>
> Each item looks something like this:
> {
>    "id": "acme",
>    "path":"/home/acme/app",
>    "server_name":"acme.example.com",
>    "enable": true
> }
>
> and
>
> {
>    "id": "big_inc",
>    "path":"/home/big_inc/app",
>    "server_name":"big_inc.example.com",
>    "enable": true
> }
>
>
> I've got a recipe (mycookbook::default) that looks something like this:
>
> search(:apps) do |app|
>
>  web_app(app['id']) do
>    docroot        app['path']
>    server_name    app['server_name']
>    template       "apache.conf.erb"
>    enable         app['enable']
>  end
>
> end
>
>
> And I create a new node using the rackspace plugin, like so:
> knife rackspace server create -N acme01 -S acme01 -r
> "recipe[mycookbook::default]" -I 112 -f 1
>
> This would install both apps (acme and big_inc) on the node.  What's
> the preferred method for specifying which app should be configured on
> a single node?
>
> Should I delete the data bag items from the Chef Server (in the above
> case, remove big_inc.json before creating the node)?
>
> Or should I write client-specific recipes that search for some
> distinguishing information in the data bag (e.g. I include the
> client's name as a key)? This seems like it would result in a lot of
> duplicate code.
>
> Or is there a better way to do this?
>
> Thanks in advance!
>
> - Brad



Archive powered by MHonArc 2.6.16.

§